Domino 9 und frühere Versionen > ND9: Entwicklung

QueryOpen wird nicht ausgeführt

(1/2) > >>

FrankLU:
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?


--- Code: ---(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
--- Ende Code ---

Ich habe es auch schon mit Löschen des uiDocs versucht oder mit dem Nachlesen des Docs aus der DB.


--- Code: --- 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)
--- Ende Code ---

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

--- Code: --- Set uiDocNeu = ws.EditDocument(True, doc)
--- Ende Code ---
als letzte Zeile hat nicht geholfen.

Ich habe in den Code für den QueryOpen und den QueryClose einen
--- Code: ---Print "QueryOpen"
--- Ende Code ---
bzw
--- Code: ---Print "QueryClose"
--- Ende Code ---
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

Tode:
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:


--- Code: ---Call uiDoc.ImportItem(profileDoc, "Signature_Rich")
--- Ende Code ---

Voraussetzung: Dein Cursor steht im Richtextfeld und das ist editierbar...

FrankLU:
Hallo Tode!

Vielen Dank für Deine Ideen! Die Woche ist jetzt schon gerettet!  ;D

Ich denke ich, werde das mit der Variable im ReOpen-Script umsetzen. Das ist am genialsten, da ich mehrere Dokumentarten habe, in denen ich DokLInks hinzufüge oder auch selektiv lösche und nur eine Function zum Anlegen des SperrDocs.

Ich habe das Problem übrigens auch bei "alten" Dokumenten, in die ich einen DokLink einfügen will, nicht nur bei denen, die eben erst erstellt wurden.

Danke nochmals! Schönen Start in die neue Woche!

Frank

FrankLU:
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


--- Code: ---Call doc.Save(True, False)
doc.DelLock = "N"
doc.SaveOptions = 0
Call uiDoc.Close(True)
Set uiDoc = ws.EditDocument(True, doc)
--- Ende Code ---

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


--- Code: ---Call doc.Save(True, False)
doc.DelLock = "N"
doc.SaveOptions = 0
Call uiDoc.Close(True)
Set uiDoc = ws.EditDocument(True, doc)
doc.DelLock = ""
--- Ende Code ---

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.

Peter Klett:
Wenn ich es richtig verstehe, ist das ReOpen das einzige Problem.

Wenn Du in der Aktion des ReOpen in das Sperrdoc den aktuellen User als ReOpen-User einträgst, könntest Du beim Schließen des Dokuments auf das Löschen des Sperrdocs verzichten, und beim Öffnen auf die Anlage/Überprüfung (immer unter der Voraussetzung, der User ist der ReOpen-User). Dann suchst Du noch das spätestmögliche Event des zu schließenden Dokuments (vielleicht das Terminate des ersten Dokuments oder das PostOpen des zweiten Dokuments?) um den ReOpen-User zu entfernen.

Ist nur eine Idee ohne sie jemals praktisch ausprobiert zu haben

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln