1

lesbar wenn / schreibbar wenn - bug or feature?

Ich beobachte folgendes "merkwürdiges" Verhalten:

In den Triggern "Lesbar wenn" und "Schreibbar wenn" steht das selbe Skript.

Bei "Lesbar wenn" funktioniert es wie erwartet... bei "Schreibbar wenn" gar nicht.

Ich habe verschiedene Varianten ausprobiert und bin einigermaßen ratlos.

Ein Datensatz soll für einen User lesbar bzw. schreibbar sein, wenn er Bedingungen erfüllt, die in der Tabelle "RechteMatrix" definiert sind. Dort stehen "Gesellschaften" und "Funtionen", hier im Bsp ein Katalog.

Die Werte für die Berechtigung an sich werden aus einer Katalogtabelle (als DynAuswahl) ausgelesen. Wenn die Zahl >=2 ist, darf man lesen, wenn sie >=3 ist, darf man auch schreiben.

Lesbar wenn

    let wmandant := 'zu Gesellschaft';
    let w := last(select U02_RechteMatrix where AppUser.'Ninox User' = user() and Mandant = wmandant).number('LU Office Katalog');
    let rechte := record(ConfiParameter,w).Zahl;
    rechte >= 2

Schreibbar wenn

    let wmandant := 'zu Gesellschaft';
    let w := last(select U02_RechteMatrix where AppUser.'Ninox User' = user() and Mandant = wmandant).number('LU Office Katalog');
    let rechte := record(ConfiParameter,w).Zahl;
    rechte >= 3

 

wenn ich die Abfrage in ein Formelfeld packe, um zu sehen, welchen Wert sie liefert, wird korrekt angezeigt, dass das Kriterium erfüllt ist:

let wmandant := 'zu Gesellschaft';
    let w := last(select U02_RechteMatrix where AppUser.'Ninox User' = user() and Mandant = wmandant).number('LU Office Katalog');
    let rechte := record(ConfiParameter,w).Zahl;
    rechte

Wenn "Rechte" = 4 ist, kann man zwar lesen, aber nicht schreiben.

Ich bin ratlos.

Ich habe verschiedene Varianten mit "do as server", number()... etc ausprobiert. Immer das selbe Ergebnis. Lesen geht, schreiben nicht...

Hat jemand eine Idee?

11 Antworten

