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?
12 Antworten
-
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.
-
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...
-
Und noch ein Nachtrag: Auf Feldebene ("Schreibbar wenn") passiert genau das selbe... :-(
-
Dazu hätte ich mal eine Frage: seit wann gehen denn SELECT Anfragen im Optionsfeld "Lesbar, wenn" wieder? Das ging doch ewig nicht.
-
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.
-
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 1 MonatZuletzt aktiv
- 12Antworten
- 193Ansichten
-
7
Folge bereits