Wiki-Quellcode von Expertenmodus

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