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

Тема в разделе "Lotus - Программирование", создана пользователем Idea, 22 май 2007.

Статус темы:
Закрыта.
  1. Idea

    Idea Гость

    Доброго времени суток. Возникла следующая проблема.
    В базе висит иерархия документов (до 5ти уровней вложенности). Необходимо написать кнопку для качественной чистки базы, при нажатии которой (на представлении) удалится выбранный документ вместе со всеми нижними по уровню, которые связаны с ним. Сейчас работает код:
    Код (Text):
        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
    Но соответственно удаляет он только первый уровень респонсов. Подскажите, как рекурсивно копнуть до самого низа иерархии?
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: 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]
    По моему вы сами ответили на свой вопрос ..

    зделать процедурку ...
    Вот простой пример ... по тем же респонсам
    Код (Text):
    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
     
  3. Idea

    Idea Гость

    Спасибо большое!!!
    У меня ещё два глупых вопроса :angry:
    1) у меня Shared Action, соответственно событие Click, а куда вставить эту процедурку. чтоб её потом вызвать? :blink:
    2) я так понимаю меня как раз устроит код:
    Код (Text):
    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:
     
  4. Ronchik

    Ronchik Гость

    Код (Text):
    Sub DeleDoc(Doc As NotesDocument)

    tmpcol As NotesDocumentCollection
    Set tmpcol = doc.Responses

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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]
    Код (Text):
    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]
    Прямо туда и вставляй. Он сам займет свое место. :)
     
  6. Idea

    Idea Гость

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

    Idea Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Idea
    Может он их просто не видит. Проверить поле Readers. Да и Authors тоже можно.
     
  9. Idea

    Idea Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Idea
    Тогда дебаг тебе в руки и проверь, попадают ли они в коллекцию ответов.
     
  11. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    <!--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]
    Вариант : а когда созаються эти логи-респонсы вот что надо проверить
     
  12. Idea

    Idea Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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 существует у твоих логов? Подозреваю, что нет. Т.е. лог - это не респонз.
     
  14. Idea

    Idea Гость

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    <!--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 создаёться само, и на будущее поля с символом $ - это , скажем так, системные поля, созданные самим лотусом, и если вы явно создадите это поле комутетным в самого себя оно просто выведет это значение, записывать явно не надо
     
  16. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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]
    Можно. Но это будет не респонз.
     
  17. Idea

    Idea Гость

    To Medevic:
    Спасибо большое! Всё заработало! B)
     
Загрузка...
Статус темы:
Закрыта.

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