%REM
Function <b>GetAllResponses</b>
Description: получение всей иерархии ответов переданного документа
алгоритм без использования рекурсии
<br>
<b>Параметры:</b>
<b>ndBase</b> - документ
<b>iErrGen</b> - параметр управления генерацией ошибок; возможные значения:
• 0 - не генерировать никаких ошибок;
• 1 - генерировать только критические ошибки, остальные игнорируются одновременно с выходом из функции;
• 2 - генерировать любые ошибки
<br>
<b>Функция возвращает:</b>
<b>• Nothing - при наличии ошибок при работе функции, но отсутствии их генерации (чтобы извне м.б. понять, что что-то всё-таки не так)
<b>• NotesDocumentCollection</b> - коллекцию документов в случае отсутствия ошибок
<b>Критические ошибки:</b>
• 4189 - документ является ответом к самому себе либо зацикленная иерархия
<b>Некритические ошибки:</b>
• 91 - при ndBase = Nothing
• 4410 - при отсутствии доступа к ndBase
• 4434 - если ndBase является удалённым
• 4696 - при ndBase.Responses = Nothing
%END REM
Function GetAllResponses(ndBase As NotesDocument, iErrGen As Integer) As NotesDocumentCollection
On Error GoTo ErrH
Const ErrObjectVariableNotSet = 91
Const lsERR_LSXUI_DOC_OBJ_NOT_VALID = 4410
Dim ndcResp As NotesDocumentCollection, ndcProc As NotesDocumentCollection
Dim ndResp As NotesDocument
If ndBase Is Nothing Then
If iErrGen <> 2 Then Exit Function
Error ErrObjectVariableNotSet, "В функцию передан неинициализированный объект ndBase!"
End If
If Not ndBase.IsValid Then
If iErrGen <> 2 Then Exit Function
Error lsERR_LSXUI_DOC_OBJ_NOT_VALID, "Отсутствует доступ к документу " + ndBase.UniversalID
End If
If ndBase.IsDeleted Then
If iErrGen <> 2 Then Exit Function
Error lsERR_NOTES_DOCUMENT_DELETED, "Документ " + ndBase.UniversalID + " был удалён"
End If
Dim ndb As NotesDatabase
Set ndb = ndBase.ParentDatabase
Dim ndcResult As NotesDocumentCollection
Set ndcResult = ndb.CreateDocumentCollection()
Set ndcResp = ndBase.Responses
If ndcResp Is Nothing Then
If iErrGen <> 2 Then Exit Function
Error lsERR_NOTES_DOCUMENTCOLLECTION_MISSING, "Документ " + ndBase.UniversalID + " повреждён либо ко всем его ответам у <" + ndb.Parent.UserName + "> нет доступа"
End If
If ndcResp.Count > 0 Then
'очередь обработки
Dim lstQueue List As NotesDocumentCollection
'счётчик коллекций для обработки
Dim iQCount As Integer
'тег (UNID) документа, по которому сохраняются коллекции в очередь, и из которого будут удаляться уже отработанные
Dim sQTag As String
Set lstQueue(ndBase.UniversalID) = ndcResp
iQCount = 1
Do
ForAll ndc In lstQueue
sQTag = ListTag(ndc)
'обработка единичного документа
Set ndResp = ndc.GetFirstDocument()
While Not ndResp Is Nothing
'добавляем документ в результирующую коллекцию
Call ndcResult.AddDocument(ndResp)
'добавляем коллекцию его ответов в очередь обработки
Set ndcResp = ndResp.Responses
If ndcResp.Count > 0 Then
If ndResp.UniversalID = ndcResp.GetFirstDocument().UniversalID Then
If iErrGen = 0 Then Exit Function
Error lsERR_NOTES_RESPONSE_FAILED, "Документ " + ndResp.UniversalID + " является ответным к самому себе" 'см. $REF
End If
Set lstQueue(ndResp.UniversalID) = ndcResp
iQCount = iQCount + 1
End If
Set ndResp = ndc.GetNextDocument(ndResp)
Wend
'убираем текущую коллекцию из очереди обработки
Erase lstQueue(sQTag)
iQCount = iQCount - 1
End ForAll
If iQCount = 0 Then Exit Do
Loop
End If
Set GetAllResponses = ndcResult
Quit:
Exit Function
ErrH:
Select Case Err
Case lsERR_NOTES_ADDDOC_DUP:
'Ошибка при повторном добавлении документа в коллекцию
If iErrGen = 0 Then Resume Quit
Error lsERR_NOTES_RESPONSE_FAILED, "Зацикленная иерархия! Документ " + ndResp.UniversalID
End Select
Error Err, GetThreadInfo(1) & { (} & Erl & {) -> } + Error$
End Function