ОБСУЖДЕНИЕ

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

17 ответов 3,9 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Добрый день.
Подскажите ПЖ как можно из главной формы изменить во всех ответных документа значение переменной.
т.е. есть три формы Ф1- Document, Ф2-Response и Ф3-response on response. во всех данных формах есть некие поля. и вот сам вопрос, при изменении значения поля на форме Ф1 надо чтоб в форме Ф2 и Ф3 менялись значения.
 
Код:
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, нет, так как уровень иерархии > 2.
Надо брать все ответные первого уровня, затем для каждого ответного первого уровня брать все ответные второго уровня...
Вам дали готовый код, который собирает все ответные в одну коллекцию ndcResponseCollector
После вызова данной процедуры в объекте ndcResponseCollector будут все респонзы, осталось только StampAll сделать
 
@Ruska132, ну так там последовательность параметров неверная.
Не видно что ли?
Вот верный вызов:
If AlIHierarchy Then Call GetResponses(ndResp,AlIHierarchy,condition,ndcResponseCollector)
 
А, блин, точно, там же рекурсия. Это я решил прямо тут рефакторинг сделать :)
 
@Shandrik, ты распиши человеку, это явно "админ".
Приведи пример вызова из кнопки на форме.
И да, там надо коллекцию создать перед вызовом пустую, это тоже надо показать...
 
Код кнопочки:
Код:
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
 
Последнее редактирование:
@Shandrik, почитай про StampAllMulti, вот это мощь теперь)
И да, возвращать результата функции через параметр, это привычка с СИ?)
 
функции через параметр, это привычка с СИ?)
ога - а 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, почитай про StampAllMulti, вот это мощь теперь)
И да, возвращать результата функции через параметр, это привычка с СИ?)
Не помню, почему так сделал, давно это было. С не знаю.

Contains, StampAllMulti и CreateDocumentCollection не прокатят - у нас полно 7-шных клиентов.
 
А хрен его знает :)
Мне не лень и ручкам эти методы написать.
 
@Shandrik, ну сервер то наверняка 9-ка ;)
Кстати, да! Автору темы следует иметь в виду, что обработаются только видимые нажавшему кнопку документы. Если респонзы разнятся по доступу, а кнопку давит обычный юзер, то код надо выполнять на сервере.
 

Статистика тем

Создано
Ruska132,
Последний ответ от
Shandrik,
Ответы
17
Просмотры
3 898