Der „Expertenmodus“ ist für Anwender mit Java(grund)kenntnissen gedacht um außerhalb der „grafischen Editoren“ weitere Regeln/Fachlogik zu definieren. Jeder grafische Regeleditor beinhaltet einen Expertenmodus. Dieser kann über die Schaltfläche „Expertenmodus“ geöffnet werden. Bei jeder Regel, die über den grafischen Regeleditor definiert wird, wird automatisch im Expertenmodus einen Code erzeugt. Dieser Code kann nach Bedarf im Expertenmodus angepasst/erweitert/neu erstellt werden.

Ansicht des Expertenmodus

Jede Expertenregel (Aktivierungsregeln und Berechnungsregeln) verfügt über eine „Standardstruktur“, welche aus folgendem Pseudocode abgeleitet werden kann:

<Package>
<Importierungen>
rule "<Eindeutige Bezeichnung für die Regel>"
when
 <Bedingung(en)>
then
 <Konsequenzen>
end

  Hinweis:

  1. Alle durch Größer-/Kleinerzeichen kenntlich gemachte Bereiche müssen ersetzen werden.
  2. Die Einrückungen sowie Leerzeichen spielen keinerlei Rolle im Code und sind nur zur besseren Übersicht so dargestellt.

Nachfolgend wird die Standardstruktur, sowie zusätzliche Features, im Einzelnen erläutert:

  • Basis-Paket/Importierungen & Regelnamen
  • When-Teil
  • Then-Teil
  • Zusätzliche Features

Basis-Paket/Importierungen & Regelnamen

Basis-Paket

In jedem Bereich der Expertenregeln (Panel-/Komponentenregel) müssen bei einer Definition jeweils folgende Einträge einmalig vorgenommen werden.

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*

Werden beispielsweise mehrere Panelregeln auf demselben Panel definiert, muss die obige Definition nur einmalig vorgenommen werden. Jedoch werden eine Panel- und Komponentenregel definiert, müssen beide dieser Bereiche über das Paket und Importierungen verfügen.

Importierungen

Folgende Importierungen können beispielsweise bei Bedarf hinzugefügt werden:

Diese Importierungen müssen in folgender Form dargestellt werden.

import function de.formsolutions.metaform.rules.util.<Utilname>Util.<Funktionsname>

Die in der nachfolgenden Tabelle genannten Bezeichnungen wie beispielsweise „$Anzahl“ sind Variablen, die im Vorfeld benannt werden müssen.

MathUtil

FunktionsnameBeschreibungBeispiel
applyDem im ersten Parameter angegeben Objekt wird der im zweiten Parameter angegebene Wert zugewiesen.apply($Gesamt, add($Preis1, $Preis2))
addAlle gültigen Parameter werden aufsummiertapply($Gesamtanzahl, add($Anzahl, 1, 3))
subtractDer zweite Parameter wird vom ersten subtrahiert.apply($GesamtGebuehr, subtract($Gebuehr, $Rabatt))
multiplyAlle gültigen Parameter werden multipliziert.apply($Gesamtpreis, multiply($Anzahl, $Einzelpreis))
divideDer erste Parameter wird durch den zweiten dividiert.apply($Gesamtpreis, divide($Gesamtpreis, $Anzahl))
minDie kleinste Zahl wird zurückgeliefert.apply($Gesamtpegel, min($Pegel1, $Pegel2))
maxDie größte Zahl wird zurückgeliefert.apply($Gesamtpegel, max($Pegel1, $Pegel2))
fallbackSollte der erste Wert leer sein, wird der zweite zurückgeliefert.apply($Gesamtsteuer, fallback($MWSt, 0.19))
roundRunde den ersten Wert auf so viele Stellen, wie im zweiten Parameter angegeben.apply($Gesamt, round($Gesamtpreis, 2))

DateUtil

Diese Importierung muss vorangestellt werden:

