Themen in Übersicht:
- Funktion: Formeln
- Formel Datentypen und Syntax
- Mathematische Operatoren
- String Operatoren
- Conditional Operatoren - Einfach
- Conditional Operatoren - Mehrfach
- Eine Formel anlegen
- Best-Practice
- Oft gestellte Fragen
Funktion: Formeln
- Durch den Einsatz von Formeln ist es möglich aus wenigen Informationen einen Mehrwert an Informationen zu generieren, und den Aufwand einer doppelten pflege von Attributen zu verhindern.
- Es kann aus den Formelinputs ② eine Ergebnis ① erzeugt werden (auch Zeichenverkettungen, mathematische Kalkulationen oder auch Conditions)
- Formeln können nur in Typenattributen geschrieben werden, jedoch sowohl aus Instanz als auch Typenattributen befüllt werden.
- Formeln dienen dazu die einen Attributswerte aus anderen Attributen zu bilden, als:
- Attributszusammenfügung <<Attribut_Medium>> z.B. "Wasser" + Attribut_System z.B. "VL" => WasserVL
- Kalkulation z.B.: Breite * Höhe
- "IF-Then-Else" respektive "Wenn-Dann" Formeln sein
- Formeln werden automatisch ausgeführt, ein Benutzerinteraktion ist zur Auslösung dieser nicht erforderlich
- Trim Funktionen, z.B. um ein Attribut, zu zerlegen, welches aber auch als Ganzes auf BiG geführt werden soll
- Replace Funktionen
- Die Formel "Programmiersprache" ist Spring Expressions Language SpEL
Formel Datentypen und Syntax
"Datentypen"
Double / Zahlenattribut (Kommazahl)
parseDouble('ATTRIBUTSNAME')
Interger / Zahlenattribut (Ganzzahl)
parseInt('ATTRIBUTSNAME')
String / Zeichenkette
parseString('ATTRIBUTSNAME')
Date / Zeichenkette
parseDate('ATTRIBUTSNAME')
Null /Leerwerte Werte [i.d.R. nur bei mathematischen Kalkulationen Relevant ]
null
Datumsoperatoren
Current Date / aktuelles Datum DDMMYYYY Aktuelles Datum abfragen - europäisches Format
currentDate("dd.MM.yyyy")
Current Date / aktuelles Datum MMDDYYYY Aktuelles Datum abfragen - US-Format
currentDate("MM.dd.yyyy")
Current Date / aktuelles Datum YYYYMMDDD
currentDate("yyyy.MM.dd")
Differenz in Tagen zwischen zwei Daten
parseString("Start") != "" && parseString("Completion") != "" ?
daysBetween(parseDate("Start", "yyyy-MM-dd"), parseDate("Completion", "yyyy-MM-dd")) :
null
Sollen Monate aus Daten ermittelt werden, können die Tage durch 30 dividiert werden.
Aktuelles Datum in Kalenderwoche wandeln
parseCw("Start Date", "dd.MM.yyyy")
Datum plus 3 Monate berechnen
parseDate("Datum Inbetriebnahme", "dd.MM.yyyy").plusMonths(3)
Nachfolgend ist die Syntax aufgeführt
Der Doppelpunkt ist dass Trennzeichen des zu schreibenden IF-THEN Anweisung
:
Das Fragezeichen ist das Trennzeichen zwischen der Prüfungskondition einer IF-Anweisung und der auszuführenden Anweisung
?
Das doppelte Und Zeichen stellt ein AND dar, und kann in einer IF-Anweisung benutzt werde diese erst auszuführen wenn zwei oder auch mehrere Werte Wahr sein müssen, bevor eine Operation ausgeführt werden sollen
&&
Zwei Pipes stellen das OR dar
||
Es können auch Leere Attributswerte abgefragt werden,
parseString('Raum ID') != null ? 'Befüllt' : 'Wert ist leer'
Die Hochkommata dienen dazu eine Zeichenkette in eine Formel einzufügen, es sind alle Zeichen außer dem Steuerzeichen ' erlaubt
' '
'ich bin eine Zeichenkette'
'6'
'&$*@#'
"4587.78 ich bin auch ein Zeichenkette"
Die runden Klammern / Brackets sind dazu da eine Formel zu kapseln, eine Klammer "(" muss immer mit einer Klammer ")" geschlossen werden. Mithilfe dieser Klammern können Formeln verschachtelt werden.
()
Mathematische Operatoren
Unten aufgeführt ist der Formelcode der verschiedenen Formel Funktionen:
- Attributsübertrag
parseString('System') + parseString('Medium')
- Multiplikation von Kommazahlen, Flaeche =Breite * Höhe
parseDouble('Breite') * parseDouble('Hoehe')
- Multiplikation von Ganzzahlen, Flaeche =Breite * Höhe
parseInt('Breite') * parseInt('Hoehe')
Datumsoperatoren
Unten aufgeführt ist der Formelcode der verschiedenen Formel Funktionen die Daten (Plural Datum) modifizieren:
- Datum um 4 Tage nach hinten erweitern, mit .plusDays(X)
parseDate("Montageplanung abgeschlossen", "yyyy-MM-dd").plusDays(4):
- Datum um 4 Tage reduzieren mit .minusDays(X)
parseDate("Montageplanung abgeschlossen", "yyyy-MM-dd").minusDays(4):
- Datum um 4 Wochen nach hinten erweitern, mit .plusWeeks(X)
parseDate("Montageplanung abgeschlossen", "yyyy-MM-dd").plusWeeks(4):
- Datum um 4 Wochen reduzieren mit .minusWeeks(X)
parseDate("Montageplanung abgeschlossen", "yyyy-MM-dd").minusWeeks(4):
- Datum um minus 6 Monate und Minus 1 Woche kalkulieren
parseDate("Termin", "yyyy-MM-dd").minusMonths(6).minusWeeks(1)
- Datum um 4 Werktage addieren
plusBusinessDays(parseDate("Termin", "yyyy-MM-dd"), 4)
Hinweise:
Sollten bei mathematischen Operatoren die Inputattributswerte teilweise leer sein, wird die folgende Formel nicht ausgeführt, weil die Datenbank leere Attributswerte mit dem Wert null (nicht sichtbar für den User) Kennzeichnet.
Damit dennoch die Formel ausgeführt werden kann, gibt es zwei Varianten:
- ein StandardWERT gesetzt unter dem Tab << Elemente & Attribute >> im entsprechenden Attribut werden, damit dieser Wert in die leeren Instanzen geschrieben wird ist ein Modelllauf erforderlich mehr dazu hier Elemente & Attribute:
- oder die folgende Formel angewandt werden welche null durch eine Double 0 ersetzt.
parseDouble('Tonnage Index 1') != null ? parseDouble('Tonnage Index 1') : 0) + (parseDouble('Tonnage Index 2') != null ? parseDouble('Tonnage Index 2') : 0) + (parseDouble('Tonnage Index 3') != null ? parseDouble('Tonnage Index 3') : 0)
- Beim dividieren von Formel ergebnissen durch Integer / Ganzzahlen sind diese mit einer Nachkommastelle zu führen, ansonsten werden nur Dividenten dividiert welche ganzzahlige Ergebnisse liefern
(
(
(
(parseString('Gesamtfreigabe - Erzeuger') == 'Freigegeben' ? 1 : 0) +
(parseString('Gesamtfreigabe - Durchlässe') == 'Freigegeben' ? 1 : 0) +
(parseString('Gesamtfreigabe - Chemikalien') == 'Freigegeben' ? 1 : 0)
)
/ 11
)
*100
Korrekt wäre, statt <<11>> die Zahl <<11.0>> zu notieren
(
(
(
(parseString('Gesamtfreigabe - Erzeuger') == 'Freigegeben' ? 1 : 0) +
(parseString('Gesamtfreigabe - Durchlässe') == 'Freigegeben' ? 1 : 0) +
(parseString('Gesamtfreigabe - Chemikalien') == 'Freigegeben' ? 1 : 0)
)
/ 11.00
)
*100
String Operatoren
- TrimEnde eines Strings, z.B.: aus dem Attribut Typennamen_Tuere Bei einem Attributswerte TUER_HLZ_130 wird dieser zu TUER_HLZ getrimmt
trimEnd('BIGATTRIBUT', 'CHAR',INDEX)
trimEnd('Typennamen_Tuere', '_',2)
- TrimStart eines Strings, z.B.: aus dem Attribut Typennamen_Tuere Bei einem Attributswerte TUER_HLZ_130 wird dieser zu HLZ_130 getrimmt
trimStart('BIGATTRIBUT', 'CHAR',INDEX)
trimStart('Typennamen_Tuere', '_',2)
- Trim eines Strings
- z.B. aus dem String << test_asdasd, zweiter index, dritter index, letzter__index >> wird im nachfolgenden Beispiel das Wort << dritter index >> herausgeschnitten
trim('BIGATTRIBUT', ',', '2')
trim('Bewehrungsplannummer', '-', '2')
- HINWEIS, wenn der Index über die zu Indizes des zu trennenden Strings hinauslaufen wird der ganze Abgefragte String zurückgespielt, um dies zu verhindern ist folgende Formel anzuwenden:
trim('BIGATTRIBUT', '-', '3').length() != parseString('BIGATTRIBUT').length() ?
trim('BIGATTRIBUT', '-', '3') : ''
trim('Bewehrungsplannummer', ',', '3').length() != parseString('Bewehrungsplannummer').length() ?
trim('Bewehrungsplannummer', ',', '3') : ''
- Ein String kann auch per fixen Indizes extrahiert werden. z.B.: aus << Geschoss >> wird << schos >>
substring('Geschoss', '2', '6')
- Die Länge eines String kann folgender Weise bestimmt werden, z.B. aus dem Typennamen
parseString('instancetype_name').length()
bzw. die Länge einer Komma separierten Listen mit
parseString('Bewehrungsplannummer').split(',').length
Mathematische Operatoren
Addieren
+
parseDouble('lichte Höhe') + parseDouble('Höhe Rohfussboden')
Subtrahieren
-
parseDouble('lichte Höhe') - parseDouble('Höhe Rohfussboden')
Mulitplizieren
*
parseDouble('lichte Höhe') * parseDouble('Höhe Rohfussboden')
Dividieren
/
parseDouble('lichte Höhe') / parseDouble('Höhe Rohfussboden')
Runden
Soll auf bestimmte Nachkommastellen gerundet werden, kann dies wie folgt erreicht werden:
roundDouble("Tage abgeschlossen gemäss Fortschritt", 0) \\Rundung auf 0 Nachkommastellen, d.h. es wird eine Ganzahl ausgegeben
roundDouble("Tage abgeschlossen gemäss Fortschritt", 2) \\Rundung auf 2 Nachkommastellen
Modulo
Es kann via Modulo dividiert werden:
mod
parseDouble('lichte Höhe') mod parseDouble('lichte Höhe')
Exponential Funktionen
^
parseDouble('lichte Höhe')^2
Conditional Operator - Einfach
Equal / Ist gleich
==
Smaler / kleiner
>
Lager / grosser
<
Contains / Enthält
.contains('Fensterla')
Not Contains / Enthält nicht
- Ein Ausrufezeichen ist dabei vor den gesamten String zu setzen
!parseString("Geschoss").contains("1OG")? "Yes":""
StartsWith / Beginnt mit
parseString('Geschoss').startsWith('OG')
- IF-ELSE Formel
(parseString('Nutzungseinheit') == 'HNF' && parseString('SIA') == '8.1') ? 'Wahr' : 'False'
- IF-ELSE Condition mit zu schreibenden Attributswert
parseString(Betriebsrelevant [Annahme]') == 'ja' ?
parseString('Bezeichnung') : 'Nicht erforderlich'
- Komplexere IF-ELSE Condition mit zu schreibenden Attributswert
parseString('Betriebsrelevant [Annahme]') == 'ja' ?
parseString('Bezeichnung') + ' ' + parseString('Nummer') : '-'
- Contains Formel mit einem OR
parseString('instancetype_name').contains('FEN_')||parseString('instancetype_name').contains('fenster')?
'Fenster, Aussentüren, Tore'
:''
Conditional Operator - Mehrfach
Es können auch mehrfache / n-te IF-Conditions aufgestellt werden:
Die u.g. Conditions fragen jeweils das Attribut <<Lage Aussen>> ab, wenn dieses Attribut den Attributswerte 'Aussen' besitzt wird in das Formelattribut der Wert 'C.2.1' geschrieben, wenn dieses Attribut den Attributswerte 'Innen' besitzt wird in das Formelattribut der Wert 'C2.2' geschrieben
( parseString('Lage Aussen') == 'Aussen' ? 'C2.1' :
( parseString('Lage Aussen') == 'Innen' ? 'C2.2' :
'-'))
Eine weitere Variante der o.g. Formel nur mit einer dritten Condition.
( parseString('Lage Aussen') == 'Aussen' ? 'C2.1' :
( parseString('Lage Aussen') == 'Innen' ? 'C2.2' :
( parseString('Lage Aussen') == 'oben' ? 'C5.2' :
'-')))
Verkettung von Expressions
Expressions können verkettet werden, dafür muss ein Punkt als Trennzeichen zwischen den Expressions gesetzt werden, die Expressions werden dabei von link nach rechts "geparst" bzw. weitergegeben
.
Eine verkette Expression z.B.:
parseString('instancetype_name').contains('FEN_')
Datumsabfrage
Abfrage des aktuellen Datums
currentDate("dd.MM.yyyy")
Vergleich von Daten
(currentDate() > parseDate("End Date", "dd.MM.yyyy"))? "erledigt": "offen"
Eine Formel anlegen
- Im nachfolgenden Beispiel sollen die Attributen <<System>> und <<Medium>> in ein Attribut Kennzeichnung geschrieben werden:
- Im Tab Elemente & Attribute kann die Formel, in einem Typenattribut angelegt werden
- Dazu ist das Taschenrechner Symbol auszuwählen,
- Die Funktion (im Beispiel <<parseString>>) und dass zu überführende / parsende Attribut auszuwählen und hinzuzufügen
- Hinzugefügtes Attribut zur Formel auf dem Typenattribut (hier <<Kennzeichnungsschlüssel>>)
- Um zwei oder mehr Attribute zusammenzuführen ist der Operator Plus <<+>> zuwählen und hinzuzufügen
- Die Fertige Formel, dass Attribut <<Medium>> wurden nun noch zusätzlich hinzugefügt
- Es können noch Freitextbezeichnungen hinzugefügt werden, diese sind im schwarzen Formel Feld manuell zu editieren, die Zeichen können beliebig gewählt werden, ausser dem Hochkommazeichen << ' >> sind dort alle erlaubt.
Der oben gezeigte Beispielformelcode:
'DEMO' + parseString('System') + '_' + parseString('Medium')
- Das Attribut Kennzeichnung wird nun autom. aus dem Feld System und Medium gebildet mit einem Unterstrich als Trennzeichen
Hinweise
- Formeln können nur auf Attribute innerhalb ihrer Instanz zugreifen, einen Zugriff auf Attribute anderer Elemente oder anderer Instanzen im selben Element, kann über Relationen editiert werden, die bspw. die "Fremden Attributswerte" auf ein (Hilfs-)Attribut übertragen.
- Formeln sind immer Live, d.h. die Formelwerte werden sofort aktualisiert.
- Die in den Formeln hinterlegten Attributsnamen werden bei Umbenennung eines Attributs nicht mit umbenannt, diese müssen manuell im Formeleditor nachgeführt werden.
- Das Hochkomma << ' >> ist in Attributswerten und Freitextbezeichnungen nicht zu verwenden, da dieses zur Klammerung dieser verwendet.
- Der Formeleditor prüft nur die korrekte Syntax, nicht auf die Logik.
- Eine Geöffnete Klammer ( muss auch immer mit einer Klammer ) geschlossen werden!
- Es existiert ein Zeichenlimit innerhalb des Formeleditors, dieses liegt bei 10 000 Zeichen.
- Formel können auch global editiert werden, indem man diese in der Attributsmatrix editiert bzw. anlegt.
Merksatz:
- Formeln funktionieren horizontal (nur mit Attributen aus der selben Instanz) und Relationen vertikal (mit jeder Instanz aber nur "einem" Attribut), siehe hierzu Relationen
Best-Practice
- Es empfiehlt sich das Typenattribut, auf welchem eine Formel liegt auch, zu schützen, um dort nur durch die Formel oder einen durch ein Mapping befüllten Werte zu erlauben.
- Sollen gleiche Formeln in mehreren Attributen oder Elemente vorliegen so können diese effizient über einen Batchexport / Batchimport übertragen werden, siehe hierzu Batch Export und Import
Oft gestellte Fragen
- Wieso kann ich Formeln nicht als globales Attribut auswählen? Diese Funktionalität ist nur bei aktivierte Elastic Search verfügbar, dies kann in der Konfiguration eingestellt werden.
- Bei weiteren Fragen, gerne eine Email an: info@kaulquappe.com
Kommentare
0 Kommentare
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.