Задать значение полю, в ответных документах

Ruska132

Well-known member
21.01.2015
66
0
#1
Добрый день.
Подскажите ПЖ как можно из главной формы изменить во всех ответных документа значение переменной.
т.е. есть три формы Ф1- Document, Ф2-Response и Ф3-response on response. во всех данных формах есть некие поля. и вот сам вопрос, при изменении значения поля на форме Ф1 надо чтоб в форме Ф2 и Ф3 менялись значения.
 

Shandrik

Lotus team
30.12.2010
269
12
#2
Код:
Sub GetResponses(nd As NotesDocument,AlIHierarchy As Boolean,condition As String, ndcResponseCollector As NotesDocumentCollection)
'Собирает все видимые ветви иерархии респонзов документа nd, удовлетворяющие условию condition
'AlIHierarchy = True - вернуть всю иерархию респонзов
Dim ndcResp As NotesDocumentCollection
Dim ndResp As NotesDocument
Dim v
'======================================================================
On Error Goto errh
Set ndcResp=nd.Responses
If ndcResp Is Nothing Then Goto ex
If ndcResp.Count=0 Then Goto ex
Set ndResp=ndcResp.GetFirstDocument
While Not ndResp Is Nothing
If ndResp.IsValid Then
If ndcResponseCollector.GetDocument(ndResp) Is Nothing Then
v=Evaluate(condition,ndResp)
If v(0)=1 Then Call ndcResponseCollector.AddDocument(ndResp)
If AlIHierarchy Then Call GetResponses(ndResp,ndcResponseCollector,AlIHierarchy,condition)
End If
End If
Set ndResp=ndcResp.GetNextDocument(ndResp)
Wend
ex:
Exit Sub
errh:
Error Err,Error$ & " в " & ModuleName & ": " & Getthreadinfo(1) & " (l. " & Cstr(Erl) & ")"
End Sub

Потом сделать stampall
 
Последнее редактирование модератором:

Ruska132

Well-known member
21.01.2015
66
0
#3
а как небудь попроще можно.
т.е. открыть главный документ, нажать кнопочку, агент отобрал все ответные документы и изменил в них значение поля.
 

savl

Lotus team
28.10.2011
2 136
105
#4
@Ruska132, нет, так как уровень иерархии > 2.
Надо брать все ответные первого уровня, затем для каждого ответного первого уровня брать все ответные второго уровня...
Вам дали готовый код, который собирает все ответные в одну коллекцию ndcResponseCollector
После вызова данной процедуры в объекте ndcResponseCollector будут все респонзы, осталось только StampAll сделать
 

savl

Lotus team
28.10.2011
2 136
105
#6
@Ruska132, ну так там последовательность параметров неверная.
Не видно что ли?
Вот верный вызов:
If AlIHierarchy Then Call GetResponses(ndResp,AlIHierarchy,condition,ndcResponseCollector)
 

Shandrik

Lotus team
30.12.2010
269
12
#7
А, блин, точно, там же рекурсия. Это я решил прямо тут рефакторинг сделать :)
 

savl

Lotus team
28.10.2011
2 136
105
#9
@Shandrik, ты распиши человеку, это явно "админ".
Приведи пример вызова из кнопки на форме.
И да, там надо коллекцию создать перед вызовом пустую, это тоже надо показать...
 

Shandrik

Lotus team
30.12.2010
269
12
#12
Код кнопочки:
Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim ndParent As NotesDocument
Dim ndcResp As NotesDocumentCollection
Set ndParent=ws.CurrentDocument.Document
Set ndcResp=ndParent.ParentDatabase.GetProfileDocument("ectbJIu7Ku3HbHaMapce?").Responses
Call GetResponses(ndParent,ndcResp)
If ndcResp.Count>0 Then
Call ndcResp.StampAll("ChildField1",ndParent.GetItemValue("ParentField1")(0))
Call ndcResp.StampAll("ChildField2",ndParent.GetItemValue("ParentField2")(0))
End If
End Sub

Упрощённая функция - тупо все респонзы до дна иерархии:
Код:
Sub GetResponses(nd As NotesDocument,ndcResponseCollector As NotesDocumentCollection)
Dim ndcResp As NotesDocumentCollection
Dim ndResp As NotesDocument
On Error Goto errh
Set ndcResp=nd.Responses
If ndcResp Is Nothing Then Goto ex
If ndcResp.Count=0 Then Goto ex
Set ndResp=ndcResp.GetFirstDocument
While Not ndResp Is Nothing
If ndResp.IsValid Then
If ndcResponseCollector.GetDocument(ndResp) Is Nothing Then
Call ndcResponseCollector.AddDocument(ndResp)
Call GetResponses(ndResp,ndcResponseCollector)
End If
End If
Set ndResp=ndcResp.GetNextDocument(ndResp)
Wend
ex:
Exit Sub
errh:
Error Err,Error$ & " в  " & Getthreadinfo(1) & " (l. " & Cstr(Erl) & ")"
End Sub
 
Последнее редактирование модератором:

savl

Lotus team
28.10.2011
2 136
105
#13
@Shandrik, почитай про StampAllMulti, вот это мощь теперь)
И да, возвращать результата функции через параметр, это привычка с СИ?)
 

rinsk

Lotus team
12.11.2009
904
44
#14
функции через параметр, это привычка с СИ?)
ога - а goto - с базика)))
тож самое ток без goto-

Код:
Function GetResponseTree(doc As NotesDocument,cl As NotesDocumentCollection) As NotesDocumentCollection
Dim clres As NotesDocumentCollection
Dim docres As NotesDocument
Set clres=doc.Responses
Set docres=clres.Getfirstdocument()
While Not docres Is Nothing
If Not cl.Contains(docres) Then Call cl.Adddocument(docres)
GetResponseTree docres,cl
Set docres=clres.Getnextdocument(docres)
Wend
Set GetResponseTree=cl
End Function
вызов - Set clret=GetResponseTree(doc,doc.Parentdatabase.CreateDocumentCollection)
 

Shandrik

Lotus team
30.12.2010
269
12
#15
@Shandrik, почитай про StampAllMulti, вот это мощь теперь)
И да, возвращать результата функции через параметр, это привычка с СИ?)
Не помню, почему так сделал, давно это было. С не знаю.

Contains, StampAllMulti и CreateDocumentCollection не прокатят - у нас полно 7-шных клиентов.
 

Shandrik

Lotus team
30.12.2010
269
12
#17
А хрен его знает :)
Мне не лень и ручкам эти методы написать.
 

Shandrik

Lotus team
30.12.2010
269
12
#18
@Shandrik, ну сервер то наверняка 9-ка ;)
Кстати, да! Автору темы следует иметь в виду, что обработаются только видимые нажавшему кнопку документы. Если респонзы разнятся по доступу, а кнопку давит обычный юзер, то код надо выполнять на сервере.