import function de.formsolutions.metaform.rules.util.DateUtil.<Funktionsname>
import org.joda.time.LocalDate
FunktionsnameBeschreibungBeispiel
isAfterWert wird geprüft, ob dieser nach einem anderen Wert liegt.isAfter(new Date(), $VARIABLENNAME0)
isBeforeWert wird geprüft, ob dieser vor einem anderen Wert liegt.isBefore(new Date(), $VARIABLENNAME0)
isEqualWert wird geprüft, ob dieser gleich ist mit einem anderen Wert.isEqual($VARIABLENNAME0, $VARIABLENNAME1)
isBetweenWert muss zwischen zwei anderen Werten liegen.isBetween($VARIABLENNAME, new LocalDate().minusYears(64), new LocalDate().minusYears(18))
computeDaysBetweenPrüft die Länge zwischen zwei angegebenen Werten in Tagen.computeDaysBetween($VARIABLENNAME0, new Date())
computeWeeksBetweenPrüft die Länge zwischen zwei angegebenen Werten in Wochen.computeWeeksBetween($VARIABLENNAME0, new Date())
computeMonthsBetweenPrüft die Länge zwischen zwei angegebenen Werten in Monaten.computeMonthsBetween($VARIABLENNAME0, new Date())
computeYearsBetweenPrüft die Länge zwischen zwei angegebenen Werten in Jahren.computeYearsBetween($VARIABLENNAME0, new Date())
isPersonOlderThanWert wird geprüft, ob er höher ist als ein anderer WertisPersonOlderThan($VARIABLENNAME0, ALTERSVARIABLE)
isMondayPrüft, ob der Wert ein Montag ist.if(isMonday($VARIABLENNAME0))
isTuesdayPrüft, ob der Wert ein Dienstag ist.if(isTuesday($VARIABLENNAME0))
isWednesdayPrüft, ob der Wert ein Mittwoch ist.if(isWednesday($VARIABLENNAME0))
isThursdayPrüft, ob der Wert ein Donnerstag ist.if(isThursday($VARIABLENNAME0))
isFridayPrüft, ob der Wert ein Freitag ist.if(isFriday($VARIABLENNAME0))
isSaturdayPrüft, ob der Wert ein Samstag ist.if(isSaturday($VARIABLENNAME0))
isSundayPrüft, ob der Wert ein Sonntag ist.if(isSunday($VARIABLENNAME0))
isTimeBeforeWert wird geprüft, ob dieser vor einem anderen Wert liegt.isTimeBefore(new Date(), $VARIABLENNAME0)
isTimeAfterWert wird geprüft, ob dieser nach einem anderen Wert liegt.isTimeAfter(new Date(), $VARIABLENNAME0)

Sonstige Imports

Diese Importierung muss vorangestellt werden:

import java.util.LinkedList;
import java.util.List;
import de.formsolutions.metaform.enums.<Funktionsname>
FunktionsnameBeschreibungBeispiel
setPdfRenderOptionWert wird geprüft, ob dieser nach einem anderen Wert liegt.textoutput.setPdfRenderOption(PdfRenderOption.RENDERED);

  Hinweis:

  1. Die Performance kann durch die Importierungen beeinflusst werden. Daher wird dazu geraten immer nur die Importierungen einzufügen, die auch wirklich benötigt werden.
  2. Die Funktion "DateUtil" funktioniert nur mit Datumsfeldern.

Regelname

Nun findet die eigentliche Definition der Regel statt. Hierzu ist es relevant, einen Regelnamen zu definieren. Dieser wird im Kontext der Expertenregel mit dem Stichwort rule eingeleitet. Der Regelname selbst muss von doppelten Anführungszeichen umgeben sein.

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*

rule "Form-Solutions Beispiel-Regel"
when
 <Bedingung(en)>
then
 <Konsequenzen>
