Форум продуктов IBM Lotus
Общие вопросы => Разработка приложений => Тема начата: cybergeene от 08 Сентябрь 2010, 17:05:43
-
Вопрос: У пользователя А открыт документ в режиме просмотра, пользователь Б программно меняет в документе поле (одно какое-нибудь) и выходит. Каким образом отследить в документе, отрытого пользователем А, при нажатии на клавишу редактирования, что документ был изменен?
-
Если документ был открыт в режиме просмотра, то конфликта не будет.
А так, пользуйтесь блокировками, отслеживайте программно, что документ заблокирован другим пользовтелем.
-
Пользователь Б уже вышел. Блокировка снята. Пользователь Б сохранил документ. Получается, пользователь А видит старый документ. Каким образом можно определить, что документ открытый пользователем А и сохраненный пользователем Б в базу - разные?
Пробовали таким образом:
Set doc = Source.Document
sdate = Source.Document.LastModified
UIDS = doc.UniversalId
Set dbn = New NotesDatabase ( db.Server, db.FilePath )
Set doc = dbn.GetDocumentByUNID( UIDS ) 'переопределяем doc
ddate = doc.LastModified
Set uidoc = workspace.CurrentDocument
sdate = uidoc.Document.LastModified
If ddate > sdate Then
isCHdoc = True 'isCHdoc - функция
Messagebox( "документ был изменён. переоткрываем его. " )
End If
Даже если документ и был кем-то изменен, данный скрипт не видит.
Что посоветуете?
-
Вы пробовали выводить ddate и sdate, они отличаются?
Сравнивать даты/времена лучше через функцию Timedifference/Timedifferencedouble класса NotesDateTime.
-
ddate и sdate были одинаковые, принадлежавшие открытому документу
-
Тогда при программном изменении пользователем Б документа не меняется поле LastModified.
-
при открытых одновременно документах
Б делает изменения
у пользователя Б все корректно меняется
а вот у пользоватея А
при прогоне скрипта, даты одинаковые
-
Попробуйте в скрипте перед строкой:
Set doc = dbn.GetDocumentByUNID( UIDS ) 'переопределяем doc
вставить строку:
Delete doc
Возможно берется документ из кэша.
-
уже стоит :(
Function isCHdoc(Source As NotesUIDocument) As Boolean
Dim db As NotesDatabase
Dim dbn As NotesDatabase
Dim session As New NotesSession
Dim workspace As New NotesUIWorkspace
isCHdoc = False
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
source.AutoReload = False
Set doc = Source.Document
Dim noteIDs As String
Dim UIDS As String
Dim ddate As Variant
Dim sdate As Variant
Dim success As Variant
sdate = Source.Document.LastModified
' noteIDs = doc.NoteID
UIDS = doc.UniversalId
' Dim dbui As NotesUIDatabase
' Set dbui = workspace.CurrentDatabase
' Set db = dbui.Database
' Set db = Source.Document.ParentDatabase
Call Source.Close()
Delete doc
Delete Source
Set db = session.CurrentDatabase
Call workspace.OpenDatabase( db.Server, db.FilePath)
' Set doc = db.GetDocumentByID(noteIDs)
Set dbn = New NotesDatabase ( db.Server, db.FilePath )
Set doc = dbn.GetDocumentByUNID( UIDS )
ddate = doc.LastModified
Print Cstr(ddate)," --0-- " Cstr(sdate)
Call workspace.EditDocument( False, doc, False)
Set uidoc = workspace.CurrentDocument
sdate = uidoc.Document.LastModified
' Call workspace.ReloadWindow( )
Print Cstr(ddate)," -- -- " Cstr(sdate)
' Print Cstr(doc.LastModified)," - ", Cstr(Source.Document.LastModified )
' If doc.LastModified > Source.Document.LastModified Then
If ddate > sdate Then
isCHdoc = True
Messagebox( "документ был изменён. переоткрываем его. " )
End If
End Function
-
Пользователи работают с одной базой? Может используются реплики?
-
работают напрямую с одной базой. Реплики не используются
-
Посмотрите, поле "$Revisions" тоже не меняется?
-
не меняется
-
В общем, нужно построить представление, например, по UniqueID документа и из него вынуть методом getdocumentbyUID док. Если поле LastModified отличается, то прямая опасность конфликта (или потери данных, если включены блокировки в БД)
-
давно хотел подробно написать:
Нужно построить представление(например, (viewUID) ) с одним сотрированным столбцом, в значении столбца "Formula" написать @Text(@DocumentUniqueID)
В форме написать:
Set viewUID =db.GetView("(viewUID)")
Call doc.Save( False, True )
If uidoc.EditMode Then
Call uidoc.Reload 'если в режиме редактирования
Call uidoc.Refresh 'если в режиме редакт
Call uidoc.Save
End if
Print "Документ был сохранен"
Call uidoc.Close(True)
unid = doc.UniversalID
Delete doc
Call viewUID.Refresh 'два рефреша, тк. иногда один не срабатывает
Call viewUID.Refresh 'если первый рефреш сработал, второй практически не занимает время
Set doc = viewUID.GetDocumentByKey(unid) 'Set doc = db.getDocumentByUNID(unid) не поможет!!!
Call workspace.EditDocument(True,doc)