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

Тема в разделе "Lotus - Программирование", создана пользователем Ruska132, 26 ноя 2015.

  1. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    64
    Симпатии:
    0
    Добрый день.
    Подскажите ПЖ как можно из главной формы изменить во всех ответных документа значение переменной.
    т.е. есть три формы Ф1- Document, Ф2-Response и Ф3-response on response. во всех данных формах есть некие поля. и вот сам вопрос, при изменении значения поля на форме Ф1 надо чтоб в форме Ф2 и Ф3 менялись значения.
     
  2. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Код (LotusScript):
    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
     
    #2 Shandrik, 26 ноя 2015
    Последнее редактирование модератором: 26 ноя 2015
  3. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    64
    Симпатии:
    0
    а как небудь попроще можно.
    т.е. открыть главный документ, нажать кнопочку, агент отобрал все ответные документы и изменил в них значение поля.
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    @Ruska132, нет, так как уровень иерархии > 2.
    Надо брать все ответные первого уровня, затем для каждого ответного первого уровня брать все ответные второго уровня...
    Вам дали готовый код, который собирает все ответные в одну коллекцию ndcResponseCollector
    После вызова данной процедуры в объекте ndcResponseCollector будут все респонзы, осталось только StampAll сделать
     
  5. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    64
    Симпатии:
    0
    У меня ругается вот на эту строку: Type mismatch on: NDCRESPONSECOLLECTOR
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    @Ruska132, ну так там последовательность параметров неверная.
    Не видно что ли?
    Вот верный вызов:
    If AlIHierarchy Then Call GetResponses(ndResp,AlIHierarchy,condition,ndcResponseCollector)
     
  7. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    А, блин, точно, там же рекурсия. Это я решил прямо тут рефакторинг сделать :)
     
  8. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    64
    Симпатии:
    0

    А в какой момент вы заполняете коллекцию ndcResponseCollector
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    @Shandrik, ты распиши человеку, это явно "админ".
    Приведи пример вызова из кнопки на форме.
    И да, там надо коллекцию создать перед вызовом пустую, это тоже надо показать...
     
  10. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    В строке 17.
     
  11. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Ща сделаем
     
  12. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Код кнопочки:
    Код (LotusScript):
    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

    Упрощённая функция - тупо все респонзы до дна иерархии:
    Код (LotusScript):
    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
     
    #12 Shandrik, 26 ноя 2015
    Последнее редактирование модератором: 26 ноя 2015
  13. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    64
    Симпатии:
    0
    Спасибо большое. :)
     
  14. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    @Shandrik, почитай про StampAllMulti, вот это мощь теперь)
    И да, возвращать результата функции через параметр, это привычка с СИ?)
     
  15. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    ога - а goto - с базика)))
    тож самое ток без goto-

    Код (LotusScript):

    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)
     
  16. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Не помню, почему так сделал, давно это было. С не знаю.

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    @Shandrik, ну сервер то наверняка 9-ка ;) там можно
     
  18. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    А хрен его знает :)
    Мне не лень и ручкам эти методы написать.
     
  19. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Кстати, да! Автору темы следует иметь в виду, что обработаются только видимые нажавшему кнопку документы. Если респонзы разнятся по доступу, а кнопку давит обычный юзер, то код надо выполнять на сервере.
     
Загрузка...

Поделиться этой страницей