end

  Hinweis:

  1. Alle durch Größer-/Kleinerzeichen kenntlich gemachte Bereiche müssen ersetzt werden.
  2. Weiterhin darf ein Regelname nur einmalig vergeben werden.

When-Teil

Der nächste relevante Schritt einer Expertenregel bezieht sich auf den sogenannten When-Teil, welcher gleichzeitig einer Bedingung entspricht. Erst wenn die definierte Bedingung zutreffend ist, wird eine weitere Ausführung der Regel vorgenommen. Dieser Teil wird durch das Stichwort when in der Expertenregel eingeleitet.

Paneldefinition

Eine Paneldefinition ist dann relevant, wenn eine Referenz zu einem entfernten Panel aufgebaut werden soll. Beispiel: Es wird eine Panelregel auf „Panel B“ erstellt und es wird auf eine Komponente von „Panel A“ zugegriffen. Hierfür ist es relevant „Panel A“ eindeutig zu referenzieren.

Die Definition besteht aus zwei Funktionsweisen.

  1. Es wird eine Variable definiert, auf welche im weiteren Verlauf der Regel zugegriffen wird. Diese impliziert die hinterlegte Komponente.
  2. Beschreibt dieser Bereich eine Bedingung. Erst wenn diese als erfüllt gilt, wird der Then-Teil ausgelöst.Panel(identifier == "<PANELNAME>", $<VARIABLENNAME>:getInputComponent ("<BEZEICHNUNG TECHNISCH>"), $<VARIABLENNAME> !=null)

Auch in diesem Fall müssen jeweils alle Bereiche, die durch Größer-/Kleinerzeichen gekennzeichnet sind, ersetzt werden.

  • < PANELNAME > bezieht sich auf das zu referenzierende Panel. Die Bezeichnung muss identisch wie der hinterlegte Panelname sein.
  • < VARIABLENNAME > ist ein beliebig wählbarer Wert, welcher im weiteren Verlauf als Bezeichnung für die gewünschte Komponente hinterlegt wird (Keine Umlaute zulässig!). Somit muss im weiteren Verlauf bei beispielsweise einer Berechnung nicht wieder die volle „Bezeichnung technisch“ einer Komponente angegeben werden.
  • < BEZEICHNUNG TECHNISCH > beschreibt die „Bezeichnung technisch“ einer Komponente. (Komponente bearbeiten -> „Bezeichnung technisch“)
  • < VARIABLENNAME > entspricht der zuvor definierten Variable. Beide Werte sind in diesem Szenario identisch!

Exportwert in der Komponentenkonfiguration

  Hinweis:

  1. Bei der Benennung spielen Leerzeichen sowie Objektgruppen auch eine Rolle. So muss beispielsweise der Objektgruppenname vor den Komponentennamen mittels eines Punkts getrennt werden.
  2. Weiterhin ist drauf zu achten, dass die im Expertenmodus definierten Regeln nicht automatisch bei einer Änderung der Panel-/Komponentenbenennung geändert werden.
  3. Auch werden die im Expertenmodus definierten Regeln nicht im grafischen Editor abgebildet.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*

rule "Form-Solutions Beispiel-Regel"
when
  Panel(identifier == "Panel A", $formsolutions:getInputComponent ("Komponente xy"), $formsolutions !=null)
then
 <Konsequenz>
end

Verknüpfungen und Definitionen

Komponenten- und Paneldefinitionen sind beliebig verknüpfbar. Folgende Möglichkeiten sind gegeben:

  1. Panel(...) and Panel(...) and ...
  2. Panel(...) or Panel(...) and ...
  3. (Panel(...) and Panel(...)) or ...
  4. ...

  Hinweis:*
Der Aufruf der Paneldefinition (s. o. Panel (. . . )) lässt sich auch durch die Komponentendefinition ersetzen.

Komponentendefinition

Anders als bei Panelregeln, bei welchen die hinterlegten Regeln bei Aufruf eines Panels einmalig angestoßen werden, werden bei Komponentenregeln bei Änderungen der entsprechenden Panels/Komponenten jederzeit die Daten neu aufgerufen. Somit werden die Daten jederzeit „live“ aufgerufen.

