• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Ruska132
  • Дата начала
R

Ruska132

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

Shandrik

Код:
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
 
Последнее редактирование:
R

Ruska132

а как небудь попроще можно.
т.е. открыть главный документ, нажать кнопочку, агент отобрал все ответные документы и изменил в них значение поля.
 

savl

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
@Ruska132, ну так там последовательность параметров неверная.
Не видно что ли?
Вот верный вызов:
If AlIHierarchy Then Call GetResponses(ndResp,AlIHierarchy,condition,ndcResponseCollector)
 
S

Shandrik

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
@Shandrik, ты распиши человеку, это явно "админ".
Приведи пример вызова из кнопки на форме.
И да, там надо коллекцию создать перед вызовом пустую, это тоже надо показать...
 
S

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
 
Последнее редактирование:

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
@Shandrik, почитай про StampAllMulti, вот это мощь теперь)
И да, возвращать результата функции через параметр, это привычка с СИ?)
 

rinsk

Lotus Team
12.11.2009
1 151
125
BIT
3
функции через параметр, это привычка с СИ?)
ога - а 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)
 
S

Shandrik

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

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

Shandrik

А хрен его знает :)
Мне не лень и ручкам эти методы написать.
 
S

Shandrik

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

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