Moin,
gibt's eine Möglichkeit die Tastenkombis in Notes zu deaktivieren ? bzw. wie kann ich insbesondere Strg+B verhindern ?
Gruß
Harald
Moin,
gibt's eine Möglichkeit die Tastenkombis in Notes zu deaktivieren ? bzw. wie kann ich insbesondere Strg+B verhindern ?
Gruß
Harald
Hi,
Um die besagte Tastenkombination zu beeinflussen, habe ich immer wieder mit den Masken-Events gearbeitet.
QueryOpen
PostOpen
QueryModeChange
Andreas
Warum willst du das Bearbeiten überhaupt verhindern? Wären dann Autorenfelder nicht die bessere Wahl? Oder die User einfach auf Leser zurückstufen?
RockWilder,
so einfach auf Leser einstufen, geht nicht. Die Dokumente sind an sich gesperrt, aber.......
beim Öffnen eines Dokuments wird im PostOpen der Username im Dokument in ein Feld "Kenntnisnahme" mit Name und Datum eingetragen. Deshalb habe ich im QueryModeChange auch ein Continue = False drin, dass mir den Wechsel in den Bearbeitungsmodus verhindert. Die User habe ich desher auch als Editoren in der ACL. Durch Code im QueryModeChange wird der Bearbeitungsmodus aber nur bestimmten Gruppen gestattet und Strg-B würde das ja umgehen.
Wenn Jemand eine bessere und effektivere Lösung kennt, ich bin für alles offen .-)).
Gruß aus den z.Zt. noch sonnigen Schleswig-Holstein
Harald
Button, um das Dokument zu bearbeiten.
- Button druecken
- Flag setzen
- Dok. oeffnen
- Flag vorhanden -> bearbeiten moeglich
- Flag nicht vorhanden -> Meldung das bearbeiten nicht moeglich
Daher auch
QueryOpen und PostOpen-Events
Andreas
andreas,
verstehe ich nicht ganz. Was hilft mir ein Button ? Mit Strg+B brauche ich doch keinen Button, der mir irgendetwas an Flags setzt.
Der User macht Strg+B und ist im Bearbeitungsmodus, da greift das QueryModeChange doch gar nicht.
Es wird PostOpen durchlaufen und ich bin im Bearbeitungsmodus, das QueryModeChange wird gar nicht ausgeführt, oder liegt ich da falsch.
Gruß
Harald
Aber wenn der User das Dokument mit STRG+B oeffnet, um gleich in den Bearbeitenmodus zu gelangen, ist das Flag, welches ueber den Button gesetzt wird nicht da.
Damit kannst Du an den entsprechenden Stellen das Bearbeiten des Dokumentes verhindern, indem das Dok. gar nicht erst in den besagten Modus gelangt.
Daher.
Pruefe im PostOpen, ob das Flag da ist.
-> wenn Ja, wurde Dok. ueber den Button zum Bearbeiten geoeffnet und das Bearbeiten ist moeglich
-> wenn NEIN, dass wurde das Dok. NICHT ueber den Button zum Bearbeiten geoeffnet (z.B. STRG + B) und Du kannst eine entsprechende Meldung ausgeben und das Bearbeiten des Dokumentes verhindern.
Andreas
aber ich prüfe im PostOpen doch, ob ein Feld einen bestimmten Wert hat und wenn es nicht den Wert hat, dann soll eben nur Lesen möglich sein.
Oder stehe ich hier irgendwie auf dem Schlauch ??
Gruß
Harald
Zitataber ich prüfe im PostOpen doch, ob ein Feld einen bestimmten Wert hat und wenn es nicht den Wert hat, dann soll eben nur Lesen möglich sein.
Oder stehe ich hier irgendwie auf dem Schlauch ??
Prinzipiell nicht.
Aber ist das Feld denn im PostOpen bereits so gesetzt, das Dein Vergleich funktioniert?
Und vor Allem, wann und wie gelangt der Wet, auf den Du pruefst, in das Feld?
Ein kleines Stueckchen Deines Codes wuerde hier eventuell weiterhelfen.
Andreas
hier mal der Code
Dim Session As New Notessession
Dim wks As New notesuiworkspace
Dim Doc As Notesdocument
Set doc = wks.CurrentDocument.Document
Dim Item As NotesItem
Set Item = doc.GetFirstItem("gelesen")
User = Session.CommonUserName
If User = doc.From(0) Then Exit Sub 'den Ersteller brauchen wir nicht in der Leserliste
Inhalt = Item.Values
Forall Namen In Inhalt
If Strleft(Namen," -") = User Then Goto Ende 'Exit Sub 'wenn schon vorhanden, braucht der User nicht nochmal als Leser eingetragen werden
End Forall
A = User+ " --- " +Cstr(Date) +" ·· "+Cstr(Time)
Call Item.AppendToTextList( A )
Call doc.Save(True,False)
Ende:
If doc.gesperrt(0) = "1" Then
continue = False
End If
Dieses Feld "gesperrt" wird zuvor, wenn es Berechtigte bearbeitet haben gesetzt. Es ist also bereits mit dem Wert "1" gefüllt.
und im QueryModeChange habe ich:
Dim Session As New NotesSession
Admin = Evaluate (|_HomeServer := @Subset( @DbName; 1 ); HomeServer := @Name([CN];_HomeServer) ; HomeServer;
Admin := @DbLookup( "" : "NoCache" ; HomeServer : "Names.nsf" ; "Groups" ; "#Admins" ; "Members" );
@Name([CN] ; Admin )|)
Ersteller = Evaluate (|_HomeServer := @Subset( @DbName; 1 ); HomeServer := @Name([CN];_HomeServer) ; HomeServer;
Ersteller := @DbLookup( "" : "NoCache" ; HomeServer : "Names.nsf" ; "Groups" ; "9603 Ersteller Controlling-Info" ; "Members" );
@Name([CN] ; Ersteller )|)
Benutzer = Evaluate (|@name([CN];@UserName)|)
Dim wks As New NotesUIWorkspace
Dim doc As notesdocument
Set doc = wks.CurrentDocument.Document
If doc.gesperrt(0) = "1" Then Goto Ende
Forall Members In Admin
If Benutzer(0) = Member Then
Exit Sub
End If
End Forall
Forall Members In Ersteller
If Benutzer(0) = Member Then
Exit Sub
End If
End Forall
Ende:
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.EditDocument( False )
continue = False
Aber QueryModeChange wird gar nicht durchlaufen, wenn ich Strg+B betätige.
Bin ich denn zu dösig ? ;-)) oder wo liegt mein Problem
Hast Du den Code schon mal setp für step druchlaufen?
If User = doc.From(0) Then Exit Sub
"Hier frägst Du ab ob der Username gleich dem Maskenname ist???"
If Strleft(Namen," -") = User Then Goto Ende
"Beginnen Deine Commonname wirklich mit " -" ???"
Und wieso arbeitest du nicht sauber mit Autorenfeldern ?
Denn um den Code auszuheb eln müsste ich mich ja nur in das Feld Admins reinschreiben und schon ist dein ganzer Code für die Katze.
Stehe ich dagegen in keinem Autorenfeld drin kann ich das Dokument auch nicht verändern bzw in den Bearbeitungsmodus versetzen (egal über welchen Weg)
@Lancelot,
Hast Du den Code schon mal setp für step druchlaufen?
If User = doc.From(0) Then Exit Sub
"Hier frägst Du ab ob der Username gleich dem Maskenname ist???"
Da wird nicht der Maskenname (Form); sondern der Ersteller des Docs abgefragt. Dieser Feldwert (From) wird beim Erstellen des Docs angelegt.
If Strleft(Namen," -") = User Then Goto Ende
"Beginnen Deine Commonname wirklich mit " -" ???"
Nein, aber aus dem Code ist ersichtlich, mit welchen Werten ich das Feld "gelesen" gefüllt habe und Strleft(Namen," -") ergibt den Namen. Der Feldwert ist aufgebaut mit :
User+ " --- " +Cstr(Date) +" ·· "+Cstr(Time)
Natürlich dürfen die User nur Autoren sein und das muss auch umgestellt werden.
Aber so wie das zur zeit gelöst ist kann das jeder der Lust und Laune und ein wenig Ahnung hat problemlos umgehen.
Also von Sicherheit keine Spur.
Und die Kenntnissnahme kann man auch in einem separaten Dokument vermerken und nur zum Lesen einblenden.
Er vergleicht es mit doc.From nicht doc.Form
taurec,
wenn ich die Personen in ein Autorenfeld nehme, können Sie ja alle das Doc bearbeiten, aber gerade das soll ja nicht sein. Nur ausgewählte Personen sollen das Doc bearbeiten dürfen.
Nur..... wenn eine Person das Doc öffnet soll protokolliert werden, wer wann das Doc gelesen hat. Daher habe ich alle auch als Editoren in der DB, die Maske geht nicht automatisch in den Bearbeitungsmodus, nur per Doppelklick und dann greift QueryModeChange und verhindert ggf. die Bearbeitung, aber Strg+B hebelt mir das aus. Und das möchte ich abfangen, weiss bloß nicht wie :-((
Hallo,
1. Hat es einen bestimmten Grund, warum die auf die Gruppen im NAB/Directory prüfst und nicht entsprechende Rollen auf entsprechenden Gruppen in der ACL hältst ??
2. Der Vorschlag war ja, die Berechtigungen zu prüfen, ein Flag auf dem Dokument zu setzen und an den entsprechenden Stellen auf das Dokumentenflag zu prüfen :
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
Print "Starte QueryOpen"
source.Document.editFlag = "0" //Hier natürlich die entsprechende Prüfung, "0" wenn keine Berechtigung, "1" wenn eine Berechtigung.
End Sub
Ab dann kannst du auf dem Dokument prüfen, ob der Wert gesetzt ist, z.B. auch im Postopen :
Sub Postopen(Source As Notesuidocument)
Print "Starte Postopen"
If source.Document.editFlag(0) = "0" Then
source.EditMode = False
End If
End Sub
Hier läuft er dann nochmal durch den QueryModeChange, wenn das Uidokument auf True war und auf mit dieser Funktion auf false gesetzt wird.
Ich stimme aber Taurec zu, ohne die Benutzung von Autorenfeldern wird es schwierig, das DOkument sicher zuzumachen. Man könnte ja mit anderen Tools auf das Dokument gehen + dort dann Feldwerte ändern, man könnte über Backend-Agents die Werte ändern, dann habe ich garkein UIdokujment + entsprechend auch keine Postopen, Queryopen-Events usw.
Mit diesen Mitteln sperrst du dicht das Dokument an sich sondern nur den Zugriff auf das Dokument über das UI.
mfg
Holger
Deswegen sollen ja auch nur die Personen in das Autorenfeld, die das Dokument tatsächlich bearbeiten dürfen sollen.
Und damit ist für alle anderen auch Strg+B einfach und sicher gesperrt
zunächst einmal Dank an alle, die versucht haben zu helfen.
OK, Ich weiss, dass es so nicht 100%ig dicht ist, aber mir ist zumindest so weit geholfen, dass Strg+B nicht mehr in den Bearbeitungsmodus wechselt und trotz allem die Personen, die das Dokument geöffnet haben, registriert werden.
Nachstehend mal der modifizierte Code:
Sub Postopen(Source As Notesuidocument)
Dim Session As New Notessession
Dim Item As NotesItem
Set Item = source.Document.GetFirstItem("gelesen")
User = Session.CommonUserName
If User = source.Document.From(0) Then Exit Sub 'den Ersteller brauchen wir nicht in der Leserliste
Inhalt = Item.Values
Forall Namen In Inhalt
If Strleft(Namen," -") = User Then Goto Ende 'Exit Sub 'wenn schon vorhanden, braucht der User nicht nochmal als Leser eingetragen werden
End Forall
A = User+ " --- " +Cstr(Date) +" ·· "+Cstr(Time)
Call Item.AppendToTextList( A )
source.Document.gelesen = Item.Values
Call source.Document.Save(True,False)
Ende:
If source.Document.gesperrt(0) = "1" Then
source.EditMode = False
continue = False
Exit Sub
End If
End Sub
Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
Dim Session As New NotesSession
Admin = Evaluate (|_HomeServer := @Subset( @DbName; 1 ); HomeServer := @Name([CN];_HomeServer) ; HomeServer;
Admin := @DbLookup( "" : "NoCache" ; HomeServer : "Names.nsf" ; "Groups" ; "#Admins" ; "Members" );
@Name([CN] ; Admin )|)
Ersteller = Evaluate (|_HomeServer := @Subset( @DbName; 1 ); HomeServer := @Name([CN];_HomeServer) ; HomeServer;
Ersteller := @DbLookup( "" : "NoCache" ; HomeServer : "Names.nsf" ; "Groups" ; "9603 Ersteller Controlling-Info" ; "Members" );
@Name([CN] ; Ersteller )|)
Benutzer = Evaluate (|@name([CN];@UserName)|)
Dim wks As New NotesUIWorkspace
Dim doc As notesdocument
Set doc = source.Document
If source.Document.gesperrt(0) = "1" Then Goto Ende
Forall Member In Admin
If Benutzer(0) = Member Then
Exit Sub
End If
End Forall
Forall Member In Ersteller
If Benutzer(0) = Member Then
Exit Sub
End If
End Forall
Ende:
If Not source.EditMode Then
continue = False
Exit Sub
End If
End Sub
nochmals Danke für Eure Hilfe
Gruß Harald
aus dem jetzt nicht mehr so sonnigen S-H
edit:
noch besser:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
If Not source.IsNewDoc And source.EditMode Then continue = False
End Sub
damit sind die Tasten wirklich deaktiviert.
--------
Das würde auch gehen:
Sub Postopen(Source As Notesuidocument)
If Not source.IsNewDoc And source.EditMode Then source.EditMode = False
End Sub
Damit werden Dokumente per CTRL-B bzw. CTRL-E (eng) im Non-Edit-Modus geöffnet.
Ein Versuch das Dokument dann zu öffnen läuft auf den QueryModeChange:
Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
If Not source.Editmode Then
Msgbox "Hier Dein Code"
End If
End Sub
Gruß
M.