• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Создание Response

  • Автор темы Hedg
  • Дата начала
Статус
Закрыто для дальнейших ответов.
H

Hedg

Вообщем потребовалось создать Response документ который содержит историю открытия документа-родителя. Проблема в том, как я понял, MakeResponse работает только в Back-end'e, а мне нужно повесить создаение Response и запись в него значений на QueryOpen документа-родителя, а это уже Front-end. Кто что посоветует?
 
D

DNT

Для: Hedg

А чё тут посоветовать: создаешь документ ответа и фсё. Только поля ручками придется копировать, если таковые имеются.
 
H

Hedg

Вообщем наваял я тут код который работает. Но выглядит он ховайся в жито.

Код:
Sub Postopen(Source As Notesuidocument)
Dim session As New NotesSession
Dim workspace As New NotesUIWorkspace
Dim docA As NotesUIDocument
Dim docA2 As NotesDocument
Dim docB As NotesDocument
Dim creator As String
Dim number_doc As String
Dim user As String
Dim db As NotesDatabase
Dim accessDate As Variant
Dim ID As String

Set db = session.CurrentDatabase
Set docA = workspace.CurrentDocument

user = session.UserName
Messagebox user
creator=docA.FieldGetText("Creator")
number_doc=docA.FieldGetText("Номер")

Set docA2=docA.document
accessDate = docA2.LastAccessed
ID = docA2.UniversalID

Set docB = New NotesDocument ( db )
docB.Form = "Invoice_Hystory"

Call docB.ReplaceItemValue("$Ref", ID)
Call docB.ReplaceItemValue("Creator", creator)	
Call docB.ReplaceItemValue("number_document", number_doc)
Call docB.ReplaceItemValue("readers", user+";")
Call docB.ReplaceItemValue("open_time", Cstr(accessDate))
Call docB.Save( True, True )

End Sub

Но он создаёт каждый раз новый документ, а не дописывает в старый.
И ещё какие будут предложения по его привидению в нормальный вид.
 
H

Hedg

Хождение по мукам часть 2

Код:
Sub Postopen(Source As Notesuidocument)
Dim session As New NotesSession
Dim workspace As New NotesUIWorkspace
Dim docA As NotesUIDocument
Dim docA2 As NotesDocument
Dim response As NotesDocument
Dim creator As String
Dim number_doc As String
Dim user As String
Dim db As NotesDatabase
Dim accessDate As Variant
Dim ID As String
Dim view As NotesView
Dim dc As NotesDocumentCollection

Set db = session.CurrentDatabase
Set docA = workspace.CurrentDocument
Set view = db.GetView("Response")

Set docA2=docA.document

ID = docA2.UniversalID
accessDate = docA2.LastAccessed	
user = session.UserName
creator=docA.FieldGetText("Creator")
number_doc=docA.FieldGetText("ТНомер")

Set dc = view.GetAllDocumentsByKey(number_doc)
Set docA2 = dc.GetFirstDocument
Set response = view.GetChild(docA2)

If Not (response Is Nothing) Then
Call response.ReplaceItemValue("readers", user)
Call response.ReplaceItemValue("open_time", Cstr(accessDate))
Call response.Save( True, True )

Else
Set response= New NotesDocument ( db )			
response.Form = "Invoice_Hystory"

Call response.ReplaceItemValue("$Ref", ID)
Call response.ReplaceItemValue("Creator", creator)	
Call response.ReplaceItemValue("number_document", number_doc)
Call response.ReplaceItemValue("readers", user+";")
Call response.ReplaceItemValue("open_time", Cstr(accessDate))
Call response.Save( True, True )

End If
End Sub


Вот здесь
Код:
Set response = view.GetChild(docA2)
Получаю Function requires a valid ADT argument
 
H

Hedg

docA2 всегда есть, а мне нужно найти его потомка GetChild(docA2), если он существует дописать, если его нет то создать. Если брать docA2 is Nothing - то прийдётся идти по всей коллекции и брать респонсы всех доков, а мне нужен респонс конкретного документа, открытого в текущий момен.
Я не доконца понимаю работу метода GetAllDocumentsByKey - коллекция не создаёться.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Для: Hedg
Если коллекция не создается (т.е. создается, но пустая), то docA2 is Nothing. Отсюда и ошибка.
Метод GetAllDocumentsByKey ищет в первой отсортированной колонке в представленнии по ключу.
Для получения респонсов есть свойство NotesDocument.Responses. Текущий документ хранится в параметре Source.
 
H

Hedg

docA2 не пустой - проверял.
GetAllDocumentsByKey ищет по ключу, может ли ключём являться значение поля?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Для: Hedg, если у тебя коллекция пустая, то docA2 тоже будет пустой.
Может.
 