Die Definition besteht aus zwei Funktionsweisen.

  1. Es wird eine Variable definiert, auf welche im weiteren Verlauf der Regel zugegriffen wird. Diese impliziert die hinterlegte Komponente.
  2. Beschreibt dieser Bereich eine Bedingung. Erst wenn diese als erfüllt gilt, wird der Dann-Teil ausgelöst.Component ($<VARIABLENNAME>:searchInputComponent("<KOMPONENTENNAME>"), $<VARIABLENNAME> !=null)Bei einer Paneldefinition ändert sich der Bereich searchInputComponent in getInputComponent.
  • < VARIABLENNAME > ist ein beliebig wählbarer Wert, welcher im weiteren Verlauf als Bezeichnung für die gewünschte Komponente hinterlegt wird. (Keine Umlaute zulässig!)
  • < KOMPONENTENNAME > beschreibt die „Bezeichnung technisch“ einer Komponente. (Komponente bearbeiten -> „Bezeichnung technisch“)
  • < VARIABLENNAME > entspricht der zuvor definierten Variable. Beide Werte sind in diesem Szenario identisch!

Eine Hinterlegung des Panels ist nicht mehr relevant! Ist es wünschenswert Panelübergreifend tätig zu werden ist dies mittels „and/or“ einer Paneldefinition möglich.

  Hinweis:
Bei der Benennung spielen Leerzeichen sowie Objektgruppen auch eine Rolle. So muss beispielsweise der Objektgruppenname vor den Komponentennamen und einem Punkt getrennt werden.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*

rule "Form-Solutions Beispiel-Regel"
when
  Component($form:searchInputComponent ("Komponente xy"), $form !=null) and Panel(identifier == "Panel A",
  $solutions:getInputComponent("Komponente z"), $solutions !=null)
then
 <Konsequenz>
end

Ermittlung eines Feldwertes

Um im When-Teil zu überprüfen, ob der Benutzer eine Eingabe getätigt hat, kann folgendes Schema verwendet werden:

$<VARIABLENNAME>.getStringValue() == "formsolutions"

== entspricht ist gleich
Der Variablenname bezieht sich in diesem Fall auf die vorab definierte Komponente. Der vom Benutzer hier eingetragene Wert wird extrahiert und mit "formsolutions" verglichen. Sofern der Abgleich zutreffend ist, gilt die Bedingung als erfüllt.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*

rule "Form-Solutions Beispiel-Regel"
when
  Component($form:searchInputComponent ("Komponente xy"), $form !=null), $form.getStringValue() == "formsolutions" and
  Panel(identifier == "Panel A", $solutions:getInputComponent("Komponente z"), $solutions !=null)
then
 <Konsequenz>
end

!= entspricht ungleich

$<VARIABLENNAME>.getStringValue() != "formsolutions"

Obiges trifft nur dann zu, wenn der Nutzer ein anderes Wort wie „formsolutions“ einträgt.


Then-Teil

Der Then-Teil entspricht der Konsequenz, also das, was ausgeführt wird, sofern alle zuvor definierten Bedingungen zutreffend sind. Eingeleitet wird dieser durch das Stichwort then. Abgeschlossen durch das Stichwort end.

Panelfeld mit einem Wert vor befüllen

Um ein Feld eines Panels zu befüllen kommt folgende Methode zum Einsatz:

$<VARIABLENNAME>.setStringValue("beliebiger Text");

Der Variablenname entspricht der im When-Teil definierten Variable. Der Bereich, welcher mit „beliebiger Text“ gekennzeichnet ist, kann beliebig ausgetauscht werden. Dies entspricht dem Wert, mit welchem das Feld vor befüllt werden soll.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*

