Как вытащить предыдущее значение поля?

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

  1. olegber

    olegber Гость

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

    пример :
    [codebox]set doc=view.GetDocumentByKey(ID,true)
    doc.ID="1" 'изменили поле и пока не сохраняли документ
    '----какой-то код--------
    теперь мне надо узнать какое значение бало до изменения
    IDold=??

    'только теперь сохраняем
    doc.Save(True,True)[/codebox]

    Промежуточные сохранения или
    запись поля в другие временные документы не подходят.
    Может есть какие-нибудь стандартные средства Lotus?
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    А в переменную запихнуть не?

    Можно, конечно, перед сохранением сделать следующее: по униду сохраняемого документа из view взять этот же документ в другой объект и сравнить (там будут ещё старые значения).
    Но мне кажеться это извр.

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

    ---------------------------------------------------

    Хотя подумал, может и не извр.
    Если поля в документе постоянно будут пополняться, и нам надо отслеживать все изменеия, то почему нет?
    Вообщем, берём этот же док из view и сравниваем :)
     
  3. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    А по-моему изврат :)
    Если значение нужно для операции в данной функции, то конечно нужно сохранять значение перед заменой.
    А если нужно хранить историю, нафига его вообще заменять? Нужно делать поле типа массив и дополнять (по аналогии с $UpdateBy, например).
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    это не изврат! это не работает! :))

    ps: хотя, я брал по униду из базы, но я сомневаюсь, что из вида что-то изменится...

    можно еще сделать копию документа в памяти
    NotesDatabase.CreateDocument
    NotesDocument.CopyAllItems
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Akupaka
    А копия документа работает?
    Я не подкалываю, просто спрашиваю :)

    Я вообще полагал, что и с объектом из view тоже будет работать :)
    Надо будет попробовать-таки.

    abbatik
    Ну такую фишку можно использовать для аудита изменяемых полей, например.
    Если в документе появится поле, которое мы не пердусмотрели скриптом, то оно не проаудитится, а с таким подходом - проаудитится.
    Ну это только предположение.

    Зачем это olegber'у я достоверно не знаю :)

    -----------------------Добавление-------------------------

    Akupaka
    Что-то ты ошибся чутка
    Такой скрипт:
    Код (Text):
    Dim db As NotesDatabase
    Set db = doc.ParentDatabase

    Dim View As NotesView
    Set View = db.GetView("UNIDS")
    Call View.Refresh

    Dim OthDoc As NotesDocument
    Set OthDoc = View.GetDocumentByKey(doc.UniversalID, True)
    Call Messagebox doc.GetItemValue("TemplateName")(0) + Chr(13) + othdoc.GetItemValue("TemplateName")(0), 0 + 64, "Information"
    На QuerySave (до сохранения) месседжбоксит разные значения.
    Значит работает.
     
  6. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    забавно :)

    попробуй у себя выполнить

    Код (Text):
        Dim s As New NotesSession
    Dim db As NotesDatabase
    Dim v As NotesView
    Dim doc1 As NotesDocument
    Dim doc2 As NotesDocument
    Dim doc3 As NotesDocument
    Dim doc4 As NotesDocument



    Set db = s.CurrentDatabase
    Set doc1 = db.AllDocuments.GetFirstDocument
    Set doc2 = db.AllDocuments.GetFirstDocument
    Set doc3 = db.GetDocumentByUNID(doc1.UniversalID)
    Set doc4 = db.GetDocumentByID(doc1.NoteID)

    Msgbox doc1.GetItemValue("item123")(0) _
    & Chr(10) & doc2.GetItemValue("item123")(0) _
    & Chr(10) & doc3.GetItemValue("item123")(0) _
    & Chr(10) & doc4.GetItemValue("item123")(0) _

    Call doc1.ReplaceItemValue("item123", "123")

    Msgbox doc1.GetItemValue("item123")(0) _
    & Chr(10) & doc2.GetItemValue("item123")(0) _
    & Chr(10) & doc3.GetItemValue("item123")(0) _
    & Chr(10) & doc4.GetItemValue("item123")(0) _

    Set doc1 = Nothing
    Set doc2 = Nothing
    Set doc3 = Nothing
    Set doc4 = Nothing

    Set v = db.Views(0)

    Set doc1 = v.GetFirstDocument
    Set doc2 = v.GetFirstDocument
    Set doc3 = db.GetDocumentByUNID(doc1.UniversalID)
    Set doc4 = db.GetDocumentByID(doc1.NoteID)

    Msgbox doc1.GetItemValue("item123")(0) _
    & Chr(10) & doc2.GetItemValue("item123")(0) _
    & Chr(10) & doc3.GetItemValue("item123")(0) _
    & Chr(10) & doc4.GetItemValue("item123")(0) _

    Call doc1.ReplaceItemValue("item123", "123")

    Msgbox doc1.GetItemValue("item123")(0) _
    & Chr(10) & doc2.GetItemValue("item123")(0) _
    & Chr(10) & doc3.GetItemValue("item123")(0) _
    & Chr(10) & doc4.GetItemValue("item123")(0) _

    Set doc1 = Nothing
    Set doc2 = Nothing
    Set doc3 = Nothing
    Set doc4 = Nothing

    Set v = db.GetView("ByUnid")

    Set doc1 = v.GetFirstDocument
    Set doc2 = v.GetDocumentByKey(doc1.UniversalID)
    Set doc3 = db.GetDocumentByUNID(doc1.UniversalID)
    Set doc4 = db.GetDocumentByID(doc1.NoteID)

    Msgbox doc1.GetItemValue("item123")(0) _
    & Chr(10) & doc2.GetItemValue("item123")(0) _
    & Chr(10) & doc3.GetItemValue("item123")(0) _
    & Chr(10) & doc4.GetItemValue("item123")(0) _

    Call doc1.ReplaceItemValue("item123", "123")

    Msgbox doc1.GetItemValue("item123")(0) _
    & Chr(10) & doc2.GetItemValue("item123")(0) _
    & Chr(10) & doc3.GetItemValue("item123")(0) _
    & Chr(10) & doc4.GetItemValue("item123")(0) _
    только последний раз работает "как задумано" :))
    причем со всеми доками, а не только с тем, что из вида...
     
  7. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Я чёт под конец дня уже не осиливаю.
    Надо тестовую среду делать, а у меня уже палцы болят по этому гогну стучать...
     
  8. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    та какая среда?! :)
    в той же базе, что ты делал свой, сделай агент и сунь ему код в инициализ.
    только имя вида подправь
     
  9. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    У меня в тестовой базе ни одного документа. :)

    Я завтра посмотрю.
    Просто ща одну штуку доделывал, времени не было документ сгенерить :)
     
  10. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    и кто после этого мне докажет, что программеры не ленивые?! :)
     
  11. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Документ с диска можно поднять через db.getDocumentByUNID, предварительно уничтожив объект документа в памяти.
    Код (Text):
        Dim session As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim curdoc As NotesDocument

    Set curdoc = ws.CurrentDocument.Document ' документ из памяти
    Dim unid As String
    unid = curdoc.UniversalID

    Delete curdoc
    Set curdoc = session.CurrentDatabase.GetDocumentByUNID( unid ) ' документ с диска

    Delete curdoc
    Set curdoc = ws.CurrentDocument.Document ' документ из памяти
     
  12. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    а если нужно иметь оба для сравнения?..
     
  13. K-Fire

    K-Fire Гость

    ws.CurrentDocument.Document? :)
     
  14. olegber

    olegber Гость

    Бывает что нет CurrentDocument, а посмотреть старое значение необходимо.
    Как я понял можно использовать несколько вариантов:
    1) Создать tempdoc и скопировать туда все значения полей перед изменением.
    2) Создать массив или лучше list для сохранения документов
    Эти два метода мы используем в организации.
    3) Можно ещё вот так:

    [codebox]Dim ses As New notessession
    Dim db As notesdatabase
    Set db=ses.CurrentDatabase
    Dim vw As notesview
    Set vw=db.GetView("sysLOG")

    Dim docNew As NotesDocument
    Dim docOld As NotesDocument
    'до начала изменения необходимо забрать оба документа
    'причём извращённым способом - чтобы у "старого" документа поменять unid
    Set docNew=vw.GetFirstdocument
    unid$=docNew.UniversalID
    Set docOld=db.GetDocumentByUNID( docNew.UniversalID )
    'документу, в котром хранятся старые значения присваиваем другой UNID
    docOld.UniversalID="xxxxxxxxxx1111111111xxxxxxxxxx11"
    Set docNew= Nothing
    'восстанавливаем рабочий документ
    Set docNew=db.GetDocumentByUNID( unid$ )

    docNew.Time=Now

    Print Cstr(docNew.Time(0)) + (docOld.Time(0)) 'выполняем необходимые действия по сравнению
    Call docNew.SAve(True,True) 'сохраняем [/codebox]

    Один минус: документ для проверки должен быть инициализирован до изменения поля.
    Больше я не нашёл.
    Жаль нет способа достать сохранённые значения полей в любой момент времени.
     
  15. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    как нет?! а метод NotesDocument.GetFieldsDataOnTime()!


    зы: со вторым апреля

    бывает, когда УИ-документ новый

    по-идее, метод с замещением унида аналогичен методу копирования итемов...
     
  16. olegber

    olegber Гость

    А если смотреть в сторону API?
    Ни разу с этим не работал.
     
  17. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    тогда лучше не смотри, для этой задачи это не нужно вообще...
    хотя, задачи я и не слышал :) ты вот рассказал бы суть задачи
     
  18. olegber

    olegber Гость

    Задача такая (lotus 5):
    Есть документ в котором в процессе выполнения кода меняются поля.
    Необходимо получить в любой момент времени значение этих полей этого документа,
    которые ЗАПИСАНы(физически сохранены) на диск(в БД).
    (Для ведения лога, для различных проверок, и т.д. )
    Документ сохраняется(а может и не сохранятся) только перед выходом из процедуры.
     
  19. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну так и бери из view.
    Хоть у нас с Akupak'ой небольшие расхождения по этому вопросу, этот метод таки работать должен.
     
  20. olegber

    olegber Гость

    не работает.
    Видимо lotus проссматривает по unid, какой объект-документ создан и если у объектов одинаковые unid,
    то он меняет поля в каждом из них.
     
Загрузка...

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