30.05.2006
1 345
12
BIT
0
Для получения респонсов есть свойство NotesDocument.Responses.
Вот тут по-осторожнее. Это свойство безупречно работало в 4.6.х. Потом (не скажу сейчас в какой версии 5-ки или 6-ки) его разломали :( Пришлось от него оотказаться и переписывать уйму рабочих приложений. Недавно (под 6.5.5) проверял - вроде починили. Но осадок остался...
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Constantin A Chervonenko+11:09:2006, 10:05 -->
<span class="vbquote">(Constantin A Chervonenko @ 11:09:2006, 10:05 )</span><!--QuoteEBegin-->Вот тут по-осторожнее. Это свойство безупречно работало в 4.6.х. Потом (не скажу сейчас в какой версии 5-ки или 6-ки) его разломали mad.gif Пришлось от него оотказаться и переписывать уйму рабочих приложений. Недавно (под 6.5.5) проверял - вроде починили. Но осадок остался...
[snapback]43569" rel="nofollow" target="_blank[/snapback]​
[/quote]
Да я и сам почти его не использую. Слишком много проблем. Лучше GetAllDocumentsByKey с UNID в качестве ключа. Гораздо удобнее. :(
 
H

Hedg

Блин я жу незнаю что делать

Код:
Sub Postopen(Source As Notesuidocument)
Dim session As New NotesSession
Dim workspace As New NotesUIWorkspace
Dim view As NotesView
Dim dc As NotesDocumentCollection	
Dim docA2 As NotesDocument
Dim response As NotesDocument

Dim creator As String
Dim number_doc As String
Dim user As String
Dim db As NotesDatabase
Dim accessDate As Variant
Dim ID As String


Set db = session.CurrentDatabase
Set docA2=Source.Document

ID = docA2.UniversalID
accessDate = docA2.LastAccessed	
user = session.UserName
creator=Source.FieldGetText("Creator")
number_doc=Source.FieldGetText("ТНомер")

Set view = db.GetView("Таблица\Invoice Facturen")
Set dc = view.GetAllDocumentsByKey(ID)
Set docA2=view.GetFirstDocument
Set response = view.GetChild(docA2)



If Not (response Is Nothing) Then
Call response.ReplaceItemValue("readers", user)
Call response.ReplaceItemValue("open_time", Cstr(accessDate))
Call response.Save( True, True )
Messagebox "Документ истории изменён"

Else
Set response= New NotesDocument ( db )			
response.Form = "Invoice_Hystory"

Call response.ReplaceItemValue("$Ref", ID)
Call response.ReplaceItemValue("Creator", creator)	
Call response.ReplaceItemValue("number_document", number_doc)
Call response.ReplaceItemValue("readers", user+";")
Call response.ReplaceItemValue("open_time", Cstr(accessDate))
Call response.Save( True, True )
Messagebox "Документ истории создан"

End If
End Sub

Коллекция в упор создаётся пустой. Пустой она быть не должна, так как документы существуют и ключём явлется UNID текущего документа.
 
H

Hedg

Я что-то не понимаю как работает Set dc = view.GetAllDocumentsByKey(ID), осуществляет поиск в документе по переданному значению. Как оно ищет? Нужно задавать поле в котором искать или метод обходит все поля?
 
D

DNT

Я что-то не понимаю как работает Set dc = view.GetAllDocumentsByKey(ID), осуществляет поиск в документе по переданному значению. Как оно ищет? Нужно задавать поле в котором искать или метод обходит все поля?

из хелпа:

Usage
For the GetAllDocumentsByKey method to work, you must have at least one sorted column for each key.

Этот метод ищет документы по первому ОТСОРТИРОВАННОМУ столбцу.
 
H

Hedg

Т.е что бы Set dc = view.GetAllDocumentsByKey(ID) отрабатывал правильно, нужно создать представление с формулой отбора документов по форме, первый стобец которого должен отображать, для данного случая, данные из поля которое содержит UNID документа?
 
H

Hedg

Что-то не работает. Коллекция по прежнему пуста, возможно нужно задавать парметр сортировки.
GetAllDocumentsByKey(ID) , т.е. ID по чём отбирать, а какое нужно указывать значение для сортировки?
 
30.05.2006
1 345
12
BIT
0
Да я и сам почти его не использую. Слишком много проблем. Лучше GetAllDocumentsByKey с UNID в качестве ключа. Гораздо удобнее. :(
Лишняя сущность - технологическая view. Если еще и сортировка респонсов нужна, то да, удобнее.
 
H

Hedg

Да не нужна мне сортировка респонсов, мне нужно дописывать в респонс открытого документа-родителя, а я немогу его найти. По идее должна создаться коллекция из одного документа и от него браться респонс. Но коллекция пустая.
 
D

Dikobraz Grey

Код:
	Set view = db.GetView("Таблица\Invoice Facturen")
Set dc = view.GetAllDocumentsByKey(ID)
Set docA2=view.GetFirstDocument
Set response = view.GetChild(docA2)

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

Код:
Set docA2=view.GetFirstDocument

вернет тебе открытый в данный момент док (он с равным успехом может быть и в конце и в начале, и в середине вьюхи), а возвращаемый документ респонсов может и не иметь...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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