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

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

  1. FEDAZzZ

    FEDAZzZ Гость

    Репутация:
    0
    Привет.

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

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

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

    Kizarek86 Well-Known Member
    Lotus team

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

    kilcher Гость

    Репутация:
    0

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

    FEDAZzZ Гость

    Репутация:
    0

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

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

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

    Kizarek86 Well-Known Member
    Lotus team

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

    FEDAZzZ Гость

    Репутация:
    0

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

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

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

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

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

    FEDAZzZ Гость

    Репутация:
    0

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

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

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

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

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

    Extraterrestrial Well-Known Member

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

    FEDAZzZ Гость

    Репутация:
    0
    Спасибо всем за советы :)

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

    Репутация:
    0
    Регистрация:
    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

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

    K-Fire Гость

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

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

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

    Constantin A Chervonenko Well-Known Member
    Lotus team

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

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

    Extraterrestrial Well-Known Member

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

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

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

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

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

    Репутация:
    0
    Регистрация:
    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

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

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

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