Форум продуктов IBM Lotus

Общие вопросы => Разработка приложений => Тема начата: cybergeene от 08 Сентябрь 2010, 17:05:43

Название: Конфликтные документы. Как минимизироват
Отправлено: cybergeene от 08 Сентябрь 2010, 17:05:43
Вопрос: У пользователя А открыт документ в режиме просмотра, пользователь Б программно меняет в документе поле (одно какое-нибудь) и выходит. Каким образом отследить в документе, отрытого пользователем А, при нажатии на клавишу редактирования, что документ был изменен?
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: ViV от 08 Сентябрь 2010, 17:10:43
Если документ был открыт в режиме просмотра, то конфликта не будет.

А так, пользуйтесь блокировками, отслеживайте программно, что документ заблокирован другим пользовтелем.
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: cybergeene от 09 Сентябрь 2010, 08:37:15
Пользователь Б уже вышел. Блокировка снята. Пользователь Б сохранил документ. Получается, пользователь А видит старый документ. Каким образом можно определить, что документ открытый пользователем А и сохраненный пользователем Б в базу - разные?
Пробовали таким образом:

            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

   Даже если документ и был кем-то изменен, данный скрипт не видит.
   Что посоветуете?
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: ViV от 09 Сентябрь 2010, 11:41:03
Вы пробовали выводить ddate и sdate, они отличаются?

Сравнивать даты/времена лучше через функцию Timedifference/Timedifferencedouble класса NotesDateTime.
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: cybergeene от 09 Сентябрь 2010, 12:58:20
ddate и sdate были одинаковые, принадлежавшие открытому документу
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: ViV от 09 Сентябрь 2010, 13:04:11
Тогда при программном изменении пользователем Б документа не меняется поле LastModified.
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: cybergeene от 09 Сентябрь 2010, 13:24:11
при открытых одновременно документах
Б делает изменения
у пользователя Б все корректно меняется

а вот у пользоватея А 
при прогоне скрипта,  даты одинаковые
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: ViV от 09 Сентябрь 2010, 13:29:29
Попробуйте в скрипте перед строкой:
  Set doc = dbn.GetDocumentByUNID( UIDS )                  'переопределяем doc       
вставить строку:
Delete docВозможно берется документ из кэша.
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: cybergeene от 09 Сентябрь 2010, 13:37:52
уже стоит :(

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

Название: Re: Конфликтные документы. Как минимизироват
Отправлено: ViV от 09 Сентябрь 2010, 13:48:59
Пользователи работают с одной базой? Может используются реплики?
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: cybergeene от 09 Сентябрь 2010, 15:19:47
работают напрямую с одной базой. Реплики не используются
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: ViV от 09 Сентябрь 2010, 17:18:19
Посмотрите, поле "$Revisions" тоже не меняется?
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: cybergeene от 09 Сентябрь 2010, 17:53:30
не меняется
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: cybergeene от 29 Сентябрь 2010, 23:58:27
В общем, нужно построить представление, например, по UniqueID документа и из него вынуть методом getdocumentbyUID док. Если поле LastModified отличается, то прямая опасность конфликта (или потери данных, если включены блокировки в БД)
Название: Re: Конфликтные документы. Как минимизироват
Отправлено: cybergeene от 14 Октябрь 2011, 11:32:02
давно хотел подробно написать:


Нужно построить представление(например, (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)