Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: trouble am 07.01.05 - 14:52:32

Titel: Edit Modus verbieten?
Beitrag von: trouble am 07.01.05 - 14:52:32
Hallo ich mal wieder....

ich soll mal wieder "schnell"  ::) was machen, benutze zum ersten mal "versioning" und will verhindern, dass alte versionen der dokumente geändert werden. Hab jetzt im forum gesucht und mehrfach den hinweise auf edit modus verbieten gefunden, aber nicht wie man das denn nun macht.

muss man dafür wieder ein wirklicher designer sein oder kann mir das jemand in kurzen schritten erklären? oder war ich wieder zu ungeschickt beim suchen in der designer hilfe? da hab ich's nämlich auch nicht gefunden...  ???

schönes wochenende an alle!  :D
trouble
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 14:55:59
Eigentlich sollte man dafür schon Entwickler sein, denn das Thema ist nicht ganz unkomplex. Und die Designerhelp sagt dazu nix, ausser:

Autorenfelder verwenden. Wenn das machbar ist, ist das der einfachste Weg.

Sonst such hier mal nach dem gemeinsamen Vorkommen von
EditMode PostOpen QueryModeChange.

Was hier m.E. leider noch nie erwähnt wurde: Auch das PostRecalc-Event spielt beim Verhindern des EditMode u.U. eine Rolle !

Bernhard
Titel: Re: Edit Modus verbieten?
Beitrag von: trouble am 07.01.05 - 15:03:30
Irgendwie war mir klar, dass Du der erste sein würdest, der mir antwortet. :-)

Leider gehen autoren-felder nicht - weil nämlich die leute editor-access auf die db brauchen...

werde dann mal ne neue suche starten und mich durchwühlen.

wie immer vielen dank!
Titel: Re: Edit Modus verbieten?
Beitrag von: trouble am 07.01.05 - 15:27:39
Noch eine Frage.....

Hab jetzt folgenden Code gefunden, der mir auch super geholfen hat:
If Source.EditMode = True and (DEINEBEDINGUNG) then
  Source.EditMode = False
End If

Aber - DEINEBEDINGUNG wäre in Formula "@IsAvailable($Ref)" - wie formulier ich das in Script?  :-[
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 15:29:58
Source.Document.~$Ref (0) <> ""

Und denk daran: Geprüft werden muss in PostOpen und QueryModeChange. Aber das hast Du bestimmt schon gefunden ;-)

Bernhard
Titel: Re: Edit Modus verbieten?
Beitrag von: mibo11 am 07.01.05 - 15:31:08
Dim doc as notesdocument

Set doc = source.document

... and doc.hasitem("$Ref")  Then

Gruß Sascha



Titel: Re: Edit Modus verbieten?
Beitrag von: mibo11 am 07.01.05 - 15:33:06
Source.~$Ref (0) <> ""

Bernhard, dies wird wahrscheinlich Probleme bringen, da Source  Frontend ist.

Gruß Sascha  ;D
Titel: Re: Edit Modus verbieten?
Beitrag von: mibo11 am 07.01.05 - 15:34:47
Source.Document.~$Ref (0) <> ""

Du hast geschummelt, eben stand da doch etwas anderes, oder bin ich jetzt vollkommen blöd?  ???

Gruß Sascha  ;D
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 15:34:58
Das ist eleganter, Sascha, man muss aber dem Frieden trauen, dass es wirklich nie ein leeres $Ref-Item geben kann. Es sollte ja tatsächlich nicht, aber ...

Bernhard

PS: Den falschen Bezug auf's UIDocument hatte ich gerade schon korrigiert. Trotzdem danke, Sascha
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 15:36:09
Schau auf die Edit-Zeit, Sascha - ich habe meinen Schnellschuss gerade mal ein paar Sekunden eher bemerkt, als Du posten konntest ...
Titel: Re: Edit Modus verbieten?
Beitrag von: trouble am 07.01.05 - 15:38:54
Es funzt! Genau so, wie ich's haben wollte.

DANKE!!!!!!!  :-*
Titel: Re: Edit Modus verbieten?
Beitrag von: trouble am 07.01.05 - 15:47:26
Upps, war wohl etwas vorschnell. Wenn ich jetzt ein neues Dokument erstellen will, bekomm ich die Meldung "Object Variable not set"

Was hab ich denn jetzt wieder falsch gemacht?
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 15:51:43
Keine Ahnung  ;)
Schick mal den Code und nenne die zeile, die der Debugger bemängelt.
Kann nur 'ne Kleinigkeit sein.

Bernhard
Titel: Re: Edit Modus verbieten?
Beitrag von: trouble am 07.01.05 - 15:57:12
Hier der Code im Queryopen:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
   If Source.EditMode = True And Source.Document.~$Ref (0) <> "" Then
      Messagebox "This is an old version and must not be edited"
      Continue = False
      Exit Sub
   End If
End Sub

Debugger meckert gleich am Anfang:
If Source.EditMode = True And Source.Document.~$Ref (0) <> "" Then

Titel: Re: Edit Modus verbieten?
Beitrag von: Glombi am 07.01.05 - 16:02:33
Kleiner Verbersserungsvorschlag:

Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
if Not Source.IsNewDoc then
   If Source.EditMode = True And Source.Document.~$Ref (0) <> "" Then
      Messagebox "This is an old version and must not be edited"
      Continue = False
      Exit Sub
   End If
