• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Пересчет полей документа после изменений в Embedded View

  • Автор темы Idea
  • Дата начала
I

Idea

Доброго времени суток!
Есть такая проблема:
В основной документ встроено представление, на котором отображаются документы, категоризованные 1) по родителю, 2) по автору. Соответственно пользователь видит на этом представлении только то, что относится к нему. Пользователь может из этой формы (через экшен бар представления) добавить документ, изменить или удалить. На вью есть колонка - сумма. Которая в обычном представлении делает подсчет по категориям, но естественно, что во встроенном представлении итоговой суммы мы не видим (single category). Для того, чтобы отобразить сумму по всем столбцу, использую форму уже на главной форме:
Код:
 @If(@IsNewDoc;@Return(0);"");
ar := @DbLookup("":"NoCache";@DbName;"PoT";@Text(@DocumentUniqueID);9);
@If( @IsError(ar); 0; @Sum(ar) )

Естественно, если что-то меняется, то его надо пересчитать. А теперь заковырка:
пользователь, редактирующий свои документы через вью совсем не обязательно обладает правами автора на головной документ (скорее всего он есть только в поле Reader), то есть не может он его редактировать. Как можно в этом случае отобразить актуальную сумму?
Попробовала агентом, но эффекта пока никакого. Код агента:
Код:
Dim session As NotesSession
Dim doc As NotesDocument

Set session= New NotesSession
Set doc=session.documentcontext

doc.HistText = "Added new TimeReport"

Call doc.ComputeWithForm(False, False)
Call doc.Save(True,False)
Сам агент вызывается по кнопке из встроенного представления:
Код:
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument

Set db = session.CurrentDatabase
Set uidoc = ws.CurrentDocument
Set doc = db.CreateDocument

doc.Form = "WorkWeek"
doc.Parentunid = uidoc.Document.UniversalID
doc.ProjectID = uidoc.Document.ProjectID
Call doc.MakeResponse( uidoc.Document )

Call doc.ComputeWithForm( False, False )

If ws.DialogBox("WorkWeek", True, True, True, False, False, False, "WorkWeek", doc, True, True) Then

Set agent = db.GetAgent("Recalculate")
Call agent.Run(uidoc.Document.NoteID)

End If
End Sub
 
S

Sandr

Call agent.Run(uidoc)

надо передавать noteID, а не uidic...
 
F

fedotxxl

Для: Idea
Код:
If ws.DialogBox("WorkWeek", True, True, True, False, False, False, "WorkWeek", doc, True, True) Then

Set agent = db.GetAgent("Recalculate")
Call agent.Run(uidoc)

End If
1. При открытии тоже такой код исполнять?
2. Call agent.Run(uidoc) - что-то новенькое...
3. Не Run тогда, а RunOnServer...
Потом как вы данные из back-end'a покажете в front-end'e?
У меня единственная мысля - CFD поле и после добавления респонса закрывать и заново открывать главный документ (как-то поле обновить нужно)
 
I

Idea

Да-да, конечно noteID.

Для fedotxxl :

1 - при открытии чего?
2 _
3. Сейчас попробую закрывать и открывать, только такая мелочь - информация на форме представлена в виде таблицы с закладками, а нужная закладка аж третья. Как запомнить последний вид, чтоб пользователь не заметил, что документ переоткрывался?
 
I

Idea

На данный момент есть такая проблема - код, который написан в условии
If ws.DialogBox ... вообще не выполняется.
 
S

Sandr

Вы пытаетесь через диалог записать в документ выбранные значения в диалоге - не выйдет... Пользователь ведь не имеет права изменять документ... Создавайте темповый док и пишите все в него.. Агентом потом его подгребаете и пишите из него все что Вам надо в свой док...
 
I

Idea

Вы пытаетесь через диалог записать в документ выбранные значения в диалоге - не выйдет... Пользователь ведь не имеет права изменять документ... Создавайте темповый док и пишите все в него.. Агентом потом его подгребаете и пишите из него все что Вам надо в свой док...

Мне в принципе не надо из диалога ничего переписывать, мне реально надо всего лишь обновить документ (computed for display - поле меня вполне устраивает). Проблема в том, что я не знаю, как после закрытия диалога заставить что-либо (просто код или агента) выполнить рефреш или релоад. Куда подвесить код, чтобы лотус понял, что нужно работать с головным документом (uidoc-то уже не катит)?
 
S

Sandr

Перепишите этот кусок вот так:

Код:
Call ws.DialogBox("WorkWeek", True, True, True, False, False, False, "WorkWeek", doc, True, True) Then

