Конфликтные документы. Как минимизирова&#1090

Автор Тема: Конфликтные документы. Как минимизироват  (Прочитано 17638 раз)

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Вопрос: У пользователя А открыт документ в режиме просмотра, пользователь Б программно меняет в документе поле (одно какое-нибудь) и выходит. Каким образом отследить в документе, отрытого пользователем А, при нажатии на клавишу редактирования, что документ был изменен?

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #1 : 08 Сентябрь 2010, 17:10:43 »
Если документ был открыт в режиме просмотра, то конфликта не будет.

А так, пользуйтесь блокировками, отслеживайте программно, что документ заблокирован другим пользовтелем.

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #2 : 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

   Даже если документ и был кем-то изменен, данный скрипт не видит.
   Что посоветуете?
« Последнее редактирование: 09 Сентябрь 2010, 08:42:48 от cybergeene »

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #3 : 09 Сентябрь 2010, 11:41:03 »
Вы пробовали выводить ddate и sdate, они отличаются?

Сравнивать даты/времена лучше через функцию Timedifference/Timedifferencedouble класса NotesDateTime.

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #4 : 09 Сентябрь 2010, 12:58:20 »
ddate и sdate были одинаковые, принадлежавшие открытому документу

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #5 : 09 Сентябрь 2010, 13:04:11 »
Тогда при программном изменении пользователем Б документа не меняется поле LastModified.

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #6 : 09 Сентябрь 2010, 13:24:11 »
при открытых одновременно документах
Б делает изменения
у пользователя Б все корректно меняется

а вот у пользоватея А 
при прогоне скрипта,  даты одинаковые

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #7 : 09 Сентябрь 2010, 13:29:29 »
Попробуйте в скрипте перед строкой:
  Set doc = dbn.GetDocumentByUNID( UIDS )                  'переопределяем doc       
вставить строку:
Delete docВозможно берется документ из кэша.

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #8 : 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


ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #9 : 09 Сентябрь 2010, 13:48:59 »
Пользователи работают с одной базой? Может используются реплики?

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #10 : 09 Сентябрь 2010, 15:19:47 »
работают напрямую с одной базой. Реплики не используются

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #11 : 09 Сентябрь 2010, 17:18:19 »
Посмотрите, поле "$Revisions" тоже не меняется?

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #12 : 09 Сентябрь 2010, 17:53:30 »
не меняется
« Последнее редактирование: 09 Сентябрь 2010, 17:55:40 от cybergeene »

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #13 : 29 Сентябрь 2010, 23:58:27 »
В общем, нужно построить представление, например, по UniqueID документа и из него вынуть методом getdocumentbyUID док. Если поле LastModified отличается, то прямая опасность конфликта (или потери данных, если включены блокировки в БД)

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Конфликтные документы. Как минимизироват
« Ответ #14 : 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)