Hallo,
ich bin auf ein Problem gestoßen, dass mir nun wahrscheinlich das Wochenende vermiesen wird, weil mir keine Lösung einfallen will.
Ausgangssituation:
Wenn ich in einer Datenbank ein Dokument öffne, lege ich in einer zweiten Datenbank ein SperrDoc an. Im QueryOpen des uiDoc wird anhand der doc.UniversalID geprüft, ob in der Sperrsatz-DB ein SperrDoc mir einer solchen UNID vorhanden ist. Wenn ja, kann bekommt der User einen Hinweis und kann das Dokument nicht öffnen.
Im QueryClose wird das SperrDoc dann über die UNID gefunden und gelöscht.
Problem:
Das Dokument ist geöffnet, das SperrDoc erstellt. Nun möchte ich per Masken-Knopf eine Dokumentenverknüpfung in ein RichTextFeld (RTF) einfügen. Das Knopf-Scribt ruft die Function DokLnkEinf in einer Scriptlibrary auf. Das klappt auch alles wunderbar.
Um nun das neue bzw. geänderte RTF nun auch im uiDoc sichtbar zu machen, wird zum Schluss des Knopf-Scripts das Hintergrund-Dokument gespeichert, das uiDoc geschlossen, um dann gleich neu geladen zu werden. Das klappt auch. Aber:
Beim Schließen des uiDocs wird der QueryClose ausgeführt und das SperrDoc gelöscht. Beim erneuten Öffnen des uiDocs wird aber der QueryOpen nicht wieder ausgeführt, das heißt, es wird kein neues SperrDoc angelegt. Warum?
(Declarations)
Dim ws as NotesUIWorkspace
Dim doc as NotesDocument
Dim uiDoc as NotesUIDocument
Sub Initialize
Set ws = New NotesUIWorkspace
End Sub
Function DokLnkEinf
Set uiDoc = ws.CurrentDocument
Set doc = uiDoc.Document
...
Call doc.Save(True, False)
Call uiDoc.Close(True)
Set uiDoc = ws.EditDocument(True, doc)
End Function
Ich habe es auch schon mit Löschen des uiDocs versucht oder mit dem Nachlesen des Docs aus der DB.
DocUID = doc.UniversalID
Call doc.Save(True, False)
Call uiDoc.Close(True)
Set uiDoc = Nothing
Set doc = db.GetDocumentByUNID(DocUID)
Set uiDoc = ws.EditDocument(True, doc)
Auch hier wird das angezeigte Doc geschlossen, und das Doc in einem neuen Reiter geöffnet. Das sieht man, wenn das bearbeitet Doc, das seinen Reiter zwischen anderen Reitern hatte, mit einem mal im letzten Reiter angezeigt wird.
Auch ein zweites uiDoc, wie
Set uiDocNeu = ws.EditDocument(True, doc)
als letzte Zeile hat nicht geholfen.
Ich habe in den Code für den QueryOpen und den QueryClose einen bzw eingefügt, aber ein zweites "QueryOpen" wird nicht in der Statuszeile ausgegeben.
Wie bekomme ich den QueryOpen ausgeführt? Ich wollte ungerne den Code im QueryOpen nochmal in das Knopf-Script einfügen.
Schönes Wochenende!
Frank
Das Problem kommt daher, dass ein Dokument, das neu erstellt wurde und nach dem speichern noch nicht wieder geschlossen und erneut geöffnet wurde irgendwie einen "seltsamen" Status in Notes hat.
Ich glaube nicht, dass Du das umgehen kannst, deshalb würde ich das Problem andersrum aufzäumen: ich würde in meinem Reopen- Script eine z.B Umgebungsvariable setzen.
Im QueryClose würde ich dann abfragen, ob die Variable gesetzt ist, und wenn ja: Lock- Doc nicht löschen....
Ein anderer Ansatz wäre: Du verwendest das (nicht dokumentierte) NotesUIDocument.ImportItem wie es in der InserSignature- Funktion der CoreEmailClasses in der Mailschablone verwendet wird:
Du baust Dir Deinen Doclink in einem Richtextitem in einem Profil- Dokument (inklusive speichern natürlich) und verwendet dann:
Call uiDoc.ImportItem(profileDoc, "Signature_Rich")
Voraussetzung: Dein Cursor steht im Richtextfeld und das ist editierbar...
Hallo nochmal,
leider klappte das mit dem Setzen einer Variablen doch nicht so, wie ich es erhofft hatte. Es traten mehrere Probleme auf.
Das Hauptproblem: Der ws.EditDocument öffnet ein zweites uiDoc, anstatt erst das eine uiDoc zu schließen und dann das andere uiDoc zu öffnen, trotzdem der uiDoc.Close ein "True" enthält.
1. Problem
Call doc.Save(True, False)
doc.DelLock = "N"
doc.SaveOptions = 0
Call uiDoc.Close(True)
Set uiDoc = ws.EditDocument(True, doc)
Diese Version klappt nur bei uiDocs, die sich im Schreib-Modus befinden. Nur dann wird der Feldwert von DelLock an das uiDoc weitergegeben. Das ist aber wichtig, weil im QueryClose nur das uiDoc übergeben wird. Ein uiDoc.FieldSetText oder ein uiDoc.Refresh setzt ebenfalls ein uiDoc im Schreib-Modus voraus. Bei uiDocs, die nur im Lese-Modus ihr RT-Feld erhalten/verändert bekommen, wird ein leeres DelLock im QueryClose übergeben.
2. Problem
Es werden zwei uiDocs geöffnet, die beide den Feldwert DelLock = "N" enthalten. Das erste uiDoc wird geschlossen, das zweite bleibt mit gesetztem Feldwert stehen. Wie bekomme ich den Feldwert wieder zurück gesetzt? Wenn sich das uiDoc im Lese-Modus befände, könnte ich den Feld-Wert über einen Bearbeiten-Knopf zurücksetzen. Wenn aber der User das Dokument einfach schießt (egal, in welchem Edit-Modus), bleibt der Feldwert erhalten und das SperrDoc wird nie gelöscht. Und den Feldwert im QueryOpen zurückzusetzen funktioniert ja nicht und ist ja das grundlegende Problem.
3. Problem
Call doc.Save(True, False)
doc.DelLock = "N"
doc.SaveOptions = 0
Call uiDoc.Close(True)
Set uiDoc = ws.EditDocument(True, doc)
doc.DelLock = ""
Dieser Code funktioniert auch nicht, weil es zum Ausführungszeitpunkt zwei gleiche uiDocs gibt. In beiden (!) wird das Feld DelLock also zurückgesetzt, bevor er im QueryClose des ersten uiDoc verarbeitet werden kann. Das SperrDoc wird also auch hier immer gelöscht und bleibt nicht bestehen.
Lösung
Noch keine. :'(
Bevor nicht alles an Scripten gelaufen ist, wird das erste uiDoc nicht geschlossen. Daher nützt es auch nichts, im Knopf zum Aufrufen der Erstellung/Änderung des RT-Felds abschließend quasi manuell einen neuen Sperrsatz durch Aufruf der entsprechenden Function anlegen zu wollen, nachdem alle Functions der Script-Library der RT-Feld-Änderung ausgeführt wurden. Denn der Sperrsatz ist schon da und wird dann gelöscht, wenn das erste uiDoc geschlossen wird.
Danke nochmals für Eure Hilfe.