In Folge dessen sind zwei unserer Anwendungen auf die Nase gefallen, da es offenbar mit Notes-Versionen > 8.5.x einen Fehler im PostSave-Event gibt. Da wir in unseren Anwendungen recht selten auf das PostSave-Event überhaupt zurück greifen, ist das auch nicht vorher schon bei anderen Kunden oder Anwendungen aufgefallen.
Das Problem betrifft offenbar NotesDocument-LotusScript-Objekte von Dokumenten, die gerade erst neu angelegt wurden und vor dem PostSave das erste Mal gespeichert wurden. Offenbar ist dieses Objekt zum Zeitpunkt, in dem das PostSave ausgelöst wird, noch nicht vollständig initialisiert, so dass einige Properties oder Funktionen fehlerhafte Werte zurück geben oder gleich Fehler werfen.
Die Reihenfolge ist also folgendermaßen:
- Das Dokument wird neu erzeugt. Bei der Erzeugung wird im QueryOpen gemäß "unserem" Model-View-Controller-Konzept das Model mitsamt dem Document-Object erzeugt
- Nach einigen Eingaben wird die Speicherung ausgelöst
- Im QuerySave wird das Dokument validiert
- Das Dokument wird (nach erfolgreicher Validierung) gespeichert
- Im PostSave greifen wird auf Eigenschaften und Funktionen des Document-Objects zu, das wir im QueryOpen erzeugt haben. Dabei passieren die besagten Fehler.
Die folgenden zwei Fehler sind dabei konkret (in jeweils einer anderen Anwendung) aufgetreten, aber es mag natürlich noch mehr geben:
NotesDocument.NoteID gibt den Wert "0"
Wir rufen in einer Anwendung einen Agenten aus dem PostSave heraus auf, weil dieser den Out-of-Office-Agenten (oder Service) aktivieren soll. Beim Aufruf wird die NoteID als Kontext übergeben:
Nun mag man kein Freund davon sein, Formelsprache mit Evaluate in LotusScript auszuführen, aber zumindest funktioniert es.
Fehler mit NotesDocument.CopyToDatabase
In einer anderen Anwendung werden Dokumente im PostSave (auf Nachfrage hin) in eine Archivdatenbank kopiert. Dazu nutzen wir die Funktion:
Und die Lösung dafür ist ähnlich Facepalm-tauglich, wie die Obige.
Man hole sich die UniqueID des aktuellen Dokumentes und erzeuge sich davon ein neues Notesdocument Objekt, um darauf die Operation auszuführen. Das könnte ungefähr so aussehen:
Set newDocumentObject = notesDatabase.getDocumentByUNID(unid)
Set archiveDoc = newDocumentObject.CopyToDatabase(archiveDB)
Ich bin nicht begeistert, aber es läuft . Dieses zweite Problem war übrigens mit Notes 9 nicht mehr reproduzierbar.
Ergänzungen zu weiteren Fehlern ähnlicher Natur oder Anregungen zu Lösungsstrategien sind immer herzlichst willkommen .