Eine Zeit lang habe ich gerne mit Antwortdokumenten
in Lotus Notes gearbeitet. Ich mochte die Art, wie sie eindeutige Beziehungen
zwischen verschiedenen Dokumenten herstellten. In letzter Zeit bin ich
ein wenig davon abgekommen, weil Antwortdokumente in bestimmten Bereichen
unflexibel sind. Nun bin ich auf einen eigenartigen Fehler gestoßen, der
mein Vertrauen in die Antworthierarchien ein wenig erschüttert.
Für eine Anwendung sollten Hauptdokumente
inklusive ihrer Antwortdokumente kopiert werden. Mit einer Kombination
aus NotesDocument.CopyToDatabase und NotesDocument.MakeResponse eigentlich
kein Problem. Bis die Anwender sich darüber beschwerten, dass beim Löschen
von Hauptdokumenten auf einmal die falschen Antwortdokumente mit gelöscht
wurden.
In der Anwendung war im Postdocumentdelete-Event
eine Funktion implementiert, dass beim Löschen eines Hauptdokumentes über
die Eigenschaft NotesDocument.Responses auch die zugehörigen Antwortdokumente
mit gelöscht wurden.
Es hat mich einige Zeit gekostet herauszubekommen,
wo das Problem lag. Ich habe mir dazu eine kleine Testdatenbank gebaut.
In der Datenbank habe ich dann ein Hauptdokument und zwei Antwortdokumente
erstellt.
Mit Hilfe eines Agenten habe ich wie
oben beschrieben Kopien angelegt. Auf den ersten Blick sieht alles ganz
normal aus. Das $Ref-Feld in den kopierten Antwortdokumenten verweist auf
das kopierte Hauptdokument.
Weil man das Löschen von Dokumenten
so schwer im Screenshot zeigen kann, habe ich mich entschlossen die Dokumente
einzufärben. Dabei werden die Farbwerte in das Hauptdokument und mittels
der Eigenschaft NotesDocument.Responses in die Antwortdokumente geschrieben.
Um so erstaunter war ich, das reproduzierbar
immer das erste kopierte Antwortdokument mit eingefärbt wurde. Dieses eigenartige
Verhalten konnte sowohl unter 6.5.6 als auch unter 7.0.3 nachgestellt werden.
Mit ein wenig Probieren habe ich den
Fehler eingrenzen können.
Set
docCopy = db.CreateDocument
Call docOriginal.CopyAllItems(docCopy)
Call docCopy.ReplaceItemValue("Subject", docOriginal.GetItemValue("Subject")(0) & "
(Copy)")
If docOriginal.Responses.Count <> 0 Then
Call
CopyResponses(docOriginal, docCopy)
End If
Call docCopy.Save(True,
True, True)
Beim Erstellen der Kopien wurde das
kopierte Hauptdokument erst gespeichert, nachdem die Antwortdokumente kopiert
und zugewiesen wurden. Nachdem ich die Reihenfolge umgestellt hatte und
zuerst gespeichert und dann die Antwortdokumente kopiert hatte, trat der
Fehler nicht mehr auf.
Wer es selber einmal ausprobieren möchte,
hier ist die Beispieldatenbank.
Update:
Anbei der Code wie die Kopien erstellt
werden können, ohne das dieser Fehler auftritt.
Set
docCopy = db.CreateDocument
Call docOriginal.CopyAllItems(docCopy)
Call docCopy.ReplaceItemValue("Subject", docOriginal.GetItemValue("Subject")(0) & "
(Copy)")
Call docCopy.Save(True, True, True)
If docOriginal.Responses.Count <> 0 Then
Call
CopyResponses(docOriginal, docCopy)
End If