Set agent = db.GetAgent("Recalculate")
Call agent.RunOnServer(uidoc.Document.NoteID)
Условие там ни к чему..

А вот с переоткрытием документа ждействительно проблема, так как не понятно, когда отработает агент, перегружать то док нужно после отработки агента...
 
I

Idea

А вот с переоткрытием документа ждействительно проблема, так как не понятно, когда отработает агент, перегружать то док нужно после отработки агента...

Ну например агента или код перезагрузки можно на PostSave повесить формы диалогбоксовской, вот только какой код?
 
S

Sandr

Знаете... а можно ведь легко обойтись юез серверных агенов... Пишите все в какой-то темповый документ (или в профайл пользователя), и тащите оттуда данные лукапом в нужный вам документ... Так будет гораздо проще...
 
F

fedotxxl

Для: Sandr
Я так и предлагал. Можно вообще dblookup + summ и темповый документ не нужен... только вот как отобразить это не переоткрывая документ
Для: Idea
Как запомнить последний вид, чтоб пользователь не заметил, что документ переоткрывался?
Мне кажется, что никак... пытался с JS - не пашет что-то focus()
 
S

Sandr

Я так и предлагал. Можно вообще dblookup + summ и темповый документ не нужен... только вот как отобразить это не переоткрывая документ

@Command([ViewRefreshFields]) должен помочь...

Мне кажется, что никак... пытался с JS - не пашет что-то focus()

Именно никак... И жаваскрипт тут не причем... Есть стандартный способ переключений между закладками, но текущую закладку не получить никак...
 
F

fedotxxl

@Command([ViewRefreshFields]) должен помочь...
Recalculates the fields in the current document or updates the current view or folder.
Syntax
@Command( [ViewRefreshFields] )
Usage
A document must be open in Edit mode
Так что не пойдет
Есть стандартный способ переключений между закладками
Что за механизм?
 
S

Sandr

Так что не пойдет

Ну, значит @Command( [RefreshWindow] )

Что за механизм?

На последней закладке в свойстве таблицы задаем ID, на форму лепим поле с именем $IDтаблицы.
Каждой закладке даем совй айдишник...
Когда в то поле пишем айдишник како-то из закладок и рефрешим док, таблица переключается на закладку, чей айдишник мі записали в то поле...
 
S

serEJa Shabalin

@Command([ViewRefreshFields]) должен помочь...
Именно никак... И жаваскрипт тут не причем... Есть стандартный способ переключений между закладками, но текущую закладку не получить никак...

А почему нельзя получить текущую закладку
Ее имя храниться в поле $ID-таблицы
Можно на закрытие документа сохранить это имя в документе
А на открытие прописать в поле $ID-таблицы
 
F

fedotxxl

Для: Sandr
Возник вопрос просто для образования - как мне программно узнать, на какой я сейчас закладке (строке)?

Для: Sandr, Idea

Почему этот метод не пременим? После добавления нового респонса записываем в notes.ini, что мы нажали. Затем закрываем документ, открываем. А на QueryOpen чтение переменной из notes.ini, если не пустая, то записывем в поле $IDтаблицы id закладки, очищаем переменную в notes.ini
 
S

Sandr

А почему нельзя получить текущую закладку
Ее имя храниться в поле $ID-таблицы
Можно на закрытие документа сохранить это имя в документе
А на открытие прописать в поле $ID-таблицы

Если Вы туда пишете айди ячеки, то можно прочитать, сам лотус, почему-то, туда ничего не пишет... Можете проверить... Так что прочитать програмно, на какой закладке вы находитесь низя...
 
I

Idea

Провела эксперимент на @Command( [RefreshWindow]), просто повесила команду на кнопочку "Пересчитать" - ничего, и ошибок не выдает.
Так что остается проблема как именно переоткрыть.

Для fedotxxl
На счет неприменимости метода. Я просто не знаю, как что-то записывать в тот же notes.ini и считывать оттуда, а с $IDтаблицы и id закладки вообще какой-то темный лес.
 
I

Idea

Знаете... а можно ведь легко обойтись юез серверных агенов... Пишите все в какой-то темповый документ (или в профайл пользователя), и тащите оттуда данные лукапом в нужный вам документ... Так будет гораздо проще...

Вообще не понятно, зачем это нужно. я ещё понимаю данные о закладках таблицы для переоткрытия, а данные для поля и так лукапом собираются по встроенному вью, прям в формуле поля (CFD) и без всяких темпов.
А агентом хотелось "обмануть" обновление формы, правда не обманывается всё равно.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!