Formeln und Logik

From ADempiere
Jump to: navigation, search
This Wiki is read-only for reference purposes to avoid broken links.

An verschiedenen Stellen in ADempiere kann man eigene Formeln eingeben. Eine wichtige Stelle ist die Eigenschaft "Standardwertlogik", die man zu jeder Spalte eingeben kann. Aber natürlich gibt es auch eine Schreibschutz-Logik, eine Erforderlich-Logik, etc. Leider konnte ich (bisher) keine vernünftige Dokumentation hierzu finden.

Die beste Dokumentation, die ich zur Zeit finden konnte, ist der Quelltext von src.org.compiere.model.GridField.getDefault(). Seltsamerweise scheint dort alles wesentliche direkt eingebaut zu sein, obwohl es doch mehrere Stellen als nur "getDefault()" geben müsste, die alle gleich den eingegebenen Text interpretieren.

Ich habe folgende Regeln gefunden:

Datenfelder

Datenfelder stehen in Kontextvariablen zur Verfügung, können also in @...@ eingeschlossen werden. Dabei ist zu beachten, das Kontextvariablen Case-Sensitive sind und daher der Name des Datenfeldes so geschrieben werden muss, wie er im Fenster "Tabellen & Spalten" angegeben worden ist.

Kontextvariablen

Es gibt viele Kontextvariablen, die man am besten im Einstellungsfenster auf der Registerkarte "Kontext" ansehen kann.

Sie werden in zwei "@" eingeschlossen, also z.B. so:

 @AD_Client_ID@


SQL Code

Beginnt der Text mit @SQL=, so wird der nachfolgende Text als SQL ausgeführt. Dabei werden vorher noch alle Kontextvariablen ausgeführt (Eine Liste dieser Variablen sieht man abhängig vom Kontext am besten im Einstellungsfenster auf der Registerkarte "Kontext").

Obwohl in der normalen Syntax für Kontextvariablen eine Einfügung immer in "@" eingeschlossen ist, ist das hier nicht so, d.h. das "@" steht nur am Anfang, aber keines am Ende.

Bei dem angegebenen Text muss es sich (nach Auflösung der Kontextvariablen) um einen kompletten SQL-Query handeln, er muss also mit "SELECT " beginnen.

Hier folgt ein Beispiel, das ich benutze, um für ein Eingabefenster, welche Veranstaltungen ich ausgeben möchte, als Startzeitpunkt den "Montag vor zwei Wochen" anzugeben:

 @SQL=SELECT 'now'::text::date + '1 day'::interval - '1 day'::interval * (date_part('isodow'::text, 'now'::text::date) -7*14)

Hier ein weiteres Beispiel, das ich im Fenster "Validierungsregeln" für einen Validator benutze, um in das Tabelle "Gruppenkategorien" für das Feld "Standard" alle Gruppen herauszufiltern, die in die aktuelle Gruppe gehören. Im Fenster "Validierungsregeln" kann man den "Elementtyp" auf "SQL" setzen, was also keine klassische Logik-Formel bedeutet und die Angabe von "@SQL=" unnötig macht.

 BAY_GruppenKategorie_ID=@BAY_Gruppenkategorie_ID@

(mehrere) Default-Wert(e)

MAn kann einen oder mehrere Werte durch ";" oder "," getrennt angeben. Dabei werden diese Werte durch Kontextvariablen ersetzt, wenn sie mit "@" anfangen (und dann natürlich auch aufhören). Wofür mehrere Werte? So kann es sein, das eine der Kontextvariablen nicht existiert oder einen Leerstring ergibt. In diesem Fall wird dann die nächste genommen. Ein direkt angegebener Wert kann übrigens in einfache Anführungszeichen gesetzt werden, muss das aber nicht.

automatische Default-Werte

Wer sich wundert, wo ein Default-Wert herkommt, kann gerne im Quelltext nachsehen, Es werden die User- und die System-Preferences herangezogen, es gibt spezielle Defaults für bestimmte Datentypen, etc...


Sonstiges zum Thema

Als ein Beispiel zu Kontextvariablen siehe auch [Untertabellen ohne Verbindungsspalte].