Как запретить сохранять конфликтные документы.

Mikle77

Well-known member
19.12.2007
80
0
#1
Есть документы по которые ночью правятся агентом - по другому не сделаешь что бы не правились.
Пользователи если открыли документ вечером а утром начинают что-либо править в нем им выскакивем сообщение - будет создан конфликт и пользователи игнорируют это и создают конфликт.

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

Стандартные отработчики конфликтов не подходят т.к. правятся одинаковые поля сервером и пользователем.
 

savl

Lotus team
28.10.2011
2 136
105
#4
Можно сделать базу-блокиратор, тогда можно будет запретить одновременное редактирование документа.
 

swyatogor

Lotus team
24.02.2014
479
10
#5
Можно сделать базу-блокиратор, тогда можно будет запретить одновременное редактирование документа.
Разрешить блокирование на базе не поможет.. так как блокируется только UI доступ. обычным агентом в это время можно менять внутри что угодно.. Я обычно на своих агентах ставлю проверку на lockholders документа, если есть - то документ не трогать..
Или ты имел ввиду отдельно лежащую базу с семафорами заблокированных в данный момент документов??
 

savl

Lotus team
28.10.2011
2 136
105
#6
Или ты имел ввиду отдельно лежащую базу с семафорами заблокированных в данный момент документов??
Именно, лежит на отдельном сервере, поля: UNID документа, человек, когда.
Агент проверяет наличие документа, пользователю выдает сообщение кто и когда залочил.
Косяки бывают, когда кто-то открыл и свалил в отпуск.
 

swyatogor

Lotus team
24.02.2014
479
10
#7
хм.. тут задача немного другая..
документ уже открыт, а его в бэкэнде агентом подправили.. и нужно запретить сохранение..
тогда.. в агенте, который правит док в бэке делать проверку на открытие в данный момент документе типа NotesDocument.IsUIDocOpen..
и если открыт - то тогда делать запись как сказал Savl.. а на QueryClose - делать проверку на наличие такого семафора.. если есть - показывать сообщение и не давать сохранять.. а на терминате - удалять семафорчик.. как то так..
 

savl

Lotus team
28.10.2011
2 136
105
#8
У меня вот такая проверка в базе

Код:
Sub "Postopen"
ConflictSave = False
Set CurrUIDoc = Source
    Set CurrDoc = Source.Document
Код:
Sub "Querysave"
doc - тот же самый документ, полученный заново.
CurrDoc - текущий документ полученный на PostOpen
    If Ubound(CurrDoc.GetItemValue("$Revisions")) <> Ubound(doc.GetItemValue("$Revisions")) Then
       If Not ConflictSave Then
         mes="Во время редактирования документ был пересохранен другим пользователем." & nLine &"Необходимо выйти из документа без сохранения, и повторно отредактировать документ."
         Msgbox mes,16, {Опасность сохранения}
         Continue = False
         Goto endh
       End If
     End If
 

rinsk

Lotus team
12.11.2009
900
44
#9
If Ubound(CurrDoc.GetItemValue("$Revisions"))
Была рекомендация от ИБМ - ограничивать кол-во записей $Revisions\$UpdatedBy в целях перфоманса.
Следовательно код не будет работать правильно. Лучше уж сравнивать последние элементы массива.
 
Симпатии: Понравилось savl

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#10
Лучше уж сравнивать последние элементы массива.
При расхождении времени на сервере и клиенте может быть а-я-яй)

Гарантированный способ - это включение hard+soft-loking'а и написание кода с учётом этого, а также перевод всего кода на save(false). Там при сохранении появятся дополнительные ошибки или будет возвращать false. Ограничение такого подхода - нереплицируемый ACL БД, но если он один раз установлен (доступ несколькими спец.группами) и никогда не меняется, тогда необходимость его репликации отпадает.