2

Datensatz für Eingabe sperren

Hallo zusammen 

Gibt es eine Möglichkeit die verhindert, dass während der Eingabe in einem Datensatz jemand anderes auch Zugriff auf diesen Datensatz hat und dadurch parallel Änderungen vornehmen kann. Ich würde das gerne unterbinden. Schön wäre, wenn der User dem der Zugriff verwehrt wird bzw. nur die Leseberechtigung zur Verfügung steht, eine Begründung erhält. 

Wie  könnte eine solche Umsetzung aussehen und ist dies auch zu realisieren?

Freuen mich auf Eure Ideen und Antworten.

15 Antworten

null
    • ZitronenKiller
    • vor 1 Jahr
    • Gemeldet - anzeigen

    So müsste das funktionieren:

    1. Du legst einen Tab (="Registerkarte") an, unter dem die Daten stehen, die nach dem Öffnen für andere gesperrt werden sollen.
    2. Du braucht ein j/n Feld, etwa "Eintrag geöffnet"
    3. Du brauchst ein Feld vom typ "Nutzer"
    4. In den Tab, Trigger " vor Öffnen" schreibst Du:
      1.  'Eintrag geöffnet' := 1;
        Anwender := user()
    5. In den Tab, Trigger "nach Ausblenden" schreibst Du:
      1. 'Eintrag geöffnet' := 0;
        Anwender := 0
    6. Die beiden  Felder kannst Du nun auswerten. Z.B.
      1. Am Datensatz selbst, "Schreibbar wenn"
      2. Anwender=user()
    7. Nun kann der Anwender, der den Datensatz gerade gesperrt hat, ihn verändern (auch in mehreren Fenstern), alle anderen können das nicht
    8. Du kannst die Felder auswerten und eine Meldung "Datensatz zur Zeit in Bearbeitung durch {Anwender}" ausgeben

    Probier mal... 

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller danke für die ausführliche Anleitung. Ich werde das sehr gerne testen. Gruss Stephan

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller wenn ich alles richtig gemacht habe, funktioniert es, hat aber einen Nebeneffekt, nämlich, dass der Datensatz beim öffnen durch einen neuen User übersteuert wird und die Bearbeitung für den bestehenden Bearbeiter gesperrt wird. Dieser kann natürlich das Spiel umkehren den Datensatz schliessen und erneut öffnen, dann ist er wieder schreibberechtigt. Besteht die Möglichkeit, dass das nicht möglich ist oder habe ich ggf. was falsch gemacht?

      Ich hoffe du kannst meiner Beschreiung folgen.

      Danke schön mal im Voraus für deine Mühen.

      Gruss Stephan

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller Kannst Du mir bitte nochmal behilflich sein und mitteilen, wie ich Punkt 8 oben umsetzen kann. Danke schon mal im Voraus. 

      • ZitronenKiller
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki 

      Du kannst z.B. eine Formel einfügen, die nur angezeigt wird, wenn die Bedingung erfüllt ist. 

      "Dieser Datensatz ist zur Zeit in Vernwedung durch "+'Derzeit geöffnet durch'
      

      in "Feld nur anzeigen wenn"

      'Eintrag geöffnet'=1
      
      

      Den text kannst Du dann auch formatieren.

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller super Idee! Ich war gerade so Ideenlos wie ich das lösen könnte. Dabei wäre es ja gar nicht so schwer gewesen selbst darauf zu kommen. Nochmals besten Dank und ein schönes Weekend :-)

    • ZitronenKiller
    • vor 1 Jahr
    • Gemeldet - anzeigen

    okay, klar.

    An Stelle 4.a muss Du per if/then überprüfen, ob der Satz schon für einen user gesperrt wurde, oder ob er noch offen ist. Sonst wird der Status natürlich einfach überschrieben.

    if 'Eintrag geöffnet' !=1 then
    'Eintrag geöffnet' := 1;
    'Derzeit geöffnet durch' := user()
        end
    
      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller okay danke passt soweit. Jetzt besteht nur noch das Problem, dass wenn der Visual User den Datensatz wieder verlässt, da er ihn nicht bearbeiten kann, den Anwender im Datensatz zurücksetzt. Das sollte nur dem User möglich sein, der gerade den Datensatz bearbeitet. Wie kann ich das verhindern?

      Danke für die Hilfe.

    • ZitronenKiller
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Auf dem "Ausblenden" Trigger muss eine ähnliche Prüfung stehen:

    if 'Derzeit geöffnet durch' = user() then
        'Eintrag geöffnet' := 0;
        'Derzeit geöffnet durch' := 0
    end
    
      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller danke für deine Mühen. Es funktioniert wie erwartet. 🙂

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller hallo, ich habe noch eine Frage, für die du mir vielleicht eine Antwort hast. Wenn jemand nun im Datensatz ist und bearbeitet, diesen dann nicht mehr korrekt verlässt, bzw. einfach Ninox beendet, dann bleibt der Datensatz durch den User weiterhin gesperrt. Gib es eine Möglichkeit, dass nach eine gewissen Zeit dieser trotzdem freigeben wird oder übersteuert werden kann. 

      Danke schon mal für die Rückmeldung.

    • ZitronenKiller
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Leider nein... NINOX hat keine Funktion, um Prozesse zu bestimmten Uhrzeiten abzuarbeiten. Du musst immer ein Ereignis produzieren, das dann bspw. Beim Starten der Datenbank, öffnen der Tabelle etc. ausgeführt wird. So könntest Du zum Bsp beim Öffnen der Datenbank ein Script ausführen, das die betroffenen Tabellen durchsucht und die Sperren wieder aufhebt.

    Ich habe in meinen Ansichten immer einen Button "OK", auf dem ein Script liegt, das den Datensatz schließt und alle Aktionen ausführt, die dort vereinfacht liegen können. Nun muss man nur den User noch dazu nötigen, den auch zu drücken ;-)

    Natürlich kann man durch komplexere Architekturen hier noch was erreichen... aber das sprengt hier ein bisschen den Rahmen

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller okay, danke! Dann muss ich sehen was für einen Workaround ich da finde.

    • ZitronenKiller
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Stephan Stucki

    Schau mal in diesen Artikel:

    https://forum.ninox.de/t/35ha5fy/lesbar-wenn-schreibbar-wenn-bug-or-feature

    Da könnte (das untere Ende des Artikels) noch hilfreich sein.

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller Danke dir! Ich schaue mir das gerne an. ☺️