Autor(en): Bernhard Koehler
Stand: 07.01.2005
Version: 1.00
Notes-Versionen: 4.x, 5.x, 6.x
Atnotes-Thread:
Thread (Einer von vielen)
EditMode verhindernDas nachfolgend geschilderte Verfahren stellt kein sicheres Procedere dar, um das Manipulieren von Dokumenten zu verhindern. Wenn möglich, sollte man unbedingt Autorenfelder verwenden und den Benutzern einer Applikation nur den Zugriff auf die DB mit Autorenrechten geben.
Für Fälle, in denen es ausreicht, den Benutzer lediglich darauf hinzuweisen "An diesem Dokument bitte keine Modifikationen mehr vornehmen !", genügt jedoch das nachfolgend geschilderte. Mit einfachen Aktionen auf GUI-Ebene lässt es sich auch nicht aushebeln, wohl aber durch selbstgeschriebene Agents, eigens kreierte Masken und ... na, wir wollen jetzt keinen auf falsche Gedanken bringen
"Einfach" geht es aber auf jeden Fall nicht mehr ...
Ein paar technische Hintergründe:
In einem geöffneten (!) Dokument führt der Wechsel des EditMode-Status (True / False) zum Triggern des Events "QueryModeChange". Das ist also genau das Event, in dem es einzugreifen gilt. Allerdings kann ein Dokument auch aus einer Ansicht heraus bereits im EditMode geöffnet werden: Via Menü, via Button, per Tastatur. In diesem Fall wird natürlich das Maskenevent "QueryModeChange" nicht mehr ausgeführt - nach "QueryOpen" und "PostOpen" ist das Dokument geöffnet - im EditMode.
Erschwerend kann hinzukommen, dass im Event "PostRecalc" Code steht, der zum Beispiel zur Berechnung bestimmter Felder der Maske erforderlich ist. Dann lautet die Reihenfolge "QueryOpen" - "PostRecalc" - "PostOpen". In diesem Fall ist also auch das "PostRecalc"-Event zu beachten.
Ein Ereignis, welches immer durchlaufen wird (es sei denn, das Dokument ist bereits geöffnet), ist "QueryOpen": Hier stehen noch nicht alle Properties des Dokumentes zur Verfügung. So verlockend es klingt - "QueryOpen" können wir in diesem Zusammenhang getrost vergessen.
Praktische Umsetzung:
Für den Platzhalter THE_CONDITION ist jeweils die konkrete Bedingung zu formulieren. Soll das Editieren generell verhindert werden, kann dieser Zweig auch entfallen.
Zwei Beispiele:
If (Source.EditMode = True) And (Source.Document.Status (0) = "Accepted") Then
oder - ohne Bedingung -
If (Source.EditMode = True) Then
Sub Postopen (Source As Notesuidocument)
'Prevent editing a document under a certain condition:
If (Source.EditMode = True) And (THE_CONDITION) Then
Source.EditMode = False 'This triggers the QueryModeChange event !
End If
End Sub
Sub Querymodechange (Source As Notesuidocument, Continue As Variant)
'Prevent editing a document under a certain condition:
If (THE_CONDITION) Then
Messagebox "You are not allowed to edit this document !", MB_ICONEXCLAMATION, "Warning"
If Source.EditMode = False Then
Continue = False
End If
End If
End Sub
Soll das Editieren gänzlich untersagt werden, ist die Abfrage nach THE_CONDITION zu entfernen und die Messagebox nach der Abfrage des EditMode's einzubauen.
Für den Fall, dass beim Öffnen eines Dokuments im EditMode auch Code im "PostRecalc"-Event ausgeführt wird, dann brauchen wir hier ebenfalls folgenden Code wie im "PostOpen"-Event:
Sub Postrecalc (Source As Notesuidocument)
'Prevent editing a document under a certain condition:
If (Source.EditMode = True) And (THE_CONDITION) Then
Source.EditMode = False 'This triggers the QueryModeChange event !
End If
End Sub