rule "Form-Solutions Beispiel-Regel"
when
  Panel(identifier == "Panel A", $solutions:getInputComponent ("Komponente xy"), $solutions !=null)
then
  $solutions.setStringValue("beliebiger Text");
end

  Hinweis:
Eine Panelregel wird nur zum Aufruf der Seite ausgeführt. Das heißt, es ist in diesem Szenario nur möglich, ein Feld zum Start eines Panels zu befüllen. Um einen sofortigen Austausch zu ermöglichen, ist eine Komponentenregel relevant!

Komponenten mit einem neuen Wert laden

Um ein Feld eines Panels in Abhängigkeiten des Benutzers zu befüllen, ist folgende Definition relevant, die an der Komponente hinterlegt wird, bei welcher sich der Wert verändert:

String oldValue=$<VARIABLENNAME>.getStringValue();
<AKTION>
if(!$<VARIABLENNAME>.getStringValue().equals(oldValue)){
$<VARIABLENNAME>.setNeededValueHasChanged(true);
}

Die Variablennamen beziehen sich auf die Komponente, bei welcher der Inhalt neu gesetzt werden soll. Die wird mit der Tätigkeit ersetzt, welche ausgeführt werden soll. Also beispielsweise das Befüllen des Feldes mit einem spezifischen Wert.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*

rule "Form-Solutions Beispiel-Regel"
when
  Component($solutions:searchInputcomponent("Komponente xy"), $solutions != null), $solutions.getStringValue() == "test")
  and Component($form:searchInputcomponent("Komponente zz"), $form != null)
then
 String oldValue=$form.getStringValue();
  $form.setStringValue("formsolutions");
 if(!$form.getStringValue().equals(oldValue)){
  $form.setNeededValueHasChanged(true);
  }
end

In obigem Beispiel wird überprüft, ob der Benutzer in der Komponente „Komponente xy“ den Wert „test“ eingetragen hat. Wenn ja, dann wird der Wert der Komponente „Komponente z“ auf "formsolutions" gesetzt.


Zusätzliche Features

no-loop

Beim Definieren von Regel kann durch falsch definierte Regeln „Regel-Schleifen“ erzeugt werden. Eine solche Regel-Schleife verursacht, dass die Regel immer und immer wieder ausgeführt wird. Mit der Hilfe des Ausdrucks no-loop kann einer solchen Regel-Schleife vorgebeugt werden. Eine solche Regel-Schleife erkennt man dran, wenn ein Fehler erscheint, mit dem Hinweis „zu viele Regelausführungen“ oder der Assistent nach dem Einbau der Regel der Ausfüllprozess extrem langsam wird.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*

rule "Form-Solutions Beispiel-Regel"
no-loop
when
 <Bedingung(en)>
then
 <Konsequenz>
end

Salience Wert

Über den Salience Wert kann die Ausführung der Regel „Prioritätsstufe“ definiert werden. Eine Erteilung/Änderung der Prioritätsstufe wäre beispielsweise nötig, wenn das Resultat von „Regel A“ für die „Regel B“ weiter benötigt wird. „Regel A“ muss also „bevorzugt ausgeführt“ werden und muss daher einen höheren Salience Wert erhalten. Beispielsweise sollte dann „Regel A“ einen Salience Wert von -1 und „Regel B“ einen Salience Wert von -2 erhalten.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*

rule "Form-Solutions Beispiel-Regel"
salience -2
when
 <Bedingung(en)>
then
 <Konsequenz>
end

Regelvorlagen

Jeder Expertenmodus (Validierungsregelbereich, Panelregelbereich, Komponentenregelbereich) enthält eine Sidebar die sogenannte "Regelvorlagen" für den Assistentenersteller bereithält. Über die Schaltfläche mit dem Pfeil öffnet sich die Sidebar. In den jeweiligen Rubriken sind thematisch Regelvorlagen eingepflegt.

Folgende Rubriken beinhalten die Regelvorlage:

  • Datum
    Hier sind Regelvorlagen rund um das Thema Datumsberechnung und Datumsvalidierung enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Validierungsregelexpertenmodus, Panelregelexpertenmodus und Komponentenregelexpertenmodus.
  • Vorbefüllung
    Hier sind Regelvorlagen rund um das Thema Vorbefüllung enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Panelregelexpertenmodus und Komponentenregelexpertenmodus.
  • Verwendungszweck
    Hier sind Regelvorlagen rund um das Thema Verwendungszweck enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Panelregelexpertenmodus und Komponentenregelexpertenmodus.
  • Berechnung
    Hier sind Regelvorlagen rund um das Thema Berechnungen enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich.  Wird angezeigt bei Panelregelexpertenmodus und Komponentenregelexpertenmodus.
  • Sonstiges
    Hier sind Regelvorlagen rund um das Thema sonstiges enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Validierungsregelexpertenmodus, Panelregelexpertenmodus und Komponentenregelexpertenmodus.
  • Multipanel
    Hier sind Regelvorlagen rund um das Thema Multipanel enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Panelregelexpertenmodus und Komponentenregelexpertenmodus.
  • Dateiformat
    Hier sind Regelvorlagen rund um das Thema Dateiformatseinschränkungen enthalten. Wird angezeigt bei Validierungsregelexpertenmodus.
  • Regelvorschläge
    Dieser Bereich enthält eine Verknüpfung zu dem Form-Solutions Support-Assistenten. Über diesen können Verbesserungsvorschläge sowie Regelvorlagenvorschläge an Form-Solutions versendet werden. Wird angezeigt bei Validierungsregelexpertenmodus, Panelregelexpertenmodus und Komponentenregelexpertenmodus.

Ansicht der Sidebar der Regelvorlagen im Expertenmodus

Über einen "Linksklick" auf eine Regelvorlage kann diese in den Expertenmodus eingefügt werden. Hierbei ordnet sich die Regelvorlage bei bereits bestehenden Code an die entsprechende Stelle an. Imports werden beispspielsweise an den Anfang des bestehenden Codes hinzugefügt.

Ansicht einer Regelvorlage einfügen in den Expertenmodus

Über einen "Rechtsklick" auf eine Regelvorlage erscheint jeweils ein Kontextmenü, mit dem eine Beschreibung der Regelvorlage sowie eine Vorschau des Codes angezeigt werden kann.

Ansicht der Regelbeschreibung und Regelvorschau der Regelvorlagen


Inhaltsassistenzsystem

Der Expertemodusbereich ist mit einem sogenannten Inhaltsassistenzsystem ausgestattet. Dieser dient zur Erleichterung der manuellen Eingabe eines erzeugten bzw. neu erstellten Codes mit Hilfe integrierten Bausteine in einer Vorschlagsliste mittels eines Klicks einzufügen. Weiterhin werden alle vom Benutzer definierten Bezeichnungen im Assistenten über die Vorschlagsliste angezeigt.

  Hinweis:
Das Inhaltsassistenzsystem führt nur neue/geänderte Panel- und Komponentenbezeichnungen auf, wenn der Assistent zuvor gespeichert wurden.

Die Vorschlagsliste des Inhaltsassistenzsystems beinhaltet Bausteine mit folgenden Kategorien:

  • snippets
    Snippets sind kleine einfügbare Code-Schnipsel die für den Grundaufbau einer Regel benötigt werden.
  • Datentyp
    Die verschiedenen Datentypen die dem Anwender zur Verfügung stehen.
  • Funktion
    Eine Java-Methode die zum Beispiel zum Verarbeiten von Feldinputs benötigt werden.
  • Regelbau
    Schlagwörter und Ausdrücke die in fast allen Regeln verwendet werden und zum Grundstock von Drools gehören.
  • Drools
    Spezielle Drools-Syntax
  • Komponente im Assistent
    Zeigt alle Komponenten die Assistenten verbaut sind.
  • Komponente aktuelles Panel
    Zeigt auf, dass die Komponenten im aktuellen Panel sich befindet.
  • Panel im Assistenten
    Zeigt alle Panels auf die im Assistenten verbaut sind.
  • dieses Panel
    Zeigt auf, dass das Panel im aktuellen Panel sich befindet.
  • Casting
    Umwandlung eines Datentyps in einen anderen.

