Hallo,
hier erstmal mein Code:
Sub costcalc(doc As NotesDocument)
If Not (doc Is Nothing) Then
Set dctemp = doc.Responses
If dctemp.Count > 0 Then 'gehe bis in die letzte Ebene
Set doc = dc.GetNextDocument(doc)
Call costcalc(doc)
Else
Call dcresp.Adddocument(doc)
Set doc = dc.GetNextDocument(doc)
Call costcalc(doc)
End If
End If
End Sub
dc ist die Collection mit allen Dokumenten und dcresp habe ich als "leer" initialisiert.
Ziel des ganzen ist es, alle Antwortdokumente zu bekommen, die keine Antworten selbst mehr haben.
Das funktioniert auch soweit mit vielleicht 50 Dokumenten, aber bei mehr schreit der Compiler immer Out Of Stack Space.
Hat da jemand einen Tipp?
Danke vielmals!!!
Hab jetzt keine Zeit darüber nachzudenken, aber für mich sieht dein Ansatz auch ein bischen ungewöhnlich aus.
Eher so:
Dim ebene as Integer ' in declarations als globale Variable
Dim dcAntwortOhneAntworten As NotesDocumentCollection
ebene = 0
dcAntwortOhneAntworten als leere Collections erzeugen (z.B. über db.unprocessedDocuments wenn keine Dokumente in Ansichten angehakt oder ähnliches.
Sub costCalc (col As NotesDocumentCollection)
ebene = ebene + 1
set doc = col.getFirstDocument ' hier war ein bug.
do until doc is Nothing
if doc.responses.count > 0 then
costCalc (doc.responses)
else
if ebene > 1 then
dcAntwortOhneAntworten.addDocument(doc)
end if
Loop
ebene = ebene - 1
end sub
Hinweis: colRes verwendet statt den umständlichen Namen.
Sub costCalc (col As NotesDocumentCollection, ebene As Integer)
set doc = col.getFirstDocument ' HIER WAR VORHER EIN BUG
do until doc is Nothing
if doc.responses.count > 0 then
costCalc (doc.responses, ebene +1)
else
if ebene > 0 then
colRes.addDocument(doc)
end if
Loop
end sub
Noch besser. Mit den Parametern: (Collection mit allen Hauptdokumenten, 0) aufgerufen. Sollte funktionieren. Ebene hier nicht mehr global deklarieren. Das Ergebnis (dcAntwortOhneAntworten) muß hingegen global bleiben. Könnte man aber vermutlich auch noch lokal machen, wenn man das als Return Wert und Übergabeparameter verwendet.
Function colRes1 (col As NotesDocumentCollection, costCol As NotesDocumentCollection, ebene As Integer) As NotesDocumentCollection
set doc = col.getFirstDocument
do until doc is Nothing
if doc.responses.count > 0 then
colRes = costCalc (doc.responses, colRes, ebene +1)
else
if ebene > 0 then
colRes.addDocument(doc)
end if
Loop
colRes1 = colRes
end funtion
Probier bitte mal aus (hab ich nicht gemacht).
Wenn man zuviel programmiert, vor allem rekursiv, dann sieht man den Wald vor lauter Baeumen nicht mehr:
For i = 1 To dc.Count
If Not (doc Is Nothing) Then
Set dctemp = doc.Responses
If dctemp.Count > 0 Then
Set doc = dc.GetNextDocument(doc)
Else
Call dcresp.Adddocument(doc)
Set doc = dc.GetNextDocument(doc)
End If
End If
Next i
Darauf waere jeder Anfaenger gekommen, aber wir nicht ;D
Danke fuer eure Hilfe!