• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Удаление потомков всех уровней

  • Автор темы Idea
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

Idea

Доброго времени суток. Возникла следующая проблема.
В базе висит иерархия документов (до 5ти уровней вложенности). Необходимо написать кнопку для качественной чистки базы, при нажатии которой (на представлении) удалится выбранный документ вместе со всеми нижними по уровню, которые связаны с ним. Сейчас работает код:
Код:
	Dim ws As New NotesUIWorkspace
Dim sh As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument

Set db = sh.CurrentDatabase 
Set doc = db.GetDocumentByID(ws.CurrentView.CaretNoteID)
If (doc Is Nothing) Then
Msgbox "Не выбран документ для удаления"
Exit Sub
End If

If doc.Responses.Count>0 Then
doc.Responses.RemoveAll(True)
End If
doc.Remove(True)
ws.ViewRefresh
Но соответственно удаляет он только первый уровень респонсов. Подскажите, как рекурсивно копнуть до самого низа иерархии?
 
M

morpheus

Для: Idea

<!--QuoteBegin-Idea+22:05:2007, 17:16 -->
<span class="vbquote">(Idea @ 22:05:2007, 17:16 )</span><!--QuoteEBegin-->как рекурсивно копнуть до самого низа иерархии?
[snapback]66741" rel="nofollow" target="_blank[/snapback]​
[/quote]
По моему вы сами ответили на свой вопрос ..

зделать процедурку ...
Вот простой пример ... по тем же респонсам
Код:
Sub NaVikonanniDoc(Doc As NotesDocument, s As String)

If Doc.StatusRez(0)<>"2" And Doc.StatusRez(0)<>"4" Then ' не готово		
If Doc.Responses.Count=0 Then
If Len(s)>0 Then s = s + Chr(10)			
s = s + doc.Ex_ExecutorMain_Line(0)+" - "+Format(doc.Ex_Date_Line(0), "dd.mm.yyyy")	

Else
Dim tmpdoc As NotesDocument, tmpcol As NotesDocumentCollection
Set tmpcol = doc.Responses
Set tmpdoc = tmpcol.GetFirstDocument
Do Until tmpdoc Is Nothing
Call NaVikonanniDoc(tmpdoc, s)
Set tmpdoc = tmpcol.GetNextDocument(tmpdoc)
Loop
End If

End If
End Sub
 
I

Idea

Вот простой пример ... по тем же респонсам
Спасибо большое!!!
У меня ещё два глупых вопроса :angry:
1) у меня Shared Action, соответственно событие Click, а куда вставить эту процедурку. чтоб её потом вызвать? :blink:
2) я так понимаю меня как раз устроит код:
Код:
Sub DeleDoc(Doc As NotesDocument)
If Doc.Responses.Count>0 Then
Dim tmpdoc As NotesDocument, tmpcol As NotesDocumentCollection
Set tmpcol = doc.Responses
Set tmpdoc = tmpcol.GetFirstDocument
Do Until tmpdoc Is Nothing
Call DeleDoc(tmpdoc)
Set tmpdoc = tmpcol.GetNextDocument(tmpdoc)
Loop
End If
End Sub
вопрос: куда правильно впихать doc.Responses.RemoveAll(True) и doc.Remove(True)? :angry:
 
R

Ronchik

Код:
Sub DeleDoc(Doc As NotesDocument)

tmpcol As NotesDocumentCollection
Set tmpcol = doc.Responses

If tmpcol.Count>0 Then Call tmpdoc.RemoveAll(True)

End Sub
можно и просто вот так без каких либо цыклов
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Idea+22:05:2007, 19:49 -->
<span class="vbquote">(Idea @ 22:05:2007, 19:49 )</span><!--QuoteEBegin-->вопрос: куда правильно впихать doc.Responses.RemoveAll(True) и doc.Remove(True)? smile.gif
[snapback]66747" rel="nofollow" target="_blank[/snapback]​
[/quote]
Код:
Sub DeleDoc(Doc As NotesDocument)
If Doc.Responses.Count>0 Then
Dim tmpdoc As NotesDocument, tmpcol As NotesDocumentCollection
Set tmpcol = doc.Responses
Set tmpdoc = tmpcol.GetFirstDocument
Do Until tmpdoc Is Nothing
Call DeleDoc(tmpdoc)
Set tmpdoc = tmpcol.GetNextDocument(tmpdoc)
Loop
Call tmpcol.RemoveAll(True)
End If
End Sub

Главный документ удаляется после вызова процедуры.

<!--QuoteBegin-Idea+22:05:2007, 19:49 -->
<span class="vbquote">(Idea @ 22:05:2007, 19:49 )</span><!--QuoteEBegin-->1) у меня Shared Action, соответственно событие Click, а куда вставить эту процедурку. чтоб её потом вызвать?
[snapback]66747" rel="nofollow" target="_blank[/snapback]​
[/quote]
Прямо туда и вставляй. Он сам займет свое место. :)
 