Expertenmodus mit der Vorschlagsliste des Inhaltsassistenzsystems

Suche und Ersetzen

Mittels der Tastenkombination Strg + F wird im Expertenmodus die sogenannte „Suche und Ersetzen-Funktion“ eingeblendet.  Über die Felder „Search for“ können nach bestimmten Wörtern im Code gesucht und mittels dem Feld „Replace with“ ersetzt werden.

Expertenmodus mit Suchen und Ersetzenfunktion


Berechnungsregel

Bei den Berechnungsregeln wird die Struktur der Aktivierungsregel um weitere Importierungen erweitert bzw. der then-Teil wird abgeändert.

Panelübergreifende Berechnung

Um eine Summe auf einem anderen Panel zu berechnen, ist folgende Definition relevant:

apply($<VARIABLENNAME DES ERGEBNISFELD>,<VARIABLENNAME DER FUNKTION>($<VARIABLENNAME>, $<VARIABLENNAME>));

Nehmen wir beispielsweise eine einfache Berechnung bei der auf „Panel A“ die Komponenten „Komponente A“ und „Komponente B“ addiert werden sollen. Das Ergebnis soll auf einem separaten Panel „Panel B“ in die „Komponente C“ geschrieben werden.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*
import function de.formsolutions.metaform.rules.util.MathUtil.add
import function de.formsolutions.metaform.rules.util.MathUtil.apply

rule "Form-Solutions Beispiel-Regel"
when
  Panel(identifier == "Panel A", $Betrag1:getInputComponent("Komponente A"), $Betrag1 !=null) and
  Panel(identifier == "Panel A", $Betrag2:getInputComponent("Komponente B"), $Betrag2 !=null) and
  Panel(identifier == "Panel B", $Summe:getInputComponent("Komponente C"), $Summe !=null)
then
  apply($Summe,add($Betrag1, $Betrag2));
end

04_1_Regelbau-Expertenregel-PanelübergreifendeBerechnung.jpg

Komponenten Berechnung in einem Panel

Um eine Summe auf einem Panel zu berechnen, ist folgende Definition relevant:

String oldValue=$<VARIABLENNAME>.getStringValue();
apply($<VARIABLENNAME DES ERGEBNISFELD>,<VARIABLENNAME DER FUNKTION>($<VARIABLENNAME>,$<VARIABLENNAME>));
if(!$<VARIABLENNAME DES ERGEBNISFELD>.getStringValue().equals(oldValue)) {
$<VARIABLENNAME DES ERGEBNISFELD>.setNeededValueHasChanged(true); }

Nehmen wir beispielsweise eine einfache Berechnung, bei der auf „Panel A“ die Komponenten „Komponente A“ und „Komponente B“ addiert werden sollen. Das Ergebnis soll auf „Panel A“ in der „Komponente C“ geschrieben werden.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*
import function de.formsolutions.metaform.rules.util.MathUtil.add
import function de.formsolutions.metaform.rules.util.MathUtil.apply

rule "Form-Solutions Beispiel-Regel"
when
  Component($Betrag1:searchInputComponent("Komponente A"), $Betrag1 !=null) and
  Component($Betrag2:searchInputComponent("Komponente B"), $Betrag2 !=null) and
  Component($Summe:searchInputComponent("Komponente C"), $Summe !=null)
then
 String oldValue=$Summe.getStringValue();
  apply($Summe,add($Betrag2, $Betrag2));
 if(!$Summe.getStringValue().equals(oldValue)) {
  $Summe.setNeededValueHasChanged(true);
  }
