Replizier- und Speicherkonflikt

  • Hallo zusammen,


    ich habe eine Datenbank erstellt, in der User ein Dokument ausfüllen sollen. Das Problem ist, dass es ab und zu vorkommt, das zwei User gleichzeitig auf das selbe Dokument zugreifen und ihre Werte eintragen wollen. Dann kommt der Fehler "Replizier- und Speicherkonflikt". Habt ihr ne Idee, wie ich das beheben bzw. verhindern kann?


    Vielen Dank für Eure Hilfe!


    Grüße, Pierre

  • Man kann das Programmieren in dem man im Postopen und Postmodechange ein Flag im Backend Dokument setzt das man dann im Queryopen und Querymodechange wieder abfragt.


    Ist aber immer blöd, das Backend-Dokument zu ändern wenn man das uidoc zum bearbeiten geöffnet hat.


    Eine weitere Option wäre es anstatt im Backend-Doc ein Flag zu setzen, stattdessen die DocUniqueID des Dokumentes in einem Profildokument zu speichern und dann abzufragen.


    Viele Grüße
    Homer

  • Hallo Homer,


    entschuldige meine verspätetete Antwort. Ich bin ein Notes-Anfänger, daher meine Frage, wie ich das mit DocumentUniqueID mache. Vielleicht kannst du mir da weiterhelfen.


    Vielen Dank!


    Grüße, Pierre

  • steht alles in der Hilfe


    Dim workspace As New NotesUIWorkspace
    Dim doc As NotesDocument
    Set doc = workspace.CurrentDocument.Document
    unid$ = doc.UniversalID

    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

  • Oh je, über das Thema könnte man ein kleines Buch schreiben.


    Dein Problem ist ja, dass du ein Dokument welches gerade von irgendjemandem im Edit-Mode geöffnet ist, gegen ein weiters öffnen im Edit Mode sperren willst.


    Einen Code dafür habe ich nicht, aber ich kann dir das Prinzip erklären wie ich es machen würde.


    Ich gehe davon aus, dass der normale User Autorenrechte in der ACL hat und keine Dokumente löschen darf.


    Du brauchst also zunächst mal eine Maske für ein Benutzerprofildokument in der Anwendung. Die Maske braucht zwei Textfelder. Eines für die DocUniqueID und eines für den Usernamen.


    Dazu eine versteckte Ansicht mit den Profildokumenten deren erste Spalte sortiert ist und die gespeicherte DocUniqueID anzeigt. In der zweiten Spalte ist der Benutzername.


    Jetzt musst du im Queryopen und Querymodechange ein Script einbauen das immer dann läuft wenn das Dokument im Edit-Mode geöffnet wird.


    Das Script prüft in der Versteckten Ansicht ob dort ein Eintrag mit der DocUniqueID des zu öffnenden Dokumentes existiert. Wenn ja, wird das öffnen im Edit-Mode unterbunden. (Wenn du ganz komfortabel sein willst kannst du dann eine Messagebox aufmachen die anzeigt wer das Dokument gerade editiert).
    Wenn nicht, wird die DocUniqueID des aktuellen Dokumentes im Benutzerprofil des aktuellen Users (sein Name auch) gespeichert und das Dokument im Edit-Mode geöffnet.


    Im Queryclose muss dann die DocUniqueID wieder aus dem Profildokument gelöscht werden.


    Jetzt kann es nur noch passieren, dass der User bereits ein Dokument zum editieren offen hat, und versucht ein zweites zum editieren zu öffnen. In diesem Fall würde das Script ja den Eintrag der DocUniqueID überbügeln und das Dokument fälschlicherweise wieder freigeben. Aber das kann man ja ganz einfach unterbinden.


    Viel Spaß!

  • Hallo Homer,


    also, das mit der Überprüfung und er Messagebox habe ich hinbekommen. Jetzt habe ich nur noch eine Frage: wie speichere ich diese DocUID in dem Benutzerprofil des Users ab? Oder meinst du damit die Maske, in der ich den Benutzernamen und die DocUID zur Überprüfung abspeichere?


    Grüße, Pierre

  • Hallo Pierre,


    ja ich meine die Maske mit dem Benuterzernamen und der DocUID. Ich behandle das Dokument als Profildokument weil ich es dann mit dem Befehl
    Set notesDocument = notesDatabase.GetProfileDocument( profilename$ [ , username$] )
    schneller öffnen kann

  • Hallo Homer,


    ich habe das Problem über @Commands versucht zu lösen und soweit würde es auch funktionieren. Er sperrt das Dokument ordnungsgemäß, so wie ich es haben will. Wenn ich jetzt das Dokument im Lesemodus öffne und dann per Doppelklick in den Bearbeitungsmodus gehen will, kommt folgende Fehlermeldung: "Versuch, verschatelte Maskenereignisse auszuführen". Nur leider verstehe ich diese Fehlermeldung nicht...vielleicht kannst du mir da weiterhelfen.


    Code
    UName:=@GetProfileField("(docuid)";"User");
    Ident:=@GetProfileField("(docuid)";"Nummer");
    DocuIdent:=@Text(@DocumentUniqueID);
    
    
    @If(UName!=@Name([CN];@UserName);@If(Ident=DocuIdent;@Command([EditDocument];"0");"");@Command([EditDocument];"1"));
    @If(UName!=@Name([CN];@UserName);@If(Ident=DocuIdent;@Prompt([OK];"Achtung - Dokument wird gerade benutzt!";"Die Eingabemaske wird gerade von einem anderen User benutzt! Bitte versuchen Sie es später nocheinmal!");"");"")


    Das ist der Code, der bei Querymodechange und Queryopen ausgeführt wird.


    Grüße und vielen Dank!
    Pierre

  • Ich nehme mal an, dass du nur einen Teil des Codes gepostet hat, ansonsten würde es überhaupt nicht funktionieren. 8-)


    Die Fehlemeldung besagt, dass es zu einer Schleife gekommen ist. In dem Code den du gepostet hast kann ich eigentlich nichts derartiges erkennen. Evenuell solltest du mal alles reinstellen.

  • Hm...dann habe ich wohl falsch drüber nach gedacht. Ich bin davon ausgegangen, dass es so funktionieren kann......


    Ich habe jetzt versucht, das ganze rückgängig zu machen. Jetzt kommt, wenn ich im Lesemodus auf die Maske doppelt klicke, die Fehlermeldung "Document command not available". Ich habe schon die ganze Query- und Post-Sachen überprüft, die für die Maske von Relevanz wären, aber da steht nix mehr drin. Hast du noch ne Idee, woran das liegen kann?


    Grüße, Pierre