end if
End Sub


Kann sein, dass der das .Document im QueryOpen bei neuen Dokumenten nicht hat.
Andreas
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 16:03:32
Jo, das ist auch QUERYOpen. Das ist für diese Belange ein unbrauchbares Event, da Source noch nicht vollständig zur Verfügung steht.

POSTOpen ist angesagt - und dann den entsprechenden Code für QueryModeChange nicht vergessen. Dort muss auch die Fehlermeldung hin - der Code in PostOpen triggert nämlich QueryModeChange, ergo muss dort die Messagebox aufpoppen.

Bernhard
Titel: Re: Edit Modus verbieten?
Beitrag von: trouble am 07.01.05 - 16:09:06
OK, jetzt klappt's. Danke!

Oh, zur allgemeinen Erleichterung: Ich hab inzwischen offiziell bei meinen Vorgesetzten verlauten lassen, dass dies meine letzte Programmierarbeit in Notes ist, weil das ohne entsprechende Kenntnisse doch keinen Zweck hat (auch wenn Ihr mir des öfteren aus der Klemme helft)...

Hoffe also, in Zukunft bleibt Ihr von meinen lästigen Fragen verschont.  8)
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 16:11:01
Die Fragen waren doch nicht lästig  :)

Wenn Ihr jetzt was programmieren (lassen) wollt, wisst Ihr ja, in wen Ihr Euch noch wenden könnt  ;)

Ein schönes Wochenende wünscht

Bernhard
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 17:13:32
So, und jetzt mal strukturiert zum Thema

EditMode verhindern

Das 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 kreiierte Masken und ... na, wir wollen jetzt keinen auf falsche Gedanken bringen  ;D
"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


Code
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

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

Code
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

HTH,
Bernhard
Titel: Re: Edit Modus verbieten?
Beitrag von: Glombi am 07.01.05 - 17:19:59
Hi Bernhard,
das gibt aber einen Fleißpunkt  ;)

Ich kann mich dunkel erinnern, mal ein Problem mit Dokumenten gehabt zu haben, wo die Einstellung galt "Automatisch im Bearbeitenmodus öffnen". Ich weiß aber nicht mehr genau, ob das Problem darin bestand, dass der Code anstatt im PostOpen im QueryOpen stand.
Man müsste mal prüfen, welche Events laufen, bevor dann automatisch in den Bearbeitenmodus geschaltet wird und ob dann das QueryModeChange packt...

Ausserdem sollte noch geprüft werden, ob das
 Source.EditMode = False
im Postopen nicht Probleme macht. Wenn bspw. Felder berechnet wurden, kommt doch die Abfrage "Wollen Sie speichern?". Das wollen wir hier ja gerade nicht.
Aus diesem Grund habe ich das immer ins QueryOpen geschrieben.

Habe leider nicht die Zeit, dass alles zu prüfen. Daher mal zunächst als Gedankenstütze...

Andreas
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 17:27:12
Zum EditMode kommt es ja gar nicht mehr, Andreas. Daher wird es auch nie zur Abfrage kommen, ob man das, was man nicht verändert hat, denn nun speichern wolle.

In dem Zusammenhang von Interesse wäre aber, wie man generell - wenn das überhaupt möglich ist - Dokumente via Script erstellen kann, in denen schon einiges vorberechnet wurde, und dann ohne die ggf. auftauchende Frage "Möchten Sie speicheln ?" auskommt, wenn der arme Anwender doch gar nix selber gemacht hat. Für dieses leidige Thema fehlte mir, ehrlich gesagt, bisher wirklich die Muße.

Bernhard
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 17:30:53
Andreas, den Fleisspunkt habe ich mir jetzt ausgedruckt und an die Wand geklebt.

Aaah - und wenn mal wieder jemand nach dieser Sache fragt: Momentan liefert die Suche nach "PostOpen QueryModeChange PostRecalc" nur zwei Treffer ? Oder sollte das - vielleicht vermessen - doch besser ins BP-Forum ?
Da könnte dann auch noch die KW-Geschichte hin, ergänzt um das entsprechende Formelkonstrukt für Ansichten.

Bernhard
Titel: Re: Edit Modus verbieten?
Beitrag von: Glombi am 07.01.05 - 17:32:43
BP wäre gut. Denn das braucht man immer mal...

KW ist ein Dauerbrenner, das gehört auch da hin. Hier im Forum haben wir doch schon Formeln, auch Formelsprache. Das muesste man mal zusammensuchen.

Andreas
Titel: Re: Edit Modus verbieten?
Beitrag von: Semeaphoros am 07.01.05 - 17:33:02
Bernhard, Deine Fleissarbeit gehört doch eigentlich in die BestPractices
Titel: Re: Edit Modus verbieten?
Beitrag von: koehlerbv am 07.01.05 - 17:39:05
Merci Euch beiden ! Die KW-Formel (bewährt) habe ich auch. Das mache ich noch heut' auf Nacht ;-)
Weitere Diskussion hierzu bitte im entsprechenden Forum - nicht, dass sich wieder jemand beschwert (trouble bestimmt nicht, und das war auch kein Seitenhieb gegen die lieben M(aster)O(f)D(isaster) - er hat ja Recht. Aber das gerät hier jetzt wirklich off-topic.

Danke nochmals,
Bernhard