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

  • Автор темы San40S
  • Дата начала
S

San40S

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

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

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

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

Omh

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

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

Вот и всё :)
 
X

Xalet

Это будет аналог версий своими руками?
 
S

San40S

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

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

Вот и всё :)

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

Omh

Посмотри эту тему.
Мы как раз по этому поводу там растекались мыслью по древу :)
 

Medevic

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

San40S

Medevic
А как сравнить эти два дока (переменных)?
 
O

Omh

NetWood
Это в оригинале так было.
А пролетариат использует :)
 
S

San40S

NetWood
Omh
Ребят, сори, но может подскажете, как сравнить этих два дока (переменных) между собой :)
 
X

Xalet

Посмотри ]]>эту]]> тему.
Мы как раз по этому поводу там растекались мыслью по древу

Посмотрел эту темку.
Возник такой вопрос, не совсем актуальный для этой темы, но всё же.

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

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

Omh

San40S
Я ж во втором посте сверху всё отписал. Конкретизируй вопрос :)
xalet
Я встроенный versioning не юзал, так что не подскажу
 
S

San40S

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???
 
A

abbatik

В КвериОпен такой код:
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
 
O

Omh

NewDoc зедекларить глобально (не люблю это дело).
Пробежать forall по айтемам.
 
S

San40S

NewDoc зедекларить глобально (не люблю это дело).
Пробежать forall по айтемам.

В этом и состоит вопрос - я не могу вьехать с этим Forall, что в нем писать надо?

З.Ы. Напишите пжлст кусок кода на основе моего.
 
O

Omh

Код:
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)
 
O

Omh

Видишь, какие хорошие люди собираются на форуме белорусских программистов :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!