Блокировака документов

Тема в разделе "Lotus - Программирование", создана пользователем FEDAZzZ, 17 мар 2009.

  1. FEDAZzZ

    FEDAZzZ Гость

    Привет.

    Возникла следующая проблемка.....
    Есть база в ней поднят флаг Allow document Locking, указан блокирующий сервер...

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

    Почему может возникать такая ошибка? Надо какую-то галку поставить на сервере? Может кто с этим сталкивался...
     
  2. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    если из базы выйти некорректно, то документы не разблочиваются.
    с этим можно смириться)
     
  3. kilcher

    kilcher Гость


    На одном из форумов читала,что можно принудительно удалять эти поля. Агентом например. Сама пока не пробовала. Но думаю скоро тоже придется заняться этим вопросом
     
  4. FEDAZzZ

    FEDAZzZ Гость


    Причину вроде как понял.... Если документ, содержащий аттачмент, открыть на редактирование, а затем начать редактировать аттачмент, то даже после закрытия аттачмента и сохранения документа, поля Writtetrs не будут удалены....

    А можно подвесить на QueryClose FILED Writers := @DeleteField?

    .... но у меня все рано поля не удаляються ...
     
  5. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Сохранить документ потом нужно.
     
  6. FEDAZzZ

    FEDAZzZ Гость


    Да, я это поробовал...

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

    Попробую дальше сам пошаманить.... Скорее всего буду вводить какой-нибдуь флаг на удаление...
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Лучше блокировку в топку отправить. :D
     
  8. FEDAZzZ

    FEDAZzZ Гость


    А тогда в ручную писать блокировку документов?

    Если надо когда один пользователь редактирует документ то другие только его только читают...

    Интреттраст такую проверку вроде в ручную делает, пишет свои билиотеки, значит не зря.....
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Я имею в виду вообще отказаться от блокировки. Решить задачу другими способами. Например, через версионность.
     
  10. Extraterrestrial

    Extraterrestrial Well-Known Member

    Регистрация:
    28 фев 2008
    Сообщения:
    267
    Симпатии:
    0
    Блокировку можно делать программно: notesDocument.Lock( [ name ] [, provisionalOK ] ) и достаточно, чтобы была включена только опция "Allow design locking" (как оказывается, эта опция имеет отношение не только к болкировкам элементов дизайна). Можно Lock попробовать использовать при переходе документа в режим редактирования на Querymodechange или при открытии документа в режиме редактирования, а разлочивать, ну, возможно, на Terminate... Если закрыть Lotus Notes некорректно или просто питание вырубить, то блокировка висеть останется всё равно. Тут такое дело, обычно можно указывать Timeout при блокировке, но не в Лотусе... В Лотусе нужно видимо просто писать агент, который разлочивает все документы, которые давно заблокированны. Только вот есть ли возможность определить время, когда был заблокирован документ? Если есть, то ОК. В случаях, когда просто пользователь завис в документе надолго, и документ был разблокирован, то при сохранении такого документа блокировать его заново. Наверное так.
     
  11. FEDAZzZ

    FEDAZzZ Гость

    Спасибо всем за советы :)

    Кстати глюк насчет блокировки исчезает если не использовать в приложение свойство SaveOptions.... Тогда документы блокируються и разблокируються корректно.
     
  12. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Принудительно снимать блокировку при закрытии формы в UI:

    Sub Queryclose(Source As Notesuidocument, Continue As Variant)
    On Error Resume Next
    Call source.Document.UnLock
    End Sub
     
  13. Extraterrestrial

    Extraterrestrial Well-Known Member

    Регистрация:
    28 фев 2008
    Сообщения:
    267
    Симпатии:
    0
    Кстати, а если включена опция "Allow document locking", то при программном редактировании документа он автоматически блокируется без использования метода Lock? Или, например, кто-то редактирует документ через UI (документ при этом заблокирован) и одновременно агент в него что-то пишет, агент это сможет сделать? Если нет, то видимо завершит свою работу с ошибкой?
     
  14. K-Fire

    K-Fire Гость

    Да, агент с ошибкой завершится. И если у нас есть скедульный агент который каждую ночь обрабатывает доки, и у какого-то пользователя некорректно завершился клиент.... то тут мы имеем кучу траблов.

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

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    При программном изменении документа (в backend-е) документ не блокируется. Можно принудительно его залочить вызовом doc.lock.
    Если документ залочен (например открыт на редактирование в UI), то при сохранении документа в backend-е генерится ошибка. Исключение - если агент запущен от имени локера.
    Проверка на залоченность перед сохранением возможна - например, через проверку doc.lockholders.
    Если контекст задачи по-любому требует сохранения документа, блокировку можно снять( конечно если хватает прав ) через doc.unlock.
     
  16. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    По базе топчется десяток агентов (каждый по своим событиям, по своему расписанию), периодически сталкиваясь лбами.
    Как тут может помочь doc.Lock, учитывая что разработчик у всех агентов общий? :rolleyes:
     
  17. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Есть мнение, что в этом случае в консерватории надо менять.
    А навскидку - блокировку можно использовать примерно так: после получения агентом объекта документа немедленно его лочить. До сохранения. И соответственно разлачивать после сохранения. Ессно при блокировке проверять что документ свободен.
    Если все агенты соблюдают этот протокол - проблема "столкновения лбами" переносится на уровень логики приложения.
    З.Ы. Я не фанат блокировок. Просто эта возможность существует и ей можно пользоваться. Заявления о кривизне механизма считаю необоснованными. Не кривее всего остального :).
     
  18. Extraterrestrial

    Extraterrestrial Well-Known Member

    Регистрация:
    28 фев 2008
    Сообщения:
    267
    Симпатии:
    0
    Дело в том, что просто timeout нету. Проще написать агент, который будет разблокировать все такие документы, если они долго висят заблокированными.

    Ну, а нельзя ли использовать как аргумент у Lock не имя пользователя, а Имя агента + Имя пользователя?
    Еще проблема есть, как определить, сколько времени прошло после того, как документ был заблокирован... Есть какой-нибудь timestamp, который Lock ставит?

    Как я понимаю, если агенты исполняются с правами одного и того же пользователя, то это работать не будет. Поэтому видимо, если Lock позволяет, то нужно использовать уникальный аргумент, вместо имени пользователя. Кто-нибудь проверял, так работает Lock нормально?

    Интересно также, есть ли возможность создать вид, где будут отображаться только документы, которые заблокированы?

    Теперь понятно, вот поля (айтемы) полезные: $Writers и $WritersDate. Последнее нам дает время и дату блокировки.
     
  19. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    В данном случае все равно, кем заблокирован документ. Важен сам факт того, что он заблокирован.
    Перед блокировкой документа агент проверяет lockholders на пустоту, после чего блокирует док. После сохранения - doc.UnLock.
    ' агент получает документ
    set doc = getDocument
    if doc.LockHolders(0) <> "" then
    ' отработка ситуации, согласно логике приложения
    Call processConflict( doc )
    else
    ' блокируем
    call doc.Lock
    ' разлочить надо по-любому....
    on error goto errhandle
    ' что-то делаем с документом
    Call doSomething( doc )
    ' сохраняем
    Call doc.Save( false , false )
    ' отпускаем
    Call doc.UnLock
    end if
    exit function
    errhandle:
    Call doc.UnLock
    exit Function
     
  20. Extraterrestrial

    Extraterrestrial Well-Known Member

    Регистрация:
    28 фев 2008
    Сообщения:
    267
    Симпатии:
    0

    Дело в том, что не случайно существуют системные блокировки, а не самодельные... Знаете в чем Ваша ошибка? Между проверкой, что какое-то поле непустое, и последующим действием проходит какое-то время. Вот как раз в этот промежуток времени это поле может быть заполнено другим агентом.
     
Загрузка...

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