Wiki-Quellcode von Expertenmodus

Zuletzt geändert von MACH ProForms GmbH am 19.08.2025

Zeige letzte Bearbeiter
1 Der **Expertenmodus** richtet sich an fortgeschrittene Anwender mit grundlegenden Kenntnissen in Java. Er dient zur Definition und Erweiterung von Regeln und Fachlogik in Ergänzung und über die Möglichkeiten der grafischen Editoren hinaus. 
2 Die Schaltfläche **Expertenmodus** befindet sich rechts oben im grafischen Regeleditor.
3
4 Expertenregeln können selbst geschrieben werden, aus Bausteinen und Beispielen angepasst und abgewandelt werden, oder auf Basis von Regeln aus dem grafischen Regeleditor entwickelt werden.
5
6 Beim Erstellen oder Bearbeiten einer Regel im grafischen Editor wird eine entsprechende Regel als Text im Expertenmodus generiert. Diese kann anschließend manuell bearbeitet, erweitert oder vollständig neu definiert werden.
7 Dabei muss beachtet werden, dass Änderungen im Expertenmdus gegebenenfalls nicht mehr im grafischen Editor angezeigt und bearbeitet werden können.
8
9 **Inhaltsverzeichnis**
10
11 {{toc depth="2" start="2"/}}
12
13 == Grundlagen der Expertenregeln ==
14
15 === Standardstruktur ===
16
17 Expertenregeln ([[Aktivierungsregeln>>Main.05_Assistenten.04_Assistentenbauoberfläche.07_Regelbau.03_Klickregeln.01_Aktivierungsregeln]] und [[Berechnungsregeln>>Main.05_Assistenten.04_Assistentenbauoberfläche.07_Regelbau.03_Klickregeln.02_Berechnungsregeln]]) folgen der Standardstruktur:
18
19 {{code language="javascript"}}
20 <Package>
21 <Importierungen>
22 rule "<Eindeutige Bezeichnung für die Regel>"
23 when
24 <Bedingungen>
25 then
26 <Anweisungen>
27 end
28 {{/code}}
29
30 Die Einrückungen dienen der Lesbarkeit und haben keine Funktionsbedeutung.
31
32 ----
33
34 == Basis-Paket/Importierungen & Regelnamen ==
35
36 === Basis-Paket ===
37
38 In jedem Bereich der Expertenregeln (Panel-/Komponentenregel) müssen bei einer Definition jeweils folgende Einträge **einmalig** vorgenommen werden.
39
40 {{code language="javascript"}}
41 package de.formsolutions.metaform
42 import de.formsolutions.metaform.model.*
43 {{/code}}
44
45 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.
46
47 === Importierungen ===
48
49 Folgende Importierungen können beispielsweise bei **Bedarf** hinzugefügt werden:
50
51 Diese Importierungen müssen in folgender Form dargestellt werden.
52
53 {{code language="javascript"}}
54 import function de.formsolutions.metaform.rules.util.<Utilname>Util.<Funktionsname>
55 {{/code}}
56
57 Die in der nachfolgenden Tabelle genannten Bezeichnungen wie beispielsweise „$Anzahl“ sind Variablen, die im Vorfeld benannt werden müssen.
58
59 ==== MathUtil ====
60
61 |=Funktionsname|=Beschreibung|=Beispiel
62 |{{code language="none"}}apply{{/code}}|Dem im ersten Parameter angegeben Objekt wird der im zweiten Parameter angegebene Wert zugewiesen.|{{code language="none"}}apply($Gesamt, add($Preis1, $Preis2)){{/code}}
63 |{{code language="none"}}add{{/code}}|Alle gültigen Parameter werden aufsummiert|{{code language="none"}}apply($Gesamtanzahl, add($Anzahl, 1, 3)){{/code}}
64 |{{code language="none"}}subtract{{/code}}|Der zweite Parameter wird vom ersten subtrahiert.|{{code language="none"}}apply($GesamtGebuehr, subtract($Gebuehr, $Rabatt)){{/code}}
65 |{{code language="none"}}multiply{{/code}}|Alle gültigen Parameter werden multipliziert.|{{code language="none"}}apply($Gesamtpreis, multiply($Anzahl, $Einzelpreis)){{/code}}
66 |{{code language="none"}}divide{{/code}}|Der erste Parameter wird durch den zweiten dividiert.|{{code language="none"}}apply($Gesamtpreis, divide($Gesamtpreis, $Anzahl)){{/code}}
67 |{{code language="none"}}min{{/code}}|Die kleinste Zahl wird zurückgeliefert.|{{code language="none"}}apply($Gesamtpegel, min($Pegel1, $Pegel2)){{/code}}
68 |{{code language="none"}}max{{/code}}|Die größte Zahl wird zurückgeliefert.|{{code language="none"}}apply($Gesamtpegel, max($Pegel1, $Pegel2)){{/code}}
69 |{{code language="none"}}fallback{{/code}}|Sollte der erste Wert leer sein, wird der zweite zurückgeliefert.|{{code language="none"}}apply($Gesamtsteuer, fallback($MWSt, 0.19)){{/code}}
70 |{{code language="none"}}round{{/code}}|Runde den ersten Wert auf so viele Stellen, wie im zweiten Parameter angegeben.|{{code language="none"}}apply($Gesamt, round($Gesamtpreis, 2)){{/code}}
71
72 ==== DateUtil ====
73
74 Diese Importierung muss vorangestellt werden:
75
76 {{code language="javascript"}}
77 import function de.formsolutions.metaform.rules.util.DateUtil.<Funktionsname>
78 import org.joda.time.LocalDate
79 {{/code}}
80
81 |=Funktionsname|=Beschreibung|=Beispiel
82 |{{code language="none"}}isAfter{{/code}}|Wert wird geprüft, ob dieser nach einem anderen Wert liegt.|{{code language="none"}}isAfter(new Date(), $VARIABLENNAME0){{/code}}
83 |{{code language="none"}}isBefore{{/code}}|Wert wird geprüft, ob dieser vor einem anderen Wert liegt.|{{code language="none"}}isBefore(new Date(), $VARIABLENNAME0){{/code}}
84 |{{code language="none"}}isEqual{{/code}}|Wert wird geprüft, ob dieser gleich ist mit einem anderen Wert.|{{code language="none"}}isEqual($VARIABLENNAME0, $VARIABLENNAME1){{/code}}
85 |{{code language="none"}}isBetween{{/code}}|Wert muss zwischen zwei anderen Werten liegen.|{{code language="none"}}isBetween($VARIABLENNAME, new LocalDate().minusYears(64), new LocalDate().minusYears(18)){{/code}}
86 |{{code language="none"}}computeDaysBetween{{/code}}|Prüft die Länge zwischen zwei angegebenen Werten in Tagen.|{{code language="none"}}computeDaysBetween($VARIABLENNAME0, new Date()){{/code}}
87 |{{code language="none"}}computeWeeksBetween{{/code}}|Prüft die Länge zwischen zwei angegebenen Werten in Wochen.|{{code language="none"}}computeWeeksBetween($VARIABLENNAME0, new Date()){{/code}}
88 |{{code language="none"}}computeMonthsBetween{{/code}}|Prüft die Länge zwischen zwei angegebenen Werten in Monaten.|{{code language="none"}}computeMonthsBetween($VARIABLENNAME0, new Date()){{/code}}
89 |{{code language="none"}}computeYearsBetween{{/code}}|Prüft die Länge zwischen zwei angegebenen Werten in Jahren.|{{code language="none"}}computeYearsBetween($VARIABLENNAME0, new Date()){{/code}}
90 |{{code language="none"}}isPersonOlderThan{{/code}}|Wert wird geprüft, ob er höher ist als ein anderer Wert|{{code language="none"}}isPersonOlderThan($VARIABLENNAME0, ALTERSVARIABLE){{/code}}
91 |{{code language="none"}}isMonday{{/code}}|Prüft, ob der Wert ein Montag ist.|{{code language="none"}}if(isMonday($VARIABLENNAME0)){{/code}}
92 |{{code language="none"}}isTuesday{{/code}}|Prüft, ob der Wert ein Dienstag ist.|{{code language="none"}}if(isTuesday($VARIABLENNAME0)){{/code}}
93 |{{code language="none"}}isWednesday{{/code}}|Prüft, ob der Wert ein Mittwoch ist.|{{code language="none"}}if(isWednesday($VARIABLENNAME0)){{/code}}
94 |{{code language="none"}}isThursday{{/code}}|Prüft, ob der Wert ein Donnerstag ist.|{{code language="none"}}if(isThursday($VARIABLENNAME0)){{/code}}
95 |{{code language="none"}}isFriday{{/code}}|Prüft, ob der Wert ein Freitag ist.|{{code language="none"}}if(isFriday($VARIABLENNAME0)){{/code}}
96 |{{code language="none"}}isSaturday{{/code}}|Prüft, ob der Wert ein Samstag ist.|{{code language="none"}}if(isSaturday($VARIABLENNAME0)){{/code}}
97 |{{code language="none"}}isSunday{{/code}}|Prüft, ob der Wert ein Sonntag ist.|{{code language="none"}}if(isSunday($VARIABLENNAME0)){{/code}}
98 |{{code language="none"}}isTimeBefore{{/code}}|Wert wird geprüft, ob dieser vor einem anderen Wert liegt.|{{code language="none"}}isTimeBefore(new Date(), $VARIABLENNAME0){{/code}}
99 |{{code language="none"}}isTimeAfter{{/code}}|Wert wird geprüft, ob dieser nach einem anderen Wert liegt.|{{code language="none"}}isTimeAfter(new Date(), $VARIABLENNAME0){{/code}}
100
101 ==== Sonstige Imports ====
102
103 Diese Importierung muss vorangestellt werden:
104
105 {{code language="javascript"}}
106 import java.util.LinkedList;
107 import java.util.List;
108 import de.formsolutions.metaform.enums.<Funktionsname>
109 {{/code}}
110
111 |=Funktionsname|=Beschreibung|=Beispiel
112 |{{code language="none"}}setPdfRenderOption{{/code}}|Wert wird geprüft, ob dieser nach einem anderen Wert liegt.|{{code language="none"}}textoutput.setPdfRenderOption(PdfRenderOption.RENDERED);{{/code}}
113
114 >{{icon name="far fa-info-circle" size="3"/}} //**Hinweis:**//
115
116 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.
117 1. Die Funktion "DateUtil" funktioniert nur mit Datumsfeldern.
118
119 === Regelname ===
120
121 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 {{code language="none"}}rule{{/code}} eingeleitet. Der Regelname selbst muss von doppelten Anführungszeichen umgeben sein.
122
123 {{code language="javascript"}}
124 package de.formsolutions.metaform
125 import de.formsolutions.metaform.model.*
126
127 rule "Beispiel-Regel"
128 when
129 <Bedingung(en)>
130 then
131 <Konsequenzen>
132 end
133 {{/code}}
134
135 >{{icon name="far fa-info-circle" size="3"/}} //**Hinweis:**//
136
137 1. Alle durch Größer-/Kleinerzeichen kenntlich gemachte Bereiche müssen ersetzt werden.
138 1. Weiterhin darf ein Regelname nur einmalig vergeben werden.
139
140 ----
141
142 == When-Teil ==
143
144 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 {{code language="none"}}when{{/code}} in der Expertenregel eingeleitet.
145
146 === Paneldefinition ===
147
148 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.
149
150 Die Definition besteht aus zwei Funktionsweisen.
151
152 1. Es wird eine Variable definiert, auf welche im weiteren Verlauf der Regel zugegriffen wird. Diese impliziert die hinterlegte Komponente.
153 1. Beschreibt dieser Bereich eine Bedingung. Erst wenn diese als erfüllt gilt, wird der Then-Teil ausgelöst.{{code language="none"}}Panel(identifier == "<PANELNAME>", $<VARIABLENNAME>:getInputComponent ("<BEZEICHNUNG TECHNISCH>"), $<VARIABLENNAME> !=null){{/code}}
154
155 Auch in diesem Fall müssen jeweils alle Bereiche, die durch Größer-/Kleinerzeichen gekennzeichnet sind, ersetzt werden.
156
157 * < PANELNAME > bezieht sich auf das zu referenzierende Panel. Die Bezeichnung muss identisch wie der hinterlegte Panelname sein.
158 * < 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.
159 * < BEZEICHNUNG TECHNISCH > beschreibt die „Bezeichnung technisch“ einer Komponente. (Komponente bearbeiten -> „Bezeichnung technisch“)
160 * < VARIABLENNAME > entspricht der zuvor definierten Variable. Beide Werte sind in diesem Szenario identisch!
161
162 [[image:@Regelbau-Expertenregel-Elementwert.jpg||alt="Exportwert in der Komponentenkonfiguration"]]
163
164 >{{icon name="far fa-info-circle" size="3"/}} //**Hinweis:**//
165
166 1. Bei der Benennung spielen Leerzeichen sowie Objektgruppen auch eine Rolle. So muss beispielsweise der Objektgruppenname vor den Komponentennamen mittels eines Punkts getrennt werden.
167 1. Weiterhin ist drauf zu achten, dass die im Expertenmodus definierten Regeln nicht automatisch bei einer Änderung der Panel-/Komponentenbenennung geändert werden.
168 1. Auch werden die im Expertenmodus definierten Regeln nicht im grafischen Editor abgebildet.
169
170 Beispiel:
171
172 {{code language="javascript"}}
173 package de.formsolutions.metaform
174 import de.formsolutions.metaform.model.*
175
176 rule "Beispiel-Regel"
177 when
178 Panel(identifier == "Panel A", $formsolutions:getInputComponent ("Komponente xy"), $formsolutions !=null)
179 then
180 <Konsequenz>
181 end
182 {{/code}}
183
184 === Verknüpfungen und Definitionen ===
185
186 Komponenten- und Paneldefinitionen sind beliebig verknüpfbar. Folgende Möglichkeiten sind gegeben:
187
188 1. Panel(...) and Panel(...) and ...
189 1. Panel(...) or Panel(...) and ...
190 1. (Panel(...) and Panel(...)) or ...
191 1. ...
192
193 >{{icon name="far fa-info-circle" size="3"/}} //**Hinweis:**//*
194 >Der Aufruf der Paneldefinition (s. o. Panel (. . . )) lässt sich auch durch die Komponentendefinition ersetzen.
195
196 === Komponentendefinition ===
197
198 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.
199
200 Die Definition besteht aus zwei Funktionsweisen.
201
202 1. Es wird eine Variable definiert, auf welche im weiteren Verlauf der Regel zugegriffen wird. Diese impliziert die hinterlegte Komponente.
203 1. Beschreibt dieser Bereich eine Bedingung. Erst wenn diese als erfüllt gilt, wird der Dann-Teil ausgelöst.{{code language="none"}}Component ($<VARIABLENNAME>:searchInputComponent("<KOMPONENTENNAME>"), $<VARIABLENNAME> !=null){{/code}}Bei einer Paneldefinition ändert sich der Bereich {{code language="none"}}searchInputComponent{{/code}} in {{code language="none"}}getInputComponent{{/code}}.
204
205 * < 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!)
206 * < KOMPONENTENNAME > beschreibt die „Bezeichnung technisch“ einer Komponente. (Komponente bearbeiten -> „Bezeichnung technisch“)
207 * < VARIABLENNAME > entspricht der zuvor definierten Variable. Beide Werte sind in diesem Szenario identisch!
208
209 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.
210
211 >{{icon name="far fa-info-circle" size="3"/}} //**Hinweis:**//
212 >Bei der Benennung spielen Leerzeichen sowie Objektgruppen auch eine Rolle. So muss beispielsweise der Objektgruppenname vor den Komponentennamen und einem Punkt getrennt werden.
213
214 Beispiel:
215
216 {{code language="javascript"}}
217 package de.formsolutions.metaform
218 import de.formsolutions.metaform.model.*
219
220 rule "Beispiel-Regel"
221 when
222 Component($form:searchInputComponent ("Komponente xy"), $form !=null) and Panel(identifier == "Panel A",
223 $solutions:getInputComponent("Komponente z"), $solutions !=null)
224 then
225 <Konsequenz>
226 end
227 {{/code}}
228
229 === Ermittlung eines Feldwertes ===
230
231 Um im When-Teil zu überprüfen, ob der Benutzer eine Eingabe getätigt hat, kann folgendes Schema verwendet werden:
232
233 {{code language="javascript"}}
234 $<VARIABLENNAME>.getStringValue() == "formsolutions"
235 {{/code}}
236
237 **== entspricht ist gleich**
238 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.
239
240 Beispiel:
241
242 {{code language="javascript"}}
243 package de.formsolutions.metaform
244 import de.formsolutions.metaform.model.*
245
246 rule "Beispiel-Regel"
247 when
248 Component($form:searchInputComponent ("Komponente xy"), $form !=null), $form.getStringValue() == "formsolutions" and
249 Panel(identifier == "Panel A", $solutions:getInputComponent("Komponente z"), $solutions !=null)
250 then
251 <Konsequenz>
252 end
253 {{/code}}
254
255 **!= entspricht ungleich**
256
257 {{code language="javascript"}}
258 $<VARIABLENNAME>.getStringValue() != "formsolutions"
259 {{/code}}
260
261 Obiges trifft nur dann zu, wenn der Nutzer ein anderes Wort wie „formsolutions“ einträgt.
262
263 ----
264
265 == Then-Teil ==
266
267 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 {{code language="none"}}then{{/code}}. Abgeschlossen durch das Stichwort {{code language="none"}}end{{/code}}.
268
269 === Panelfeld mit einem Wert vor befüllen ===
270
271 Um ein Feld eines Panels zu befüllen kommt folgende Methode zum Einsatz:
272
273 {{code language="javascript"}}
274 $<VARIABLENNAME>.setStringValue("beliebiger Text");
275 {{/code}}
276
277 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.
278
279 Beispiel:
280
281 {{code language="javascript"}}
282 package de.formsolutions.metaform
283 import de.formsolutions.metaform.model.*
284
285 rule "Beispiel-Regel"
286 when
287 Panel(identifier == "Panel A", $solutions:getInputComponent ("Komponente xy"), $solutions !=null)
288 then
289 $solutions.setStringValue("beliebiger Text");
290 end
291 {{/code}}
292
293 >{{icon name="far fa-info-circle" size="3"/}} //**Hinweis:**//
294 >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!
295
296 === Komponenten mit einem neuen Wert laden ===
297
298 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:
299
300 {{code language="javascript"}}
301 String oldValue=$<VARIABLENNAME>.getStringValue();
302 <AKTION>
303 if(!$<VARIABLENNAME>.getStringValue().equals(oldValue)){
304 $<VARIABLENNAME>.setNeededValueHasChanged(true);
305 }
306 {{/code}}
307
308 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.
309
310 Beispiel:
311
312 {{code language="javascript"}}
313 package de.formsolutions.metaform
314 import de.formsolutions.metaform.model.*
315
316 rule "Beispiel-Regel"
317 when
318 Component($solutions:searchInputcomponent("Komponente xy"), $solutions != null), $solutions.getStringValue() == "test")
319 and Component($form:searchInputcomponent("Komponente zz"), $form != null)
320 then
321 String oldValue=$form.getStringValue();
322 $form.setStringValue("formsolutions");
323 if(!$form.getStringValue().equals(oldValue)){
324 $form.setNeededValueHasChanged(true);
325 }
326 end
327 {{/code}}
328
329 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.
330
331 ----
332
333 == Zusätzliche Features ==
334
335 === no-loop ===
336
337 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 {{code language="none"}}no-loop{{/code}} 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.
338
339 Beispiel:
340
341 {{code language="javascript"}}
342 package de.formsolutions.metaform
343 import de.formsolutions.metaform.model.*
344
345 rule " Beispiel-Regel"
346 no-loop
347 when
348 <Bedingung(en)>
349 then
350 <Konsequenz>
351 end
352 {{/code}}
353
354 ==== Salience Wert ====
355
356 Über den {{code language="none"}}Salience Wert{{/code}} 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.
357
358 Beispiel:
359
360 {{code language="javascript"}}
361 package de.formsolutions.metaform
362 import de.formsolutions.metaform.model.*
363
364 rule "Beispiel-Regel"
365 salience -2
366 when
367 <Bedingung(en)>
368 then
369 <Konsequenz>
370 end
371 {{/code}}
372
373 ----
374
375 == Regelvorlagen ==
376
377 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.
378
379 Folgende Rubriken beinhalten die Regelvorlage:
380
381 * **Datum**
382 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.
383 * **Vorbefüllung**
384 Hier sind Regelvorlagen rund um das Thema Vorbefüllung enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Panelregelexpertenmodus und Komponentenregelexpertenmodus.
385 * **Verwendungszweck**
386 Hier sind Regelvorlagen rund um das Thema Verwendungszweck enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Panelregelexpertenmodus und Komponentenregelexpertenmodus.
387 * **Berechnung**
388 Hier sind Regelvorlagen rund um das Thema Berechnungen enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Panelregelexpertenmodus und Komponentenregelexpertenmodus.
389 * **Sonstiges**
390 Hier sind Regelvorlagen rund um das Thema sonstiges enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Validierungsregelexpertenmodus, Panelregelexpertenmodus und Komponentenregelexpertenmodus.
391 * **Multipanel**
392 Hier sind Regelvorlagen rund um das Thema Multipanel enthalten. Der Inhalt ändert sich je nach Expertenmodusbereich. Wird angezeigt bei Panelregelexpertenmodus und Komponentenregelexpertenmodus.
393 * **Dateiformat**
394 Hier sind Regelvorlagen rund um das Thema Dateiformatseinschränkungen enthalten. Wird angezeigt bei Validierungsregelexpertenmodus.
395 * **Regelvorschläge**
396 Dieser Bereich enthält eine Verknüpfung zu dem MACH formsolutions Support-Assistenten. Über diesen können Verbesserungsvorschläge sowie Regelvorlagenvorschläge an MACH ProForms GmbH versendet werden. Wird angezeigt bei Validierungsregelexpertenmodus, Panelregelexpertenmodus und Komponentenregelexpertenmodus.
397
398
399
400 Ü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.
401
402
403 Über einen "Rechtsklick" auf eine Regelvorlage erscheint jeweils ein Kontextmenü, mit dem eine Beschreibung der Regelvorlage sowie eine Vorschau des Codes angezeigt werden kann.
404
405 [[image:@Regelbau-Expertenregel-Regelvorlagen-Vorschau.jpg||alt="Ansicht der Regelbeschreibung und Regelvorschau der Regelvorlagen"]]
406
407 ----
408
409 == Inhaltsassistenzsystem ==
410
411 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.
412
413 >{{icon name="far fa-info-circle" size="3"/}} //**Hinweis:**//
414 >Das Inhaltsassistenzsystem führt nur neue/geänderte Panel- und Komponentenbezeichnungen auf, wenn der Assistent zuvor gespeichert wurden.
415
416 Die Vorschlagsliste des Inhaltsassistenzsystems beinhaltet Bausteine mit folgenden Kategorien:
417
418 * **snippets**
419 Snippets sind kleine einfügbare Code-Schnipsel die für den Grundaufbau einer Regel benötigt werden.
420 * **Datentyp**
421 Die verschiedenen Datentypen die dem Anwender zur Verfügung stehen.
422 * **Funktion**
423 Eine Java-Methode die zum Beispiel zum Verarbeiten von Feldinputs benötigt werden.
424 * **Regelbau**
425 Schlagwörter und Ausdrücke die in fast allen Regeln verwendet werden und zum Grundstock von Drools gehören.
426 * **Drools**
427 Spezielle Drools-Syntax
428 * **Komponente im Assistent**
429 Zeigt alle Komponenten die Assistenten verbaut sind.
430 * **Komponente aktuelles Panel**
431 Zeigt auf, dass die Komponenten im aktuellen Panel sich befindet.
432 * **Panel im Assistenten**
433 Zeigt alle Panels auf die im Assistenten verbaut sind.
434 * **dieses Panel**
435 Zeigt auf, dass das Panel im aktuellen Panel sich befindet.
436 * **Casting**
437 Umwandlung eines Datentyps in einen anderen.
438
439 [[image:@RegelbauInhaltsassistentsystem.jpg||alt="Expertenmodus mit der Vorschlagsliste des Inhaltsassistenzsystems"]]
440
441 === Suche und Ersetzen ===
442
443 Mittels der Tastenkombination {{code language="none"}}Strg + F{{/code}} wird im Expertenmodus die „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.
444
445 [[image:@Regelbau-Expertenregel-SucheErsetzen.jpg||alt="Expertenmodus mit Suchen und Ersetzenfunktion"]]
446
447 ----
448
449 == Berechnungsregel ==
450
451 Bei den Berechnungsregeln wird die Struktur der Aktivierungsregel um weitere Importierungen erweitert bzw. der {{code language="none"}}then-Teil{{/code}} wird abgeändert.
452
453 === Panelübergreifende Berechnung ===
454
455 Um eine Summe auf einem anderen Panel zu berechnen, ist folgende Definition relevant:
456
457 {{code language="javascript"}}
458 apply($<VARIABLENNAME DES ERGEBNISFELD>,<VARIABLENNAME DER FUNKTION>($<VARIABLENNAME>, $<VARIABLENNAME>));
459 {{/code}}
460
461 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.
462
463 Beispiel:
464
465 {{code language="javascript"}}
466 package de.formsolutions.metaform
467 import de.formsolutions.metaform.model.*
468 import function de.formsolutions.metaform.rules.util.MathUtil.add
469 import function de.formsolutions.metaform.rules.util.MathUtil.apply
470
471 rule "Beispiel-Regel"
472 when
473 Panel(identifier == "Panel A", $Betrag1:getInputComponent("Komponente A"), $Betrag1 !=null) and
474 Panel(identifier == "Panel A", $Betrag2:getInputComponent("Komponente B"), $Betrag2 !=null) and
475 Panel(identifier == "Panel B", $Summe:getInputComponent("Komponente C"), $Summe !=null)
476 then
477 apply($Summe,add($Betrag1, $Betrag2));
478 end
479 {{/code}}
480
481
482 === Komponenten Berechnung in einem Panel ===
483
484 Um eine Summe auf einem Panel zu berechnen, ist folgende Definition relevant:
485
486 {{code language="javascript"}}
487 String oldValue=$<VARIABLENNAME>.getStringValue();
488 apply($<VARIABLENNAME DES ERGEBNISFELD>,<VARIABLENNAME DER FUNKTION>($<VARIABLENNAME>,$<VARIABLENNAME>));
489 if(!$<VARIABLENNAME DES ERGEBNISFELD>.getStringValue().equals(oldValue)) {
490 $<VARIABLENNAME DES ERGEBNISFELD>.setNeededValueHasChanged(true); }
491 {{/code}}
492
493 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.
494
495 Beispiel:
496
497 {{code language="javascript"}}
498 package de.formsolutions.metaform
499 import de.formsolutions.metaform.model.*
500 import function de.formsolutions.metaform.rules.util.MathUtil.add
501 import function de.formsolutions.metaform.rules.util.MathUtil.apply
502
503 rule "Beispiel-Regel"
504 when
505 Component($Betrag1:searchInputComponent("Komponente A"), $Betrag1 !=null) and
506 Component($Betrag2:searchInputComponent("Komponente B"), $Betrag2 !=null) and
507 Component($Summe:searchInputComponent("Komponente C"), $Summe !=null)
508 then
509 String oldValue=$Summe.getStringValue();
510 apply($Summe,add($Betrag2, $Betrag2));
511 if(!$Summe.getStringValue().equals(oldValue)) {
512 $Summe.setNeededValueHasChanged(true);
513 }
514 end
515 {{/code}}
516
517 === Rundungen der Dezimalzahlen ===
518
519 Weiterhin können Regeln so definiert werden, dass ab einer bestimmten Nachkommastelle das Ergebnis auf-/abgerundet wird.
520
521 Um eine Rundung zu definieren, ist folgende Definition relevant:
522
523 {{code language="javascript"}}
524 apply($<VARIABLENNAME DES ERGEBNISFELD>,round(<VARIABLENAME DER FUNKTION>($<VARIABLENNAME>,$<VARIABLENNAME>),<ANZAHL DER NACHKOMMASTELLEN));
525 {{/code}}
526
527 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.
528
529 Beispiel:
530
531 {{code language="javascript"}}
532 package de.formsolutions.metaform
533 import de.formsolutions.metaform.model.*
534 import function de.formsolutions.metaform.rules.util.MathUtil.add
535 import function de.formsolutions.metaform.rules.util.MathUtil.apply
536 import function de.formsolutions.metaform.rules.util.MathUtil.round
537
538 rule "Beispiel-Regel"
539 when
540 Panel(identifier == "Panel A", $Betrag1:getInputComponent("Komponente A"), $Betrag1 !=null) and
541 Panel(identifier == "Panel A", $Betrag2:getInputComponent("Komponente B"), $Summe !=null) and
542 Panel(identifier == "Panel B", $Summe:getInputComponent("Komponente C"), $Summe !=null)
543 then
544 apply($Summe,round(add($Betrag1,$Betrag2),2));
545 end
546 {{/code}}
547
548 [[image:@Regelbau-Expertenregel-Runden.jpg||alt="Dezimalzahl in der Komponentenkonfiguration"]]
549
550 == Multipanelberechnung ==
551
552 Die Berechnung von Multipanels ist aktuell noch nicht über den grafischen Berechnungsregeleditor konfigurierbar. Standardmäßig werden im grafischen Berechnungsregeleditor die Werte aufsummiert.
553
554 Um eine Multipanel zu definieren, ist folgende Definition relevant:
555
556 {{code language="javascript"}}
557 $<VARIABLENNAME>: MultiPanelMaster(identifier == "PANELNAME")
558 $<VARIABLENNAME>: Panel(identifier == "PANELNAME",
559 $<ALTERNATIVER_VARIABLENNAME>:getInputComponent("KOMPONENTE"))
560 then
561 BigDecimal sum = BigDecimal.ZERO;
562 java.util.List<Panel> zeilen = $multipanel.getPanelEntities();
563 for (Panel zeile: zeilen) {
564 sum = add(sum, zeile.getInputComponent("KOMPONENTENNAME"));
565 }
566 apply($summe, divide(sum, 2));
567 update($ergebnis);
568 end
569 {{/code}}
570
571 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.
572
573 Beispiel:
574
575 {{code language="javascript"}}
576 package de.formsolutions.metaform
577 import de.formsolutions.metaform.model.*
578 import java.math.BigDecimal
579 import function de.formsolutions.metaform.rules.util.MathUtil.divide
580 import function de.formsolutions.metaform.rules.util.MathUtil.apply
581 import function de.formsolutions.metaform.rules.util.MathUtil.add
582
583 rule "Beispiel-Regel"
584 when
585 $Multi: MultiPanelMaster(identifier == "Panel A")
586 Panel(identifier == "Panel B", $Summebetrag:getInputComponent("Betrag C"), $Summebetrag !=null)
587 then
588 BigDecimal multi = BigDecimal.ZERO;
589 java.util.List<Panel> multiRows = $Multi.getPanelEntities();
590 for(Panel multiRow: multiRows){
591 multi = add(multi, multiRow.getInputComponent("Betrag A"));
592 }
593 apply($Summebetrag,multi);
594 end
595 {{/code}}
596
597 >{{icon name="far fa-info-circle" size="3"/}} //**Hinweis:**//
598 >Es muss für das Multipanel der Name des Panelnamens in dem Code verwendet werden.
599
600
601 == Referenz der Expertenregeln im Anwenderforum ==
602
603 [[https:~~/~~/forum.machproforms.de/index.php?thread/309-methoden-in-den-expertenregeln-eine-%C3%BCbersicht/>>https://forum.machproforms.de/index.php?thread/309-methoden-in-den-expertenregeln-eine-%C3%BCbersicht/]]