I

Idea

Спасибочки :)) Щас пойду чего-нить поудаляю)))
 
I

Idea

у меня тут такой ньюанс возник. кнопочка эта предназначена админу, дабы базу по необходимости подчищать.
Загадка: админ жмет кнопку, удаляются все связанные документы, кроме документов по спец форме для логов. вроде как всё логично, НО я этого не прописывала (сознательно)!!!
По сути мне нужно, чтобы при удалении чего-либо создавался новый лог (он создается), а всё, что относилось к удаленному документу, можно тоже удалить.
Документы-логи - это тоже самые что ни на есть респонсы, то есть непонятно, почему цикл до них не добирается. Все поля формы лога типа Computed when compose. Подскажите, в чем дело, а то меня этот полтергейст напрягает.:)
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Для: Idea
Может он их просто не видит. Проверить поле Readers. Да и Authors тоже можно.
 
I

Idea

Ридерсов у этой формы нет - читай сколько угодно. Автором записан отдельный юзверь. Но я ж менеджер базы, я все равно всё это могу удалить. Только почему-то не в этой процедуре %)
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Для: Idea
Тогда дебаг тебе в руки и проверь, попадают ли они в коллекцию ответов.
 
M

morpheus

<!--QuoteBegin-Medevic+23:05:2007, 16:03 -->
<span class="vbquote">(Medevic @ 23:05:2007, 16:03 )</span><!--QuoteEBegin-->Тогда дебаг тебе в руки и проверь, попадают ли они в коллекцию ответов.
[snapback]66873" rel="nofollow" target="_blank[/snapback]​
[/quote]
Вариант : а когда созаються эти логи-респонсы вот что надо проверить
 
I

Idea

В общем в коллекцию документы эти не попадают. Если удалять документ, к которому только логи привязаны, срабатывает условие Doc.Responses.Count<0.
Вообще логи создаются лотусскриптом, код висит на Postsave. В отдельном поле храню ссылку на родительский док (для категоризации встроенных видов надо). Это дело работает. То есть вроде как лог знает, кто у него родитель. А вот родитель свои логи за респонсы не признает.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Idea+24:05:2007, 09:55 -->
<span class="vbquote">(Idea @ 24:05:2007, 09:55 )</span><!--QuoteEBegin-->Вообще логи создаются лотусскриптом, код висит на Postsave. В отдельном поле храню ссылку на родительский док (для категоризации встроенных видов надо). Это дело работает. То есть вроде как лог знает, кто у него родитель. А вот родитель свои логи за респонсы не признает.
[snapback]66919" rel="nofollow" target="_blank[/snapback]​
[/quote]
Дык наверное в этом и проблемы. Поле $Ref существует у твоих логов? Подозреваю, что нет. Т.е. лог - это не респонз.
 
I

Idea

Дык наверное в этом и проблемы. Поле $Ref существует у твоих логов? Подозреваю, что нет. Т.е. лог - это не респонз.

Хм... так оно ни на каких формах не присутствует, другое дело что создаются они или с помощью compose на формулах или на LS. Я так понимаю, что это значение этого поля надо задавать явно, если делаешь в LS создание документа через CreateDocument. Можно ли просто сделать это поле computed when compose с формулой @Text(@InheritedDocumentUniqueID) и не присваивать ему явно значение в коде?
 
M

morpheus

<!--QuoteBegin-Idea+24:05:2007, 12:58 -->
<span class="vbquote">(Idea @ 24:05:2007, 12:58 )</span><!--QuoteEBegin-->что это значение этого поля надо задавать явно
[snapback]66969" rel="nofollow" target="_blank[/snapback]​
[/quote]
НЕт, если это респонс то поле $Ref создаёться само, и на будущее поля с символом $ - это , скажем так, системные поля, созданные самим лотусом, и если вы явно создадите это поле комутетным в самого себя оно просто выведет это значение, записывать явно не надо
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Idea+24:05:2007, 13:58 -->
<span class="vbquote">(Idea @ 24:05:2007, 13:58 )</span><!--QuoteEBegin-->Я так понимаю, что это значение этого поля надо задавать явно, если делаешь в LS создание документа через CreateDocument.
[snapback]66969" rel="nofollow" target="_blank[/snapback]​
[/quote]
Обычно это делается методом notesDocument.MakeResponse.

<!--QuoteBegin-Idea+24:05:2007, 13:58 -->
<span class="vbquote">(Idea @ 24:05:2007, 13:58 )</span><!--QuoteEBegin-->Можно ли просто сделать это поле computed when compose с формулой @Text(@InheritedDocumentUniqueID) и не присваивать ему явно значение в коде?
[snapback]66969" rel="nofollow" target="_blank[/snapback]​
[/quote]
Можно. Но это будет не респонз.
 
I

Idea

To Medevic:
Спасибо большое! Всё заработало! B)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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