Hallo Ihr lieben,
im Forum gibt es einiges zum Thema "Responses ermitteln", aber nichts wirklich für mich brauchbares, um durch mehrere Hierarchien durchzugehen...Noch dazu bin ich 'Anfänger' was LS angeht.
Zur Situation:
In einer Datenbank werden Projekte abgebildet. Das Projekt ist vom Typ "Dokument". Alle darunter anlegbaren Dokumente (z.B: Aufgaben, Vorgänge, etc.) werden "Rückantworten".
Es ist nicht auszuschließen, das Rückantworten weitere Rückantworten erhalten. (Verhält sich quasi wie eine Diskussionsdatenbank)
Das Ziel ist, das im QuerySave des Projektdokuments per Script alle darunterliegende Rückantwortdokumente (über alle Hierarchien hinweg) ermittelt werden.
Mein aktuelles Script kann dato nur die Rückantworten der 1. Hierarchie ermitteln. Damit jetzt aber über alle Hierarchien durchgeschliffen werden kann, muss jede gefundene Rückantwort auf weitere Rückantworten geprüft werden?! Könnt Ihr mir vielleicht zeigen, wie ich mein u.s. Script anpassen müßte, damit es funktioniert?
Besten Dank!
Gruß, Basti07
Sub GetAllResponses
Dim Session As New NotesSession
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim responsedoc As NotesDocument
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
Set collection = doc.Responses
Set responsedoc = collection.GetFirstDocument
While Not (responsedoc Is Nothing)
If collection.Count > 0 Then
fldThema = responsedoc.A_Thema(0)
Msgbox "Gefundene Rückantwort mit Thema '" & fldThema & "'"
>>> Hier müsste jetzt weiter geprüft werden ob Rückantworten zur Rückantwort vorhanden sind... <<<
Else
Messagebox "Nichts gefunden!"
End If
Set responsedoc = collection.GetNextDocument(responsedoc)
Wend
End Sub
Das "Durchtackern" durch eine Antworthierarchie lässt sich wunderbar durch Rekursion lösen. Im Prinzip musst du deine Funktion dahingehend anpassen, dass sie das aktuelle Dokument als Parameter bekommt und an deiner Stelle sich selbst mit dem gefundenen Antwortdokument aufruft. Etwa so:
Sub GetAllResponses(doc as NotesDocument)
.
.
.
While Not (responsedoc Is Nothing)
If collection.Count > 0 Then
fldThema = responsedoc.A_Thema(0)
Msgbox "Gefundene Rückantwort mit Thema '" & fldThema & "'"
Call GetAllResponses(responsedoc)
Else
Messagebox "Nichts gefunden!"
End If
Set responsedoc = collection.GetNextDocument(responsedoc)
Wend
End Sub
Zusätzlich musst du dann die Beschaffung des Starts aus dieser Sub herausziehen, da du ja in der Sub schon das Dokument, nach dessen Antworten du suchst, als Parameter zur Verfügung hast.
Verständlich?
Okay, die Beschaffung des Startdokuments musst du aus der Funktion herausziehen. Also etwa diese Zeilen:
Dim Session As New NotesSession
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim responsedoc As NotesDocument
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
Mit dem letzten doc rufst du dann deine Funktion auf und fängst an mit der Beschaffung der Antwortdokumente und Iteration über diese. Sprich so beginnt dann die Funktion:
Set collection = doc.Responses
Set responsedoc = collection.GetFirstDocument
While Not (responsedoc Is Nothing)
Innerhalb der While-Schleife darfst du das Springen zum nächsten Dokument nicht vergessen.
Jetzt verständlicher?
So. Nach langem hin und her hab ichs jetzt glaub hinbekommen.
Danke nochmal für die Hilfe!!!
Folgende Routine funktioniert und geht durch alle Hierarchien:
Sub SetRightsOnResponses(doc As NotesDocument)
Dim Session As New NotesSession
Dim Workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim collection As NotesDocumentCollection
Dim responsedoc As NotesDocument
Dim tmp As NotesDocument
Set uidoc = workspace.CurrentDocument
Set collection = doc.Responses
Set responsedoc = collection.GetFirstDocument
While Not (responsedoc Is Nothing)
Set tmp = collection.GetNextDocument(responsedoc)
fldThema = responsedoc.Thema(0)
Msgbox "Gefundene Rückantwort mit Thema '" & fldThema
Call SetRightsOnResponses(responsedoc)
Set responsedoc = tmp
Wend
End Sub
Gibt es eine Möglichkeit die Selbe Routine Rückwärts laufen zu lassen, ausgehend im QuerySave von einer Rückantwort? Z.B. mit '... collection.GetPrevDocument' ?
So könnte dann z.B. von einer Rückantwort (die weit unten in der Hierarchie liegt) immer auf das sog. Hauptdokument zugegriffen werden. Bei den gefundenen Dokumenten wäre ja dann logischerweise das zuletzt gefundene Dokument das richtige.
Gruß, Basti07