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

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

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

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

Как Пройтись По Всем Респонсам

  • Автор темы Baneslaer
  • Дата начала
B

Baneslaer

Ребят, сильно не пинайте, подскажите как правильно сделать.
Нужно пройтись по определенному документу и всем его респонсам и внести определенные правки.
Вложенность респоносов "до 5 уровней вниз".

начал писать так:

...
Set curdoc = curdb.Getdocumentbyunid("...")

If Not curdoc Is nothing Then
.....
Set respcol = curdoc.Responses
Set respdoc = respcol.Getfirstdocument()

While Not respdoc Is Nothing
.....
Set respdoc = respcol.Getnextdocument(respdoc)
Wend

End If

но так мы захватываем только 1 уровень респонсов. Для остальных уровней, как-то смущает писать аналогичную конструкцию.
Подскажите, как сделать правильно.
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
Для остальных уровней, как-то смущает писать аналогичную конструкцию.
Нечего смущаться) Рекурсия. Делаем тоже самое для каждого документа и так далее.
Можно(Нужно) просто функцию написать, в которую параметром передаем документ, а внутри функции обрабатываем каждый документ в цикле.
И там же в цикле вызываем эту же функцию.
Код:
Sub Perebor(param as notesDocument)
Set respcol = param.Responses
if respCol.Count < 1 then Exit Sub
Set respdoc = respcol.Getfirstdocument()

While Not respdoc Is Nothing
.....
Call Perebor(respdoc)
Set respdoc = respcol.Getnextdocument(respdoc)
Wend
End Sub
Но, если у всех уровней есть один общий признак, скажем какое-то поле, которое прописано в основном документе и транслируется во все ответные и в ответные ответных и в ответные в ответных, которые к ответным... Но с другим именем поля(это важно)
То можно построить представление, в котором отобразить все документы, без уровней, которые отсортированы по этому наследуемому полю.
И брать сразу все документы из этого представления по ключу, а ключ - поле из основного документа.
И потом один цикл для всей этой коллекции.
Но этот метод подходит, только если архитектура позволяет.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
как вариант - получить родителя а от него нафигатор CreateViewNavFromDescedants
и перебирайте в одном цикле всю коллекцию
 
B

Baneslaer

сделал и через коллекцию и через вьюху.
Пробегает удачно по всем докам и делает с ними то что надо.
Но в конце вылетает ошибка- "expression out of range"
Как от нее избавиться, подскажите.
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
По коду надо смотреть, вставте это в код (пример для PostOpen) :
Код:
Sub Postopen
On Error Goto handler
Const FuncName = {Sub "Postopen" }
Dim ErrStr As String

' Весь ваш код

Exit sub
handler:
ErrStr = FuncName & ": " & Err &", в строке " & Erl & chr(10) & chr(13)& Error$
msgbox ErrStr,16
Exit sub
End sub
 
B

Baneslaer

>savl

сделал по примеру приведенному в самом начале.
Проходит по всем докам и когда респонсов не остается, тогда и вылетает ошибка.
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
:) Может я что не так написал)
Он строку с ошибкой выдал? что в этой строке?
Если в коде тайны нет, можно глянуть?
 
B

Baneslaer

Но в конце вылетает ошибка- "expression out of range"
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
ок... В конце, так в конце... И строки нет...
в Debug'ере смотрели когда?
Можно код увидеть?
 
B

Baneslaer

savl

разобрался в тот же день, просто стыдно признаться - забыл написать в конце Exit sub
Спасибо за помощь =)
 
Мы в соцсетях:

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