Сравнить поля в 2-х док-ах, вывести протокол

San40S

Well-known member
15.04.2009
69
0
#1
Доброго времени суток!
Есть документы в основной базе. Пользователь открывает документ на редактирование и если он сделал какие-то изменения в документе, то нужно сделать копию начального документа (не измененного) в БД "Архив". А в архиве, в документе вывести "протокол", что именно поменялось в исходном документе.
Вопрос: как проверить поля? Как сделать протокол?

З.Ы. Увидел сообщение в другом форуме (предложена идея, а решения нету):

<<<"Хорошо бы иметь универсальный тул для протокола, в виде логов с конфигурационными документами (Форма + отслеживаемые поля). При сохранениии какой-то формы, я отслеживаю указанные поля и делаю запись в логе протокола. А потом успешно пользуюсь этой информацией. Гибко и практично. В этом случае лучше предоставить пользователю видеть весь протокол по изменению полей. А для того чтобы видеть имя изменившего, которого нужно показывать на против поля, нужно будет постараться положить инфу так, чтобы потом ее можно было выделить из протокола.">>>

Очень ИНТЕРЕСУЕТ реализация вот этой идеи!!!
Спасибо!
 

Omh

Lotus team
04.07.2007
2 210
1
#2
Ну если у тебя есть 2 сохраннёых дока, то вообще проблем нету.
Бежим там и там
Код:
forall x in doc.Items
и проверяем на наличие этого поля в оппозиционгом документе.
Этим самым вычислям новые/исчезнувшие поля.
Это 2 отдельные группы.

Потом по оставшимся айтемам пробегаемся и сравниваем, напрмер, item.text (для RT надо будет чутка поднаворотить).
Те поля, где данные несовпадают выделяем в третью группу (изменённые).

Вот и всё :)
 

San40S

Well-known member
15.04.2009
69
0
#4
Ну если у тебя есть 2 сохраннёых дока, то вообще проблем нету.
Бежим там и там
Код:
forall x in doc.Items
и проверяем на наличие этого поля в оппозиционгом документе.
Этим самым вычислям новые/исчезнувшие поля.
Это 2 отдельные группы.

Потом по оставшимся айтемам пробегаемся и сравниваем, напрмер, item.text (для RT надо будет чутка поднаворотить).
Те поля, где данные несовпадают выделяем в третью группу (изменённые).

Вот и всё :)
Двух сохраненных док-ов нету.
Есть один документ, если в нем были изменения (надо сделать проверку, были ли изменения), то этот док (в начальном состоянии, без изменений) надо скопировать в архив, а измененный оставить (сохранить) в основной базе.
 

Omh

Lotus team
04.07.2007
2 210
1
#5
Посмотри эту тему.
Мы как раз по этому поводу там растекались мыслью по древу :)
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#6
San40S, в PostOpen запихиваешь текущий документ в переменную. Я создавал новый документ, и копировал в него все поля.
Когда надо делать проверку, запихиваешь текущий(уже измененный) документ в другую переменную. И делаешь проверку.
 

San40S

Well-known member
15.04.2009
69
0
#7
Medevic
А как сравнить эти два дока (переменных)?
 

Omh

Lotus team
04.07.2007
2 210
1
#9
NetWood
Это в оригинале так было.
А пролетариат использует так :)
 

San40S

Well-known member
15.04.2009
69
0
#10
NetWood
Omh
Ребят, сори, но может подскажете, как сравнить этих два дока (переменных) между собой :)
 

Xalet

Well-known member
08.08.2008
410
0
#11
Посмотри ]]>эту]]> тему.
Мы как раз по этому поводу там растекались мыслью по древу
Посмотрел эту темку.
Возник такой вопрос, не совсем актуальный для этой темы, но всё же.

В ЛН есть версии. Если док изменяется, то создается его копия. Соответственно должы быть номера версии, если нет, то отследить по датам можно. Кто-нибудь пользовался всем этим механизмом? Если да, то какие в нем подводные камни?

Ребят, сори, но может подскажете, как сравнить этих два дока (переменных) между собой
А что конкретно ты хочешь в логе писать? Скажем если поле текстовое, то ты хочешь там писать изменилось ли значение в нем, или и само значение, что на что... В рич тексте к примеру если у тебя файл висел прикрепленный, то изменился ли сам файл(несколько файлов) и т.д.
 

Omh

Lotus team
04.07.2007
2 210
1
#12
San40S
Я ж во втором посте сверху всё отписал. Конкретизируй вопрос :)
xalet
Я встроенный versioning не юзал, так что не подскажу
 

San40S

Well-known member
15.04.2009
69
0
#13
San40S
Я ж во втором посте сверху всё отписал. Конкретизируй вопрос :)
xalet
Я встроенный versioning не юзал, так что не подскажу
В КвериОпен такой код:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim newdoc As NotesDocument
Set db = session.CurrentDatabase
Set doc = Source.Document
Set newdoc = db.CreateDocument
Call doc.CopyAllItems (newdoc, True)

В КвериСейв:
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim doc As NotesDocument
Set doc = Source.Document
Dim newdoc2 As NotesDocument
Set newdoc2 = db.CreateDocument
Call doc.CopyAllItems (newdoc2, True)

Вопрос: Что дальше нужно написать, дабы сравнить между собой newdoc и newdoc2 ??? И как мне в КвериСейв увидеть newdoc???
 

abbatik

Lotus team
20.10.2008
277
0
#14
В КвериОпен такой код:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim newdoc As NotesDocument
Set db = session.CurrentDatabase
Set doc = Source.Document
Set newdoc = db.CreateDocument
Call doc.CopyAllItems (newdoc, True)

В КвериСейв:
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim doc As NotesDocument
Set doc = Source.Document
Dim newdoc2 As NotesDocument
Set newdoc2 = db.CreateDocument
Call doc.CopyAllItems (newdoc2, True)

Вопрос: Что дальше нужно написать, дабы сравнить между собой newdoc и newdoc2 ??? И как мне в КвериСейв увидеть newdoc???
Странный вопрос.
Сравнивать надо не документы, а поля. Напиши функцию, которая по имени поля сравнивает значения в двух документах и соответственно формируй список полей, в которых данные отличаются.

if newdoc1.GetItemValue ( Field1 ) ( 0 ) = newdoc2.GetItemValue ( Field1 ) ( 0 ) then
...
end if
 

Omh

Lotus team
04.07.2007
2 210
1
#15
NewDoc зедекларить глобально (не люблю это дело).
Пробежать forall по айтемам.
 

Omh

Lotus team
04.07.2007
2 210
1
#18
Код:
forall x in NewDoc.Items
if OldDoc.HasItem(x.Name) then
if x.Text <> OldDoc.GetFirstItem(x.Name).Text then Print "Item " + x.Name + " was changed"
else
Print "Item " + x.Name + " is new"
end if
end forall
Примерно так, написал, можно сказать псевдокод: не хватает много проверок.
Потом нужен ещё один цикл обратный, что бы найти removed айтемы (т.е. смотреть со стороны OldDoc'a)
 

Omh

Lotus team
04.07.2007
2 210
1
#20
Видишь, какие хорошие люди собираются на форуме белорусских программистов :)