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

Тема в разделе "Lotus - Программирование", создана пользователем San40S, 23 апр 2009.

  1. San40S

    San40S Well-Known Member

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

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

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

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

    Omh Lotus team
    Lotus team

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

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

    Вот и всё :)
     
  3. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Это будет аналог версий своими руками?
     
  4. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Двух сохраненных док-ов нету.
    Есть один документ, если в нем были изменения (надо сделать проверку, были ли изменения), то этот док (в начальном состоянии, без изменений) надо скопировать в архив, а измененный оставить (сохранить) в основной базе.
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Посмотри эту тему.
    Мы как раз по этому поводу там растекались мыслью по древу :)
     
  6. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    San40S, в PostOpen запихиваешь текущий документ в переменную. Я создавал новый документ, и копировал в него все поля.
    Когда надо делать проверку, запихиваешь текущий(уже измененный) документ в другую переменную. И делаешь проверку.
     
  7. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Medevic
    А как сравнить эти два дока (переменных)?
     
  8. NetWood

    NetWood Lotus team
    Lotus team

    Регистрация:
    17 апр 2008
    Сообщения:
    308
    Симпатии:
    0
    Сорри. Поправлю. не силен я в прог, но "мысью по древу" копирайт Слово о Полку Игореве. :) боян
     
  9. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    NetWood
    Это в оригинале так было.
    А пролетариат использует так :)
     
  10. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    NetWood
    Omh
    Ребят, сори, но может подскажете, как сравнить этих два дока (переменных) между собой :)
     
  11. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Посмотрел эту темку.
    Возник такой вопрос, не совсем актуальный для этой темы, но всё же.

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

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    San40S
    Я ж во втором посте сверху всё отписал. Конкретизируй вопрос :)
    xalet
    Я встроенный versioning не юзал, так что не подскажу
     
  13. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    В КвериОпен такой код:
    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???
     
  14. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Странный вопрос.
    Сравнивать надо не документы, а поля. Напиши функцию, которая по имени поля сравнивает значения в двух документах и соответственно формируй список полей, в которых данные отличаются.

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    NewDoc зедекларить глобально (не люблю это дело).
    Пробежать forall по айтемам.
     
  16. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    В этом и состоит вопрос - я не могу вьехать с этим Forall, что в нем писать надо?

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

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Код (Text):
    Dim doc As NotesDocument

    Forall item In doc.Items

    End Forall
     
  18. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Код (Text):
    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)
     
  19. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Omh
    Пасиб огромное!!! Воркинг!!! :)
     
  20. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Видишь, какие хорошие люди собираются на форуме белорусских программистов :)
     
Загрузка...

Поделиться этой страницей