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

Тема в разделе "Lotus - Программирование", создана пользователем Mikle77, 22 июл 2016.

Метки:
  1. Mikle77

    Mikle77 Well-Known Member

    Регистрация:
    19 дек 2007
    Сообщения:
    81
    Симпатии:
    0
    Есть документы по которые ночью правятся агентом - по другому не сделаешь что бы не правились.
    Пользователи если открыли документ вечером а утром начинают что-либо править в нем им выскакивем сообщение - будет создан конфликт и пользователи игнорируют это и создают конфликт.

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    проверить время изменения бэкэнд дока и фронтэнд (инмемори), на QuerySave
    и послать юзверя, зависимо от ситуации
     
  3. Mikle77

    Mikle77 Well-Known Member

    Регистрация:
    19 дек 2007
    Сообщения:
    81
    Симпатии:
    0
    Спасибо большое, буду пробовать!
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Можно сделать базу-блокиратор, тогда можно будет запретить одновременное редактирование документа.
     
  5. swyatogor

    swyatogor Lotus team
    Lotus team

    Регистрация:
    24 фев 2014
    Сообщения:
    432
    Симпатии:
    10
    Разрешить блокирование на базе не поможет.. так как блокируется только UI доступ. обычным агентом в это время можно менять внутри что угодно.. Я обычно на своих агентах ставлю проверку на lockholders документа, если есть - то документ не трогать..
    Или ты имел ввиду отдельно лежащую базу с семафорами заблокированных в данный момент документов??
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Именно, лежит на отдельном сервере, поля: UNID документа, человек, когда.
    Агент проверяет наличие документа, пользователю выдает сообщение кто и когда залочил.
    Косяки бывают, когда кто-то открыл и свалил в отпуск.
     
  7. swyatogor

    swyatogor Lotus team
    Lotus team

    Регистрация:
    24 фев 2014
    Сообщения:
    432
    Симпатии:
    10
    хм.. тут задача немного другая..
    документ уже открыт, а его в бэкэнде агентом подправили.. и нужно запретить сохранение..
    тогда.. в агенте, который правит док в бэке делать проверку на открытие в данный момент документе типа NotesDocument.IsUIDocOpen..
    и если открыт - то тогда делать запись как сказал Savl.. а на QueryClose - делать проверку на наличие такого семафора.. если есть - показывать сообщение и не давать сохранять.. а на терминате - удалять семафорчик.. как то так..
     
  8. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    У меня вот такая проверка в базе

    Код (LotusScript):
    Sub "Postopen"
    ConflictSave = False
    Set CurrUIDoc = Source
        Set CurrDoc = Source.Document
    Код (LotusScript):
    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
     
     
  9. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    799
    Симпатии:
    78
    Была рекомендация от ИБМ - ограничивать кол-во записей $Revisions\$UpdatedBy в целях перфоманса.
    Следовательно код не будет работать правильно. Лучше уж сравнивать последние элементы массива.
     
    savl нравится это.
  10. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    При расхождении времени на сервере и клиенте может быть а-я-яй)

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    ну за этим проследить проще - запросить время с сервера и уведомить клиента (в т.ч. о необходимости ntp update)
     
Загрузка...

Поделиться этой страницей