Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Birgit am 11.09.06 - 10:39:57
-
Hallo,
wie kann ich verhindern, das Dokumente (basierend auf der gleichen Maske) mit copy & paste dupliziert werden? Das Dokument soll aber noch weitergeleitet und gedruckt werden können. Auch soll es möglich sein, ein neues Dokument B zu erstellen, daß Feldwerte vom Dokument A übernimmt. Oder kann man irgendwie bei copy & paste einige Feldwerte löschen? Irgendeine Idee oder Lösung?
Gruß
Birgit
-
Da würde ich im QueryPaste-Events der View einfach "Continue = False" hineinschreiben. Dann wird das, zumindest auf View-Ebene geblockt.
Grüsse
Moritz
-
Oder einen Agent schreiben, der über das Event "Wenn Dokumente eingefügt werden" getriggert wird, eine Meldung ausgibt und das Dokument löscht. Das geht mit Script oder Formelsprache.
Gruß
Thomas
-
Das mit dem Agenten kannst Du vergessen: Der läuft auf dem Server und kann dem Benutzer keine Meldung ausgeben. Ausserdem läuft er asynchron: Vom Zeitpunkt zu dem ein Dokument gespeichert wird, bis zum Zeitpunkt, zu dem der Agent losläuft, vergehen mindestens 2-3 Minuten, je nach Serverlast sogar noch mehr....
Tode
-
@Tode
Wieso denn das?
Also Agentauslöser ist "wenn Dokumente eingefügt werden".
Im Agent steht:
_Usr := @Name([Abbreviate]; @UserName);
_Srv := @Name([Abbreviate]; @Subset(@DbName; 1));
_IsServer := _Usr = _Srv;
_IsMacro := @Environment("GP_ALL_PasteIt") = "<KENNUNG>";
REM;
_PasteIn := (_IsServer | _IsMacro);
REM;
REM {********************************************};
REM { HINWEIS WENN DEBUGGING ON};
REM {********************************************};
__d_DE := @Environment("GP_Debug_Level");
__d_DD := @Left(__d_DE; 1);
__d_DL := @TextToNumber(@Word(__d_DE; __d_DD; 2));
__d_DLU := @If(@IsError(__d_DL); 0; __d_DL);
REM;
__d_DML1 := "Paste in: " : " Ist Srv: " : " Ist Macro: ";
__d_DML2 := @Text(_PasteIn : _IsServer : _IsMacro);
__d_DM := @Implode(__d_DML1 + __d_DML2; "...");
@If(_DbgL > 0; @Prompt([Ok]; "Pastin"; __d_DM); "");
REM;
FIELD DocID := "" : "n/v" : @UserName;
FIELD DocAuthor := @Name([Canonicalize]; @UserName);
FIELD DocSpecStatus := "Eingefügt: " + @Name([CN]; @UserName);
REM;
@If(!_PasteIn; @Prompt([Ok]; "Hinweis"; "In dieser Anwendung ist ein manuelles Einfügen von Dokumenten nicht gestattet."); "");
@If(!_PasteIn; @DeleteDocument; "");SELECT @All
Und raus kommt (Anhang)
-
UUUPs..... da gibt es ja einen neuen AgentenTyp.... ich nehme alles zurück und behaupte das Gegenteil !
Sorry...
Tode
-
Warum worin der Sinn liegt, statt
msgbox "In dieser Anwendung ist ein manuelles Einfügen von Dokumenten nicht gestattet.",64,"Hinweis"
continue = false
im QueryPaste einen sechsundzwanzigzeiligen Agenten zu programmieren, erschliesst sich mir nicht völlig, ehrlich gesagt ::)
-
Dann lass mich Dir den Sinn erklären:
1. Querypaste muss in JEDER Ansicht stehen, vergisst Du eine, oder erstellt der Benutzer eine eigene Ansicht, dann ist Deine Funktion ausgehebelt.
2. Seit R7 gibt es für jeden Benutzer sichtbar ein "Debug Lotus Script" - Symbol in der Symbolleiste, in R6 war das wenigstens nur übers Menu aufrufbar, aber trotzdem für jeden zugänglich. Wenn Du das aktivierst, und einfach vor Deiner msgbox die Script- Ausführung stoppst, dann wars das wieder mit Paste verhindern...
3. Die 26 Zeilen Code enthalten halt auch noch ein paar weitere Bedingungen und abfragen. Natürlich kann man das auch im Agenten mit 2 Zeilen Code erschlagen.
Gruß
Tode
-
Die Lösung mit dem Paste-In-Agent hat jedoch auch einige gravierende Nachteile:
Beim o.g. Agenten benötigt der Anwender mindestens Editorrecht oder er steht in allen Dokumenten in einem Autorfeld. Auch in Dokumenten die aus anderen Anwendungen eingefügt werden, welches ja immer möglich ist.
=> KO-Kriterium in den meisten Fällen
Falls die o.g. Voraussetzung erfüllt ist, benötigt der Anwender zudem Löschrechte (@DeleteDocument). Auch das ist nicht immer gegeben.
Workaround: Anstelle des Löschens setzt man ein Feld (bspw DeleteFlag = "1") und filtert diese Dokumente aus allen Ansichten heraus.
Ich persönlich halte daher eine solche Lösung allgemein für nicht praktikabel. Nur in Sonderfällen macht es Sinn.
Andreas