Strg+B sperren ????

  • Warum willst du das Bearbeiten überhaupt verhindern? Wären dann Autorenfelder nicht die bessere Wahl? Oder die User einfach auf Leser zurückstufen?

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • 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

  • Zitat

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


    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

  • 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)

  • taurec


    Ich widerspreche eigentlich nur ungern, aber spricht diese Aussage von Harald nicht gegen die Autorenfelder.


    Zitat

    Die User habe ich desher auch als Editoren in der ACL.


    Mit dem Recht interessieren mich Autorenfelder doch eigentlich herzlich wenig.



    Andreas

  • @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)

  • ascabg


    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.


    Westenseer


    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

  • 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.