• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы olegber
  • Дата начала
O

olegber

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

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

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

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

Omh

А в переменную запихнуть не?

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

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

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

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

abbatik

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

Akupaka

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

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

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

Omh

Akupaka
А копия документа работает?
Я не подкалываю, просто спрашиваю :)

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

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

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

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

Akupaka
Что-то ты ошибся чутка
Такой скрипт:
Код:
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 (до сохранения) месседжбоксит разные значения.
Значит работает.
 
A

Akupaka

забавно :)

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

Код:
	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) _
только последний раз работает "как задумано" :))
причем со всеми доками, а не только с тем, что из вида...
 
O

Omh

Я чёт под конец дня уже не осиливаю.
Надо тестовую среду делать, а у меня уже палцы болят по этому гогну стучать...
 
O

Omh

У меня в тестовой базе ни одного документа. :)

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

Akupaka

и кто после этого мне докажет, что программеры не ленивые?! :)
 
T

turumbay

Документ с диска можно поднять через db.getDocumentByUNID, предварительно уничтожив объект документа в памяти.
Код:
	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 ' документ из памяти
 
O

olegber

ws.CurrentDocument.Document? :)
Бывает что нет 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]

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

Akupaka

Жаль нет способа достать сохранённые значения полей в любой момент времени.
как нет?! а метод NotesDocument.GetFieldsDataOnTime()!


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

Бывает что нет CurrentDocument, а посмотреть старое значение необходимо.
бывает, когда УИ-документ новый

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

olegber

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

olegber

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

Omh

Ну так и бери из view.
Хоть у нас с Akupak'ой небольшие расхождения по этому вопросу, этот метод таки работать должен.
 
O

olegber

Ну так и бери из view.
Хоть у нас с Akupak'ой небольшие расхождения по этому вопросу, этот метод таки работать должен.
не работает.
Видимо lotus проссматривает по unid, какой объект-документ создан и если у объектов одинаковые unid,
то он меняет поля в каждом из них.
 
Мы в соцсетях:

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