• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

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

dimat

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

Подскажите как реализовать?
 
документ "задача" + агент

если надо обновить данніе создаём докуент - задачку, и агент ( каждый 1- 5 минут ) как только увидет документ задачку сразу постараеться отработать, если вариант в) то просто попоробует(агент) опять черз 1- 5 минут
 
Если речь о клиенте, для определения "открытости" документа можно воспользоваться NotesDocument.IsUIDocOpen
 
nvy странная это ф-ция, мне так и не удалось с ней подружиться (скорее это мои проблемы). Имхо, блокировки стандартные или самописные надежнее.
 
Ещё одни вариант — на форме cfd-поле $IsDocBeingEdited с формулой @IsDocBeingEdited.
Проверка doc.GetItemValue("$IsDocBeingEdited")(0):
"" — документ закрыт
"0" — документ открыт на чтение
"1" — документ открыт на редактирование.
Грабли:
1) если документ открывался в предпросмотре, он остаётся открытым даже после закрытия предпросмотра, пока в предпросмотре не будет открыт другой документ (это интерфейсная проблема, doc.IsUIDocOpen ведёт себя также)
2) при открытии документа на редактирование поле не всегда (не сразу?) обновляется.
 
OKEN, блокировки стандартные так же полны странностей... :rolleyes:
 
В догонку — предложенные мной варианты применимы для работы одного пользователя в одном клиенте LN. Определить "открытость" документа другим пользователем на другой машине таким образом не получится. Если нужно последнее — вариант от Morpheus или пляски с блокировками.
 
А собственно как пересчитать поля, имея объект NotesDocument?
 
Есть doc.ComputeWithForm
Для открытых документов можно получить uidoc через notesUIWorkspace.EditDocument c newInstance=false и выполнить Refresh.
 
если надо обновить данніе создаём докуент - задачку, и агент ( каждый 1- 5 минут ) как только увидет документ задачку сразу постараеться отработать, если вариант в) то просто попоробует(агент) опять черз 1- 5 минут
т.е. если вариант в) то агент не сможет выполнить ComputeWithForm?
 
dimat
не сможет, и не должен смочь )))

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

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

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

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

Только настоятельно не рекомендую называть глобальные переменные как v, i и т.п., хотя бы GlobalVariable, CurrentDocument, иначе потом легко запутаться "кто из ху".
 
dimat
использовать глобальные переменные
 
В (Globals) (Declarations)
Public GlStatus as String

В (Globals) Initialize
GlStatus="0"

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

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

что не так сделал?
 
стуация: открыт док, с ним "связан" другой, надо пересчитать другой после изменения в текущем

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

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab