F
fedotxxl
Всем привет,
штатный локер меня несколько пугает своей сложностью. Мне необходимы функции:
document_lock - заблокировать документ пользователем
document_unlock - разблокировать документ пользователем
document_isLocked - проверить, заблокирован ли кем-нибудь документ
Вот, что получилось (писал 1+ год назад, не очень все логично)
1. Может у кого есть предложения по улучшению?
2. Заблокированность я проверяю при помощи nd.LockHolders. Только что встретил ситуацию - документ заблокирован (поле $Writers заполнено), nd.LockHolders возвращает пустоту. Почему / что делать?
штатный локер меня несколько пугает своей сложностью. Мне необходимы функции:
document_lock - заблокировать документ пользователем
document_unlock - разблокировать документ пользователем
document_isLocked - проверить, заблокирован ли кем-нибудь документ
Вот, что получилось (писал 1+ год назад, не очень все логично)
Код:
Function document_lock(nd As NotesDocument, user As String, result As Boolean, ea As errorAnswer) As Boolean
On Error Goto errLab
On Error 4595 Goto err4595
'Логируем для отладки падений сервера
Call logEventSession("", SEVERITY_MEDIUM, Nothing)
'Выставляем параметры по-умолчанию
If ea Is Nothing Then Set ea = New errorAnswer
result = False
'По-умолчанию считаем, что функция выполнена успешно
document_lock = True
'Пытаемся заблокировать документ
result = nd.Lock(user)
'Если заблокировать не удалось, то выходим, сохраняя ошибку
If Not result Then
Call document_loadLockHolders(nd, ea)
Exit Function
End If
Exit Function
err4595:
'Документ заблокирован кем-то другим
result = False
Call document_loadLockHolders(nd, ea)
Exit Function
errLab:
'Обрабатываем возникшую в системе ошибку
Call LogErrorEx("", SEVERITY_MEDIUM, nd)
document_lock = False
Exit Function
End Function
Код:
Function document_unlock(nd As NotesDocument, user As String, result As Boolean, ea As errorAnswer) As Boolean
On Error Goto errLab
'Логируем для отладки падений сервера
Call logEventSession("", SEVERITY_MEDIUM, Nothing)
'Выставляем параметры по-умолчанию
If ea Is Nothing Then Set ea = New errorAnswer
result = False
'По-умолчанию считаем, что функция выполнена успешно
document_unlock = True
Dim LockHolders As Variant
lockHolders = nd.LockHolders
lockHolders = Fulltrim(Arrayreplace(lockHolders, user, ""))
'Проверяем, есть ли кто ещё
If (Ubound(lockHolders) <> 0) Or (lockHolders(0) <> "") Then
'Документ заблокирован за кем-то другим
Call document_loadLockHolders(nd, ea)
Exit Function
End If
'Разблокируем документ, возвращаем результат
Call nd.UnLock
result = True
Exit Function
'Обрабатываем возникшую в системе ошибку
errLab:
Call LogErrorEx("", SEVERITY_MEDIUM, nd)
document_unlock = False
Exit Function
End Function
Код:
Function document_isLocked(nd As NotesDocument, result As Boolean, ea As errorAnswer) As Boolean
On Error Goto errLab
'Логируем для отладки падений сервера
Call logEventSession("", SEVERITY_MEDIUM, Nothing)
'Проверяем условия блокировки
If Not nd.ParentDatabase.IsDocumentLockingEnabled Then Exit Function
'Выставляем параметры по-умолчанию
If ea Is Nothing Then Set ea = New errorAnswer
result = False
'По-умолчанию считаем, что функция выполнена успешно
document_isLocked = True
'Проверяем наличие заблокированных пользователей
If (Ubound(nd.LockHolders) <> 0) Or (nd.LockHolders(0) <> "") Then
'Документ заблокирован
result = True
Call document_loadLockHolders(nd, ea)
Exit Function
End If
Exit Function
'Обрабатываем возникшую в системе ошибку
errLab:
Call LogErrorEx("", SEVERITY_MEDIUM, nd)
document_isLocked = False
Exit Function
End Function
2. Заблокированность я проверяю при помощи nd.LockHolders. Только что встретил ситуацию - документ заблокирован (поле $Writers заполнено), nd.LockHolders возвращает пустоту. Почему / что делать?