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

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

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

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

Пересчитать вычисляемые поля в другом документе

dimat

Well-known member
31.07.2008
508
0
BIT
0
Всем привет!
Ситуация следущая:
Открыт документ, после некоторых действий необходимо пересчитать вычисляемые поля в другом документе, который в свою очередь может быть:
а) Не открыт
б) Открыт для чтения
в) Открыт для редактирования

Подскажите как реализовать?
 
M

morpheus

документ "задача" + агент

если надо обновить данніе создаём докуент - задачку, и агент ( каждый 1- 5 минут ) как только увидет документ задачку сразу постараеться отработать, если вариант в) то просто попоробует(агент) опять черз 1- 5 минут
 
N

nvyush

Если речь о клиенте, для определения "открытости" документа можно воспользоваться NotesDocument.IsUIDocOpen
 
H

hosm

nvy странная это ф-ция, мне так и не удалось с ней подружиться (скорее это мои проблемы). Имхо, блокировки стандартные или самописные надежнее.
 
N

nvyush

Ещё одни вариант — на форме cfd-поле $IsDocBeingEdited с формулой @IsDocBeingEdited.
Проверка doc.GetItemValue("$IsDocBeingEdited")(0):
"" — документ закрыт
"0" — документ открыт на чтение
"1" — документ открыт на редактирование.
Грабли:
1) если документ открывался в предпросмотре, он остаётся открытым даже после закрытия предпросмотра, пока в предпросмотре не будет открыт другой документ (это интерфейсная проблема, doc.IsUIDocOpen ведёт себя также)
2) при открытии документа на редактирование поле не всегда (не сразу?) обновляется.
 
A

alik86

OKEN, блокировки стандартные так же полны странностей... :rolleyes:
 
N

nvyush

В догонку — предложенные мной варианты применимы для работы одного пользователя в одном клиенте LN. Определить "открытость" документа другим пользователем на другой машине таким образом не получится. Если нужно последнее — вариант от Morpheus или пляски с блокировками.
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
А собственно как пересчитать поля, имея объект NotesDocument?
 
N

nvyush

Есть doc.ComputeWithForm
Для открытых документов можно получить uidoc через notesUIWorkspace.EditDocument c newInstance=false и выполнить Refresh.
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
если надо обновить данніе создаём докуент - задачку, и агент ( каждый 1- 5 минут ) как только увидет документ задачку сразу постараеться отработать, если вариант в) то просто попоробует(агент) опять черз 1- 5 минут
т.е. если вариант в) то агент не сможет выполнить ComputeWithForm?
 
M

morpheus

dimat
не сможет, и не должен смочь )))

сможет после разблокирования
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Как описать общую переменную, которую можно использовать во всех событиях формы?
пример:
есть кнопка на форме, после нажатия которой значение общей переменной v становится "1",
в собыии postsave формы:
If v="1" then

//Какие то действия

End If
 
N

nvyush

Описываете переменную в разделе формы (Globals) (Declarations)

Например:
Public v As String

Только настоятельно не рекомендую называть глобальные переменные как v, i и т.п., хотя бы GlobalVariable, CurrentDocument, иначе потом легко запутаться "кто из ху".
 
M

morpheus

dimat
использовать глобальные переменные
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
В (Globals) (Declarations)
Public GlStatus as String

В (Globals) Initialize
GlStatus="0"

Действие по нажатию кнопки:
GlStatus="1"

Событие формы Postsave:
Print GlStatus //пишет 0

что не так сделал?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
стуация: открыт док, с ним "связан" другой, надо пересчитать другой после изменения в текущем

если изменения зафиксированы в бэкэннде и др. док надо пересчитать при открытии/обновлении...
можно записать ИД изменённого в очередь и при наступлении к-л события обновить с ним связанный
всё это в контексте одного инстанса (сервера или клиента)
 
N

nvyush

dimat
Код:
'(Globals)(Declarations)
Public GlStatus As String
Sub Initialize
GlStatus="0"
Print 	"Initialize GlStatus=" + GlStatus
End Sub
Sub Postsave(Source As Notesuidocument)
Print 	"PostSave GlStatus=" + GlStatus
End Sub
'Button
Sub Click(Source As Button)
GlStatus="1"
Dim ws As New NotesUIWorkspace
ws.CurrentDocument.Save
End Sub
После создания документа в строке состояния:
Initialize GlStatus=0
После сохранения в строке состояния:
PostSave GlStatus=1

Проверяйте, что у Вас не так
 
Мы в соцсетях:

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