Home › Forum › Nuclos Konfiguration › Maskenlayouts › Benutzerdefinierte Regeln frieren das Layout ein
- Dieses Thema hat 12 Antworten und 4 Teilnehmer, und wurde zuletzt aktualisiert vor 5 Jahre, 7 Monaten von
Frank Pavlic.
-
AutorBeiträge
-
14 Juli 2017 um 16:03 Uhr #9609
Matthias Eckardt
TeilnehmerGuten Tag,
heute mal etwas, was einfach zu beschreiben ist.
Ich habe mit dem Serverregeleditor eine CustomRule erstellt. Da steht noch nichts drin, außer der leeren Methodenhülle, wie sie hier beschrieben ist:http://wiki.nuclos.de/display/Konfiguration/Event+-+Benutzeraktion
Die wird kompiliert, kann einem Businessobjekt zugewiesen werden (per Ziehen), dann im Layouteditor einem Button per Befehlstyp „Regelbutton“ und Argumente „Regelname“(aus dem Drop Down Menü) auf einen Button gelegt werden.
Dann… öffnet man das Layout aus Nutzersicht, legt einen neuen Datensatz an, gibt irgendein Stückchen Text in eines der anderen Felder an, klickt auf den Button von gerade und…
Eigentlich sollte gar nichts passieren, weil außer dem Rumpf, den Nuclos ja selber sogar anlegt, nichts im Code getan wird. Uneigentlich jedoch wird das zugehörige Fenster dunkelgrau und die Sanduhr taucht auf. Und geht nicht mehr weg.
Man kann das Fenster schließen, bekommt gesagt, es handle sich um einen ungespeicherten Datensatz, und dann ist es auch zu.Aber warum verhält sich Nuclos so, wenn ich eine benutzerdefinierte Regel per Button ausführe?
EDiT: Einen Nachschlag habe ich noch: wir haben jetzt gerade eine Breakpoint im Spring Framework gesetzt und uns mit dem Debugger auf die Lauer gelegt. Klickt man dann auf den Button, landet man… in den Klassen, die „InsertRule“ implementieren. Der Breakpoint in der Klasse mit der „CustomRule“ wird gar nicht angesteuert, aber trotz „Fortfahren“ im Debugger verbleibt das Fenster in dem unbrauchbaren Zustand.
14 Juli 2017 um 18:04 Uhr #9610Ramin Goettlich
TeilnehmerDann dürfte die InsertRule das Problem sein. Hintergrund: Wird eine CustomRule ausgeführt, wird der Datensatz im Anschluss gespeichert.
17 Juli 2017 um 09:53 Uhr #9619Matthias Eckardt
TeilnehmerGuten Morgen,
und danke für die Antwort.
Was mich verwundert ist, dass der Debugger nicht in der CustomRule-Klasse zum Stehen kommt, bevor das passiert. Dass wir an fraglicher Stelle noch eine InsertRule haben, die nicht ganz perfekt arbeitet im Moment, kann ich bestätigen, aber ist es so gewollt, dass die InsertRule vor der CustomRule durchgeführt wird?17 Juli 2017 um 13:19 Uhr #9622Ramin Goettlich
TeilnehmerIch bin mir nicht sicher.
Aber funktionierts denn, wenn die InsertRule deaktiviert ist? Dann ist die Sache doch klar.17 Juli 2017 um 14:44 Uhr #9625Matthias Eckardt
TeilnehmerAuf komplett unbedarften Nuclos-Instanzen klappt das mit dem Button. Was wir nicht verhindern können wie es scheint ist, dass dennoch beim Button-Klick gespeichert wird, auch wenn gar keine Insert-Regel vorhanden ist.
Das kann man leicht nachbauen: ein unspektakuläres BO, ein Button mit einer CustomRegel hinter der nur der nuclos-erzeugte Klassen-Rumpf liegt, dann einen neuen Datensatz anlegen, speichern, ihn ändern, den Button betätigen… und obwohl keine InsertRule definiert worden ist in dem Fall, wir der Datensatz dennoch gespeichert.Das ist… ungünstig, wenn man aus der Datenbank Daten beziehen will, die nicht im aktuellen Datensatz liegen, diesen deswegen aber nicht speichern mag.
Und irgendwie glaube ich, dass der Endlosschleifen-Effekt beim Button-Klick auftreten könnte, wenn man normalerweise eine „kann nicht speichern weil Grund“ Meldung bekommen hätte. Die scheint aufgegessen zu werden.17 Juli 2017 um 14:51 Uhr #9626Nick Röder
TeilnehmerMittlerweile gibt es im context ein Flag, dass gesetzt werden kann. Also in der CustomRule Regel kann
context.setUpdateAfterExecution(False)
gesetzt werden. Dann wird der DS nicht automatisch gespeichert.
17 Juli 2017 um 14:52 Uhr #9628Ramin Goettlich
TeilnehmerOb ein Datensatz gespeichert ist, hängt nicht davon ab, ob eine InsertRule definiert ist. Eine InsertRule ist lediglich etwas, das man optional zusätzlich beim Speichern eines (neuen) Datensatzes ausführen lassen kann.
Nach einer CustomRule wird der Datensatz generell gespeichert, denn wesentlicher Use Case einer CustomRule ist, den Datensatz zu verändern. Was nicht dem entgegensteht, in der CustomRule auch noch ganz andere Dinge machen. Möglicherweise wird er im Insert-Falle auch vorher gespeichert, da bin ich mir nicht sicher (siehe Frage in meinem Post weiter oben).
„Das ist… ungünstig, wenn man aus der Datenbank Daten beziehen will, die nicht im aktuellen Datensatz liegen, diesen deswegen aber nicht speichern mag.“ verstehe ich nicht.
Vielleicht würde es helfen, wenn Sie beschreiben, was Sie eigentlich erreichen möchten?
17 Juli 2017 um 14:58 Uhr #9630Ramin Goettlich
Teilnehmer> „wenn man aus der Datenbank Daten beziehen will, die nicht im aktuellen Datensatz liegen“
Vielleicht helfen hier berechnete Attribute weiter?
17 Juli 2017 um 15:01 Uhr #9631Nick Röder
TeilnehmerMittlerweile gibt es im context ein Flag, dass gesetzt werden kann. Also in der CustomRule Regel kann
context.setUpdateAfterExecution(False)
gesetzt werden. Dann wird der DS nicht automatisch gespeichert.
17 Juli 2017 um 15:13 Uhr #9632Matthias Eckardt
Teilnehmer@Elvis, wir haben nachgeschaut und die beschriebene Methode gefunden. Insert wird dennoch durchlaufen (auch wenn keine InsertRegel da ist), aber update kann man damit tatsächlich vermeiden. Das ist fast was wir gesucht haben 🙂
@nuclosian, im Moment versuchen wir herauszufinden, was alles damit eigentlich machbar ist. Ein Versuch war, in das gerade eben „aktive“ BO Daten aus anderen BOs einzutragen, die z.b. nicht direkt per Relation mit diesem aktiven verbunden sind. Wie das Herüberkopieren von Werten aus Datensätzen, die man an dieser Stelle unveränderlich gegenüber der Quelle einlagern möchte.Aber jetzt ist da z.B. noch ein Pflichtfeld, das noch nicht ausgefüllt ist, wenn der Button gedrückt wird. Nachdem aber immer gespeichert wird, muss das spätestens hier schief gehen, nicht oder? Oder man hat den falschen Datensatz erhalten (oder will einen anderen haben), und die richtigen Werte zusammensammeln bevor man den Datensatz überhaupt speichert.
In den Fällen wäre „Button ohne Speicherpflicht“ eine dolle Sache.17 Juli 2017 um 15:25 Uhr #9633Nick Röder
TeilnehmerSie können über einer ThreadVariable Regeln auch aus anderen Regeln deaktivieren.
Z.B. in der Insert Regel
//definition of thread local variable
public static final ThreadLocal ACTIVE = new ThreadLocal() {
protected Boolean initialValue() {return Boolean.TRUE;};
}setzen und dann über
vollerRegelpfad.ACTIVE.set(Boolean.FALSE);
unbedingt über final-Block im try-Block wieder aktivieren
17 Juli 2017 um 16:12 Uhr #9636Matthias Eckardt
TeilnehmerVielen Dank, @Elivs,
wir haben es tatsächlich geschafft, mit dem von Ihnen bereitgestellten Code-Schnipsel insert und insert(after) zu umschiffen, wenn auf den Button geklickt wird… aber Speichern tut es trotzdem 🙂Wenn es tatsächlich keine Möglichkeit gibt, die Aktionen hinter dem Button auszuführen ohne den im aktiven BO herumliegenden Datensatz zu speichern, dann werde ich unsere Versuche in der Richtung wohl oder übel einsellen müssen 🙁
29 Juli 2017 um 01:34 Uhr #9662Frank Pavlic
TeilnehmerHallo imunixx,
nicht einstellen, Daten in den aktuellen Datensatz per Button zu holen und Felder entsprechend setzen funktioniert, allerdings über eine Client-Extension. Dann hast Du alle Freiheiten. D.h. du implementierst einen Button-Typ und fügst diesen der Layout-Palette hinzu. Dann kannst Du diesen in deine Layouts einbauen.
Der Standard-Regelbutton speichert den Datensatz immer nach Ausführung der Regel.Gruß
Frank -
AutorBeiträge