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

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

FEDAZzZ

Гость
#1
Привет.

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

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

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

Kizarek86

Well-Known Member
Lotus team
20.07.2007
863
6
#2
если из базы выйти некорректно, то документы не разблочиваются.
с этим можно смириться)
 
K

kilcher

Гость
#3
если из базы выйти некорректно, то документы не разблочиваются.
с этим можно смириться)

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

FEDAZzZ

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

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

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

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

FEDAZzZ

Гость
#6
Сохранить документ потом нужно.

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

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

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

FEDAZzZ

Гость
#8
Лучше блокировку в топку отправить. :D

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

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

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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#9
Я имею в виду вообще отказаться от блокировки. Решить задачу другими способами. Например, через версионность.
 

Extraterrestrial

Well-Known Member
28.02.2008
266
0
#10
Блокировку можно делать программно: notesDocument.Lock( [ name ] [, provisionalOK ] ) и достаточно, чтобы была включена только опция "Allow design locking" (как оказывается, эта опция имеет отношение не только к болкировкам элементов дизайна). Можно Lock попробовать использовать при переходе документа в режим редактирования на Querymodechange или при открытии документа в режиме редактирования, а разлочивать, ну, возможно, на Terminate... Если закрыть Lotus Notes некорректно или просто питание вырубить, то блокировка висеть останется всё равно. Тут такое дело, обычно можно указывать Timeout при блокировке, но не в Лотусе... В Лотусе нужно видимо просто писать агент, который разлочивает все документы, которые давно заблокированны. Только вот есть ли возможность определить время, когда был заблокирован документ? Если есть, то ОК. В случаях, когда просто пользователь завис в документе надолго, и документ был разблокирован, то при сохранении такого документа блокировать его заново. Наверное так.
 
F

FEDAZzZ

Гость
#11
Спасибо всем за советы :)

Кстати глюк насчет блокировки исчезает если не использовать в приложение свойство SaveOptions.... Тогда документы блокируються и разблокируються корректно.
 
13.03.2009
625
2
#12
Принудительно снимать блокировку при закрытии формы в UI:

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

Extraterrestrial

Well-Known Member
28.02.2008
266
0
#13
Спасибо всем за советы :rolleyes:

Кстати глюк насчет блокировки исчезает если не использовать в приложение свойство SaveOptions.... Тогда документы блокируються и разблокируються корректно.
Кстати, а если включена опция "Allow document locking", то при программном редактировании документа он автоматически блокируется без использования метода Lock? Или, например, кто-то редактирует документ через UI (документ при этом заблокирован) и одновременно агент в него что-то пишет, агент это сможет сделать? Если нет, то видимо завершит свою работу с ошибкой?
 
K

K-Fire

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

Поэтому я согласен с мнением, что реализовывать локинг надо вручную своей логикой. По крайней мере будет меньше глюков в приложении.
 
13.03.2009
625
2
#15
Кстати, а если включена опция "Allow document locking", то при программном редактировании документа он автоматически блокируется без использования метода Lock?
При программном изменении документа (в backend-е) документ не блокируется. Можно принудительно его залочить вызовом doc.lock.
Или, например, кто-то редактирует документ через UI (документ при этом заблокирован) и одновременно агент в него что-то пишет, агент это сможет сделать? Если нет, то видимо завершит свою работу с ошибкой?
Если документ залочен (например открыт на редактирование в UI), то при сохранении документа в backend-е генерится ошибка. Исключение - если агент запущен от имени локера.
Проверка на залоченность перед сохранением возможна - например, через проверку doc.lockholders.
Если контекст задачи по-любому требует сохранения документа, блокировку можно снять( конечно если хватает прав ) через doc.unlock.
 

Constantin A Chervonenko

Well-Known Member
Lotus team
30.05.2006
1 334
4
#16
По базе топчется десяток агентов (каждый по своим событиям, по своему расписанию), периодически сталкиваясь лбами.
Как тут может помочь doc.Lock, учитывая что разработчик у всех агентов общий? :rolleyes:
 
13.03.2009
625
2
#17
По базе топчется десяток агентов (каждый по своим событиям, по своему расписанию), периодически сталкиваясь лбами.
Как тут может помочь doc.Lock, учитывая что разработчик у всех агентов общий? :rolleyes:
Есть мнение, что в этом случае в консерватории надо менять.
А навскидку - блокировку можно использовать примерно так: после получения агентом объекта документа немедленно его лочить. До сохранения. И соответственно разлачивать после сохранения. Ессно при блокировке проверять что документ свободен.
Если все агенты соблюдают этот протокол - проблема "столкновения лбами" переносится на уровень логики приложения.
З.Ы. Я не фанат блокировок. Просто эта возможность существует и ей можно пользоваться. Заявления о кривизне механизма считаю необоснованными. Не кривее всего остального :).
 

Extraterrestrial

Well-Known Member
28.02.2008
266
0
#18
Да, агент с ошибкой завершится. И если у нас есть скедульный агент который каждую ночь обрабатывает доки, и у какого-то пользователя некорректно завершился клиент.... то тут мы имеем кучу траблов.

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

По базе топчется десяток агентов (каждый по своим событиям, по своему расписанию), периодически сталкиваясь лбами.
Как тут может помочь doc.Lock, учитывая что разработчик у всех агентов общий? :rolleyes:
Ну, а нельзя ли использовать как аргумент у Lock не имя пользователя, а Имя агента + Имя пользователя?
Еще проблема есть, как определить, сколько времени прошло после того, как документ был заблокирован... Есть какой-нибудь timestamp, который Lock ставит?

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

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

Теперь понятно, вот поля (айтемы) полезные: $Writers и $WritersDate. Последнее нам дает время и дату блокировки.
 
13.03.2009
625
2
#19
Как я понимаю, если агенты исполняются с правами одного и того же пользователя, то это работать не будет. Поэтому видимо, если Lock позволяет, то нужно использовать уникальный аргумент, вместо имени пользователя. Кто-нибудь проверял, так работает Lock нормально?
В данном случае все равно, кем заблокирован документ. Важен сам факт того, что он заблокирован.
Перед блокировкой документа агент проверяет 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
 

Extraterrestrial

Well-Known Member
28.02.2008
266
0
#20
В данном случае все равно, кем заблокирован документ. Важен сам факт того, что он заблокирован.
Перед блокировкой документа агент проверяет 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

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