end

Rundungen der Dezimalzahlen

Weiterhin können Regeln so definiert werden, dass ab einer bestimmten Nachkommastelle das Ergebnis auf-/abgerundet wird.

Um eine Rundung zu definieren, ist folgende Definition relevant:

apply($<VARIABLENNAME DES ERGEBNISFELD>,round(<VARIABLENAME DER FUNKTION>($<VARIABLENNAME>,$<VARIABLENNAME>),<ANZAHL DER NACHKOMMASTELLEN));

Nehmen wir beispielsweise einer einfachen Berechnung, bei der auf „Panel A“ die Komponenten „Komponente A“ und „Komponente B“ addiert werden sollen. Das Ergebnis soll auf „Panel B“ in der „Komponente C“ geschrieben werden und die zweite Nachkommastelle gerundet werden.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*
import function de.formsolutions.metaform.rules.util.MathUtil.add
import function de.formsolutions.metaform.rules.util.MathUtil.apply
import function de.formsolutions.metaform.rules.util.MathUtil.round

rule "Form-Solutions Beispiel-Regel"
when
  Panel(identifier == "Panel A", $Betrag1:getInputComponent("Komponente A"), $Betrag1 !=null) and
  Panel(identifier == "Panel A", $Betrag2:getInputComponent("Komponente B"), $Summe !=null) and
  Panel(identifier == "Panel B", $Summe:getInputComponent("Komponente C"), $Summe !=null)
then
  apply($Summe,round(add($Betrag1,$Betrag2),2));
end

Dezimalzahl in der Komponentenkonfiguration

Multipanelberechnung

Die Berechnung von Multipanels ist aktuell noch nicht über den grafischen Berechnungsregeleditor konfigurierbar. Standardmäßig werden im grafischen Berechnungsregeleditor die Werte aufsummiert.

Um eine Multipanel zu definieren, ist folgende Definition relevant:

$<VARIABLENNAME>: MultiPanelMaster(identifier == "PANELNAME")
$<VARIABLENNAME>: Panel(identifier == "PANELNAME",
$<ALTERNATIVER_VARIABLENNAME>:getInputComponent("KOMPONENTE"))
then
   BigDecimal sum = BigDecimal.ZERO;
   java.util.List<Panel> zeilen = $multipanel.getPanelEntities();
  for (Panel zeile: zeilen) {
sum = add(sum, zeile.getInputComponent("KOMPONENTENNAME"));
   }
  apply($summe, divide(sum, 2));
  update($ergebnis);
end

Ein Multipanel „Panel A“ enthält die Komponente „Betrag A“. Der Betrag soll nun je, nachdem wie oft das Multipanel ausgefüllt worden ist, addiert werden. Das Ergebnis wird in das Panel „Panel B“ in der Komponente „Betrag C“ eingetragen.

Beispiel:

package de.formsolutions.metaform
import de.formsolutions.metaform.model.*
import java.math.BigDecimal
import function de.formsolutions.metaform.rules.util.MathUtil.divide
import function de.formsolutions.metaform.rules.util.MathUtil.apply
import function de.formsolutions.metaform.rules.util.MathUtil.add

rule "Form-Solutions Beispiel-Regel"
when
  $Multi: MultiPanelMaster(identifier == "Panel A")
  Panel(identifier == "Panel B", $Summebetrag:getInputComponent("Betrag C"), $Summebetrag !=null)
then
  BigDecimal multi = BigDecimal.ZERO;
  java.util.List<Panel> multiRows = $Multi.getPanelEntities();
 for(Panel multiRow: multiRows){
  multi = add(multi, multiRow.getInputComponent("Betrag A"));
  }
  apply($Summebetrag,multi);
end

  Hinweis:
Es muss für das Multipanel der Name des Panelnamens in dem Code verwendet werden.

Panelname in der Multipanelkonfiguration

Tags: