Создание Response

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

Hedg

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

DNT

Постоялец форума
Lotus team
12.10.2005
590
7
37
Украина, Одесса
#2
Для: Hedg

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

Hedg

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

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

Гость
#4
Хождение по мукам часть 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

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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
36
Россия, Калуга
#7
Для: Hedg
Если коллекция не создается (т.е. создается, но пустая), то docA2 is Nothing. Отсюда и ошибка.
Метод GetAllDocumentsByKey ищет в первой отсортированной колонке в представленнии по ключу.
Для получения респонсов есть свойство NotesDocument.Responses. Текущий документ хранится в параметре Source.
 
H

Hedg

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

Constantin A Chervonenko

Well-Known Member
Lotus team
#10
Для получения респонсов есть свойство NotesDocument.Responses.
Вот тут по-осторожнее. Это свойство безупречно работало в 4.6.х. Потом (не скажу сейчас в какой версии 5-ки или 6-ки) его разломали :( Пришлось от него оотказаться и переписывать уйму рабочих приложений. Недавно (под 6.5.5) проверял - вроде починили. Но осадок остался...
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
36
Россия, Калуга
#11
<!--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

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

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

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

DNT

Постоялец форума
Lotus team
12.10.2005
590
7
37
Украина, Одесса
#14
Я что-то не понимаю как работает 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

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

Hedg

Гость
#17
Что-то не работает. Коллекция по прежнему пуста, возможно нужно задавать парметр сортировки.
GetAllDocumentsByKey(ID) , т.е. ID по чём отбирать, а какое нужно указывать значение для сортировки?
 

Constantin A Chervonenko

Well-Known Member
Lotus team
#18
Да я и сам почти его не использую. Слишком много проблем. Лучше GetAllDocumentsByKey с UNID в качестве ключа. Гораздо удобнее. :(
Лишняя сущность - технологическая view. Если еще и сортировка респонсов нужна, то да, удобнее.
 
H

Hedg

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

Dikobraz Grey

Гость
#20
Код:
	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
вернет тебе открытый в данный момент док (он с равным успехом может быть и в конце и в начале, и в середине вьюхи), а возвращаемый документ респонсов может и не иметь...
 
Статус
Закрыто для дальнейших ответов.