null
    • mirko3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Ich konnte Den Fehler nachstellen. Es betrifft das "Schreibbar wenn" Feld. Wenn man eine einfache boolsche Bedinung hineinschreibt, 2<4, dann scheint es bei mir noch zu gehen, aber sobald man einen Wert aus einem select versucht, geht es nicht. Für mich ist es ein Bug.

    • ZitronenKiller
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Habe da noch was getestet:

    let rechte := record(ConfiParameter,2).Zahl;
    rechte = null
    

    Das funktioniert - Kann schreiben

    let rechte := record(ConfiParameter,2).Zahl;
    rechte != null
    

    Kann nicht schreiben

    Das  würde bedeuten, dass die Variable leer ist... hier auch ohne select Kommando.

    Frage wäre nun, wenn es ein Bug ist, bis wann kann man auf eine Lösung hoffen oder wie könnte ein funktionierender Workaround aussehen? Dieser zweite Test ist entmutigend, weil es wohl nicht am "select" liegt... 

    • ZitronenKiller
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Und noch ein Nachtrag: Auf Feldebene ("Schreibbar wenn") passiert genau das selbe... :-(

      • Developer by Smartplanung
      • smartplanung
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller ich selbst arbeite bei Feldern oft mit isAdminMode() Das ist meines Wissens nach eine hinterlegte globale Funktion.

      Ich habe das jetzt in deinem Fall nicht getestet. Aber versuch mal eine globale Funktion zu schreiben (ist jetzt einfach zusammen geschustert):

      function checkRechte(Recht : number) do
          if record(ConfiParameter, Recht).Zahl then
              true
          else
              false
          end
      end

      In dem gewünschten Feld dann einfach checkRechte(2) oder checkRechte(3) .....

      • ZitronenKiller
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Patrick W. 

      Gute Idee, habe es gerade ausprobiert .... leider das exakt selbe Ergebnis.

          function getEntitlement(Gesellschaft : number) do
              let w := last(select U02_RechteMatrix where AppUser.'Ninox User' = user() and Mandant = Gesellschaft).number('LU Office Katalog');
              let Berechtigung := record(ConfiParameter,w).Zahl;
              Berechtigung
          end
      
      getEntitlement(number('zu Gesellschaft')) >= 0
      

      Als Eintrag bei "Lesbar wenn" tut wie es soll, bei "Schreibbar wenn" passiert nix... der Datensatz kann nicht geändert werden.

      Damit fällt mein Berechtigugnskonzept komplett zusammen und damit eigentlich auch das ganze Projekt..

      • Developer by Smartplanung
      • smartplanung
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller dann gäbe es vielleicht noch die Möglichkeit, ein verstecktes Funktionsfeld zum Formular des betroffenen Feldes zu setzen, was mit true/false auf die Rechte schaut und bei "Schreibbar wenn" fragt man das Funktionsfeld ab?

      • Developer by Smartplanung
      • smartplanung
      • vor 1 Jahr
      • Gemeldet - anzeigen

      ZitronenKiller habs gerade mal versucht:

      Tabelle1 hat ein Zahlenfeld mit Records 1, 2, usw.

      In Tabelle 2 ist jetzt ein Funktionsfeld:

      record(Tabelle1,1).Zahl
      

      Im Texfeld mit den Schreibrechten:

      'Formel' = 2
      
      'Formel' >= 2
      

      Beide Varianten gehen bei mir. Wenn Wert nicht gegeben, kann ich nicht schreiben. Wenn Wert gegeben, kann ich schreiben.

      • ZitronenKiller
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Patrick W. 

      Das habe ich auch schon überlegt, aber: Das ist ein Feld, das im Datensatz steht. Somit ist der Datensatz für alle schreibbar, solange der Wert "True" ist. Er solle aber nur für bestimmte Personen schreibbar sein.

      Das Problem:

      In der RechteMatrix steht drin, welche Projekte und dazugehörige Maßnahmen (>100) von welchem Mitarbeiter (>30)  gesehen oder bearbeitet werden dürfen. In der Projektmaßnahme muss also gegen die Rechtematrix geprüft werden, ob der gerade angemeldete User Rechte auf das Projekt hat. Mit den eingebauten Rollen geht das wegen der Menge nicht (kann unmöglich für jedes Projekt eine Ninox Rolle festlegen). Wenn ich die Variante "verstecktes Datenfeld" nehme muss ich zusätzlich noch den Datensatz für alle anderen sperren (und die Sperre nach Bearbeitung wieder aufheben) wodurch ich das coole Feature, dass mehrere Personen gleichzeitig auf dem selben Datensatz sein können, verliere. Und das ist zudem sehr aufwändig.

      Das führt mich also irgendwie auch nicht weiter...

    • Icarus_Ralf_Becker
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Dazu hätte ich mal eine Frage: seit wann gehen denn SELECT Anfragen im Optionsfeld "Lesbar, wenn" wieder? Das ging doch ewig nicht. 

    • ZitronenKiller
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Workaround gefunden...

    also so geht es, ist aber recht aufwändig, wenn es viele Tabellen betrifft

    Im Datensatz, für den das "Schreibbar wenn" geregelt werden soll, folgende Felder hinzufügen:

    • "Sperre" - Typ J/N
    • Aktueller Nutzer - Typ "Nutzer"
    • Berechtigungsstufe - Typ Number
    • Zeitstempel bietet sich noch, in dem hinterlegt wird, wann der Datensatz geöffnet wurde, sodass der Admin notfalls sehen kann, ob man den Datensatz per AdminForce schließt.

    Der erste Karteireiter enthält nun auf dem Trigger "Vor dem Anzeigen":

    if Sperre = 1 then
        alert("Datensatz in Verwendung durch einen anderen Anwender")
    else
        do as server
    --- die eigentliche Abfrage aus der anderern Tabelle --
            let wmandant := 'zu Gesellschaft';
            let w := last(select U02_RechteMatrix where AppUser.'Ninox User' = user() and Mandant = wmandant).number('LU Office Katalog');
            let rechte := record(ConfiParameter,w).Zahl;
    --- Setzen der Felder in diesem Datensatz
           Berechtigungsstufe := rechte;
            Sperre := 1;
            'Geöffnet von' := user();
    
        end
    end

    Der Trigger "Nach Ausblenden" bekommt diesen Inhalt:

    if user() = 'Geöffnet von' or 'Geöffnet von' = null then
        Berechtigungsstufe := 0;
        Sperre := 0;
        'Geöffnet von' := "";
        'Geöffnet seit' := null
    end
    

    Und in den Trigger "Schreibbar wenn" kommt:

    Berechtigungsstufe >= 4 and user() = 'Geöffnet von'
    

    Das muss man dann leider ziemlich oft wiederholen... ist also nicht gerade der einfachste Ansatz, funktioniert aber in meinen Tests.

    Erwartbarer Fehler: Da die Befähigung zum Schreiben aus dem Datensatz selbst heraus definiert wird, wird es wohl früher oder später zu "ungünstigem Timing" kommen und der Admin muss eingreifen.

    Also unbedingt IsAdminMode() oder userIsAdmin() dazu packen, damit man sich nicht notfalls komplett aussperrt.

    • Founder & Owner
    • Miklos_Toth
    • vor 11 Monaten
    • Gemeldet - anzeigen

    Hallo zusammen,

    muss den Thread nochmals aufnehmen:

    Ich will genau diese Funktion für Felder verwenden, welche die Option "schreibbar wenn" anbieten, komme aber auf keinen grünen Zweig. Gibt es nun dazu eine Lösung oder muss ich für jedes Feld einen Workaround basteln?

    NB: die Option "Lesbar wenn" gibt es nur für Tabellen, nicht für Felder, korrekt?

    Viele Grüsse, Miklos

Content aside

  • 1 „Gefällt mir“ Klicks
  • vor 11 MonatenZuletzt aktiv
  • 11Antworten
  • 142Ansichten
  • 6 Folge bereits