Literal Expressions (Funktionen in DMN-Entscheidungen) verwenden

Falls Sie bereits Ihr erstes DMN-Diagramm modelliert haben, kennen Sie schon die Vergleichsoperatoren, die zur Erstellung von Entscheidungstabellen verwendet werden - zum Beispiel den kleiner-gleich Ausdruck.

Diese Operatoren können Sie aus einer Drop-down-Liste auswählen:

das Drop-down-Menü zur Auswahl von Vergleichsoperatoren

das Drop-down-Menü zur Auswahl von Vergleichsoperatoren

In vielen Fällen reichen diese Operatoren jedoch nicht aus, um die gewünschte Entscheidungslogik darzustellen.

Ein einfaches Beispiel hierfür ist die Rabattermittlung auf Basis der Gesammtsumme von gekauften Objekten.

Um die Gesamtsumme zu berechnen, können wir zusätzliche Literal Expressions verwenden. Die Expression Language basiert auf der FEEL-Sprache (friendly enough expression language) die als Teil des DMN Standards spezifiziert ist, den Sie unter http://www.omg.org/spec/DMN/1.0/PDF als PDF herunteraden können.

Lesen Sie mehr:

Die einzelnen Befehle können geschachtelt werden, wie im folgenden Beispiel ersichtlich:

Product([(1 - Rabattrate), Sum(Einkaufsliste)])

Hier berechnen wir einen Einkaufspreis unter Berücksichtigung eines Rabatts. Die Variablen beziehen sich auf die entsprechenden Attribute der Input Data-Elemente und können während der Simulation des Diagramms festgelegt werden.

Die Dokumentation aller Ausdrücke finden Sie unter Dokumentation aller Literal Expressions.

In Literal Expressions können Sie natürlich auch Standardoperatoren (+, -, *, /, and, or) verwenden. Das obige Beispiel lässt sich so noch etwas kürzer gestalten:

(1 - Rabattrate) * Sum(Einkaufsliste)

Literal Expressions in Entscheidungstabellen verwenden

In unserem Beispiel ermitteln wir - wie bereits erwähnt - einen Rabatt auf Basis der Gesamtsumme einer Liste von gekauften Objekten.

Hierfür erstellen wir zuerst den Data Input gekaufte Waren. Der Data Input ist eine Liste von Zahlwerten mit der Einheit Währung:

Erstellen Sie ein Data Input-Element und konfigurieren Sie es dem Screenshot entsprechend.

Erstellen Sie ein Data Input-Element und konfigurieren Sie es dem Screenshot entsprechend.

Erstellen Sie nun ein Entscheidungselement, verbinden Sie es mit dem Data Input und nennen Sie es ‘Rabatt ermitteln’. Klicken Sie auf das Tabellen-Symbol in der oberen linken Ecke um den Entscheidungstabelleneditor zu öffnen:

Erstellen Sie ein Entscheidungselement, verknüpfen Sie es mit dem Data Input und öffnen Sie den Entscheidungstabelleneditor.

Erstellen Sie ein Entscheidungselement, verknüpfen Sie es mit dem Data Input und öffnen Sie den Entscheidungstabelleneditor.

Um die Eingabe von Literal Expressions zu aktivieren, klicken Sie auf die Kopfzeile des Data Inputs und löschen Sie die Data Input-Referenz:

Löschen Sie die Data Input-Referenz, um die Literal Expression einfügen zu können.

Löschen Sie die Data Input-Referenz, um die Literal Expression einfügen zu können.

Geben Sie = in die Kopfzeile ein. Ihnen wird nun eine Übersicht über verfügbare Variablen und Funktionen angezeigt:

Nachdem Sie ein '='-Zeichen eingegeben haben, werden Ihnen verfügbare Variablen und Funktionen angezeigt.

Nachdem Sie ein ‘=’-Zeichen eingegeben haben, werden Ihnen verfügbare Variablen und Funktionen angezeigt.

Während Sie tippen, werden Ihnen automatisch passende Vorschläge angezeigt. Geben Sie Sum ein und wählen Sie die Sum-Funktion aus. Fügen Sie anschließend die Variable GekaufteWaren als Parameter von Sum ein:

Geben Sie die Literal Expression 'Sum(GekaufteWaren)' ein.

Geben Sie die Literal Expression ‘Sum(GekaufteWaren)’ ein.

Die Input Data der Entscheidungstabellen ist nun die Summe der Werte der gekauften Waren. Sie können nun die Entscheidungslogik wie gewohnt definieren (siehe: DMN-Diagramme erstellen und bearbeiten).

Beachten Sie, dass im Beispiel eine First Hit Policiy konfiguriert ist:

Entscheidungslogik zur Bestimmung eines Discounts auf Basis des gesamten Einkaufwerts

Entscheidungslogik zur Bestimmung eines Discounts auf Basis des gesamten Einkaufwerts

Literal Expressions anstelle von Entscheidungstabellen verwenden

Es ist zudem möglich Literal Expressions anstelle von Entscheidungstabellen zu verwenden.

Zum Beispiel können wir eine Entscheidung in zwei Entscheidungselemente aufteilen, von denen das eine ein Entscheidungstabelle und das andere eine Literal Expression enthält.

'Gesammtsumme bestimmen' und 'Rabatt ermitteln' als zwei separate Entscheidungselemente.

‘Gesammtsumme bestimmen’ und ‘Rabatt ermitteln’ als zwei separate Entscheidungselemente.

  • Die erste Entscheidung berechnet den Gesamtwert des Einkaufs auf Basis der gekauften Waren.
  • Die zweite Entscheidung bestimmt den Rabatt auf Basis des Gesamtwerts.

Um die erste Entscheidung abzubilden benötigen wir keine Entscheidungstabelle.

Öffnen Sie den Entscheidungstabelleneditor und wechseln Sie zum Literal Expressions-Tab. Hier können Sie den Ausdruck hinterlegen, der den Gesamtwert der gekauften Waren berechnet:

Öffnen Sie das 'Literal Expression-Tab' und geben Sie den gewünschten Ausdruck ein.

Öffnen Sie das ‘Literal Expression-Tab’ und geben Sie den gewünschten Ausdruck ein.

Das Entscheidungselement gibt nun die Wertsumme der gekauften Waren zurück und kann vom referenzierenden Entscheidungselement konsumiert werden.

Wenn wir komplexe Literal Expressions erstellen, können wir zudem Variablen - sogenannte Boxed Context - definieren. Diese Variablen können wir anschließend in unserer Entscheidungsfunktion referenzieren:

*Manage complex expressions with boxed contexts.*

Verbessern Sie die Lesbarkeit komplexer Ausdrücke mit Boxed Contexts.

Wichtig

Wenn Sie eine Literal Expression hinterlegen, überschreibt diese die Logik in der Entscheidungstabelle.

Dokumentation aller Literal Expressions

In diesem Abschnitt sind alle Literal Expressions dokumentiert.

Arithmetische Operatoren

Abs

Abs(number):NUMERIC

Gibt den absoluten Wert einer Zahl zurück.

Beispiel: Abs(-5) gibt 5 zurück.

Count

Count([num1 ,num2, num3]):NUMERIC

Gibt die Anzahl der Elemente einer Liste zurück.

Beispiel: Count(["item1", "item2", "item3"]) gibt 3 zurück.

Round

Round(number,digits):NUMERIC

Gibt die Nummer um die angegebenen Stellen gerundet zurück.

Beispiel: Round(3.44,1) gibt 3.4 zurück.

Ceiling

Ceiling(number):NUMERIC

Gibt die Nummer auf die nächste ganze Zahl aufgerundet zurück.

Beispiel: Ceiling(1.3) gibt 2 zurück.

Floor

Floor(number):NUMERIC

Gibt die Nummer auf die nächste ganze Zahl abgerundet zurück.

Beispiel: Floor(1.6) gibt 1 zurück.

Integer

Integer(number): NUMERIC

Gibt den ganzzahligen Teil einer Zahl zurück.

Beispiel: Integer(1.34) gibt 1 zurück.

Modulo

Modulo(divident, divisor):NUMERIC

Gibt den Rest des Quotienten divident / divisor zurück.

Beispiel: Modulo(4, 3) gibt 1 zurück.

Percent

Percent(number):NUMERIC

Gibt die Zahl geteilt durch 100 zurück.

Beispiel: Percent(10) gibt 0.1 zurück.

Power

Power(base, exponent):NUMERIC

Gibt base zum Exponenten exponent zurück.

Beispiel: Power(2, 3) gibt 8 zurück.

Product

Product([factor1, factor2, factor3]):NUMERIC

Gibt das Produkt einer Liste von Faktoren zurück.

Beispiel: Product([2, 3, 4]) gibt 24 zurück.

RoundDown

RoundDown(number, digits):NUMERIC

Gibt die Zahl auf die entsprechende Anzahl von Stellen abgerundet zurück.

Beispiel: RoundDown(1.3674, 2) gibt 1.36 zurück.

RoundUp

RoundUp(number, digits):NUMERIC

Gibt die Zahl auf die entsprechende Anzahl von Stellen aufgerundet zurück.

Beispiel: Abs(1.344, 2) gibt 1.35 zurück.

Sum

Sum([number1, number2, number3]):NUMERIC

Gibt die Summe einer Liste von Werten zurück.

Beispiel: Sum([1, 2, 3, 4, 5]) gibt 15 zurück.

Datum- & Zeit-Operatoren

Day

Day(datetime):NUMERIC

Gibt den Tag-Teil eines Datums zurück.

Beispiel: Day(2015-12-24T12:15:00.000+01:00) gibt 24 zurück.

DayAdd

DayAdd(datetime, days to add):DATE

Gibt das Datum plus die entsprechende Anzahl an Tagen zurück.

Beispiel: DayAdd(2015-12-24T12:15:00.000+01:00, 1) gibt 2015-12-25T12:15:00.000+01:00 zurück.

DayDiff

DayDiff(datetime1, datetime2):NUMERIC

Gibt die Anzahl ganzer Tage zwischen zwei Daten zurück. Nicht-ganze Tage werden nicht berücksichtigt.

Beispiel: DayDiff(2015-12-24T12:15:00.000+01:00, 2015-12-25T12:15:00.000+01:00) gibt 1 zurück.

Date

Date(year, month, day):DATE

Gibt ein Datum auf Basis der Parameter Jahr, Monat und Tag zurück.

Beispiel: Date(2015, 12, 25) gibt 2015-12-25 zurück.

DateTime

DateTime(day, month, year, hour, minute, second, hourOffsett):DATE

Gibt ein Datum mit Zeitangabe auf Basis der Parameter Tag, Monat, Jahr, Stunde, Minute und Sekunde zurück.

Beispiel: DateTime(25, 12, 2015, 12, 15, 0, 1) gibt 2015-12-24T12:15:00.000+01:00 zurück.

Hour

Hour(datetime):NUMERIC

Gibt den ‘Stunden’-Teil eines Datums mit Zeitangabe zurück.

Beispiel: Hour(2015-12-24T12:15:00.000+01:00) gibt 12 zurück.

HourDiff

Hour(time):NUMERIC

Gibt die Anzahl ganzer Stunden zwischen zwei Daten zurück. Nicht-ganze Stunden werden nicht berücksichtigt.

Beispiel: HourDiff(2015-12-24T12:15:00.000+01:00, 2015-12-24T14:15:00.000+01:00) gibt 2 zurück.

Minute

Minute(time):NUMERIC

Gibt den ‘Minuten’-Teil eines Datums mit Zeitangabe zurück.

Beispiel: Minute(2015-12-24T12:15:00.000+01:00) gibt 15 zurück.

MinutesDiff

MinutesDiff(datetimes1, date2times):NUMERIC

Gibt die Anzahl ganzer Minuten zwischen zwei Daten zurück. Nicht-ganze Minuten werden nicht berücksichtigt.

Beispiel: MinutesDiff(2015-12-24T12:15:00.000+01:00, 2015-12-24T13:15:00.000+01:00) gibt 60 zurück.

Month

Month(datetime):NUMERIC

Gibt den ‘Monat’-Teil eines Datums zurück.

Beispiel: Month(2015-12-24T12:15:00.000+01:00) gibt 12 zurück.

MonthAdd

MonthAdd(datetime, months_to_add):DATE

Gibt das Datum plus die entsprechende Anzahl an Monaten zurück.

Beispiel: MonthAdd(2015-10-10T12:15:00.000+01:00, 1) gibt 2015-11-10T12:15:00.000+01:00 zurück.

MonthDiff

MonthDiff(datetime1, datetime2):NUMERIC

Gibt die Anzahl ganzer Monate zwischen zwei Daten zurück. Nicht-ganze Monate werden nicht berücksichtigt.

Beispiel: MonthDiff(2015-10-10T12:15:00.000+01:00, 2015-11-10T12:15:00.000+01:00) gibt 1 zurück.

Now

Now():DATE

Gibt das aktuelle Datum mit Zeitangabe zurück.

Beispiel: Now() könnte 2015-11-10T12:15:00.000+01:00 zurückgegeben haben.

Today

Today():DATE

Gibt das aktuelle Datum zurück.

Beispiel: Today() könnte 2015-11-10 zurückgegeben haben.

Weekday

Weekday(datetime):NUMERIC

Gibt eine Nummer (1 bis 7) zurück, die dem Wochentag des Datums entspricht.

Beispiel: weekday(2016-02-09T12:15:00.000+01:00) gibt 3 zurück.

Year

Year(datetime):NUMERIC

Gibt den ‘Jahr’-Teil eines Datums zurück.

Beispiel: Year(2016-02-09T12:15:00.000+01:00) gibt 2016 zurück.

YearAdd

YearAdd(datetime, years_to_add):DATE

Gibt das Datum plus die entsprechende Jahren an Monaten zurück.

Beispiel: YearAdd(2016-02-09T12:15:00.000+01:00, 1) gibt 2017-02-09T12:15:00.000+01:00 zurück.

YearDiff

YearDiff(datetime1, datetime2):NUMERIC

Gibt die Anzahl ganzer Jahre zwischen zwei Daten zurück. Nicht-ganze Jahre werden nicht berücksichtigt.

Beispiel: YearDiff(2016-02-09T12:15:00.000+01:00, 2017-02-09T12:15:00.000+01:00) gibt 1 zurück.

Listenoperatoren

Append

Append(list, element): LIST

Fügt das Element zu einer Kopie der Liste hinzu und gibt die Kopie zurück.

Beispiel: Append([2.5, 5.8, 4.3], 6.7) gibt [2.5, 5.8, 4.3, 6.7] zurück.

AppendAll

AppendAll(list1, list2): LIST

Fügt alle Elemente der zweiten Liste zu einer Kopie der ersten Liste hinzu und gibt die Kopie zurück.

Beispiel: AppendAll([2.5, 5.8, 4.3], [2.1, 3.5, 7.4]) gibt [2.5, 5.8, 4.3, 2.1, 3.5, 7.4] zurück.

Zip

Zip(attributes, values1, ..., valuesN): LIST

Erstellt eine Liste von Objekten aus einer Liste aus Attributen und mehreren Listen von Werten.

Beispiel: Zip(["id", "value"], [23a3e98, c45da1b], [40, 120]) gibt [{id: 23a3e98, value: 40},{ id: c45da1b, value: 120}] zurück.

Wichtig

Vor Version 10.11.0 des Decision Managers wurden die Werte als eine Liste von Listen an die Funktion übergeben:

Zip(["id", "value"], [[23a3e98, c45da1b], [40, 120]])

Literal Expressions, die die alte Zip Funktion verwendet haben, wurden automatisch in die neue Syntax konvertiert.

NotContainsAny

NotContainsAny(list1, list2): BOOLEAN

Bestimmt ob list1 Elemente von list2 enthält.

Beispiel: NotContainsAny(["item1", "item2"], ["item2, item3"]) gibt false zurück.

ContainsOnly

ContainsOnly(list1, list2): BOOLEAN

Bestimmt ob list1 ausschließlich Elemente von list2 enthält.

Beispiel: ContainsOnly(["item1", "item2"], ["item2, item3"]) gibt false zurück.

AreElementsOf

AreElementsOf(list1, list2): BOOLEAN

Bestimmt, ob list2 alle Elemente von list1 enthält.

Beispiel: AreElementsOf(["item2, item3"], ["item1", "item2" "item3"]) gibt true zurück.

Remove

Diese Funktion ist ausschließlich im Literal Expressions Editor (und nicht im Decision Table Editor) verfügbar.

Remove(list, element): LIST

Entfernt ein Element (element) aus einer Liste (list).

Beispiel: Remove(["item1", "item2"], "item1") gibt ["item2"] zurück.

RemoveAll

Diese Funktion ist ausschließlich im Literal Expressions Editor (und nicht im Decision Table Editor) verfügbar.

RemoveAll(list1, list2) : LIST

Entfernt alle Elemente einer Liste (list2) aus einer anderen Liste (list1).

Beispiel: Remove(["item1", "item2", "item3"], ["item1", "item2"]) gibt ["item3"] zurück.

Statistische Operatoren

Avg

Avg([number1, number2, number3]):NUMERIC

Gibt den Durchschnittswert einer Liste von Werten zurück.

Beispiel: Avg([3,5]) gibt 4 zurück.

Max

Max([number1, number2, number3]):NUMERIC

Gibt das Maximum einer Liste von Werten zurück.

Beispiel: Max([5, 4, 10]) gibt 10 zurück.

Median

Median([number1, number2, number3]):NUMERIC

Gibt den Median einer Liste von Werten zurück.

Beispiel: Median([2, 5, 10, 12, 34, 35]) gibt 11 zurück.

Min

Min([number1, number2, number3]):NUMERIC

Gibt das Minimum einer Liste von Werten zurück.

Beispiel: Min([5, 4, 10]) gibt 2 zurück.

Mode

Mode([number1, number2, number3]):NUMERIC

Gibt den am Häufigsten auftretenden Wert einer Liste zurück. Falls mehrere Werte gleich oft und am Häufigsten auftreten, wird der Wert zurückgegeben, der am ersten (weiter links) in der Liste steht.

Beispiel: Mode([1, 2, 4, 4, 5, 6]) gibt 4 zurück.

Texthandling

Concat

Concat([text1, text2, text3]):TEXT

Gibt die Verkettung der Texte zurück.

Beispiel: Concat(["Hello ", "World", "!"]) gibt "Hello World!" zurück.

IsAlpha

IsAlpha(text):BOOLEAN

Bestimmt ob der Text ausschließlich alphabetische Zeichen (A-Z, a-z) enthält. Umlaute und ähnliche Buchstaben (z.B. Ä, Å ß) gelten nicht als alphabetisch.

Beispiel: IsAlpha("abcdefg5") gibt false zurück.

IsAlphanumeric

IsAlphanumeric(text):BOOLEAN

Bestimmt ob der Text ausschließlich alphanumerische Zeichen (A-Z, a-z, 0-9) enthält. Umlaute und ähnliche Buchstaben (z.B. Ä, Å ß) gelten nicht als alphanumerisch.

Beispiel: isAlphanumeric("abcdefg5") gibt true zurück.

IsNumeric

IsNumeric(text):BOOLEAN

Bestimmt, ob der Text eine valide Zahl ist, die nur Plus- oder Minus-Präfix, numerische Zeichen und ein Trennungskomma/einen Trennungspunkt enthalten darf.

Beispiel: IsNumeric(2.3.5) gibt false zurück.

IsSpaces

IsSpaces(text):BOOLEAN

Bestimmt, ob der Text ausschließlich Leerzeichen enthält.

Beispiel: IsSpaces("     ") gibt true zurück.

Len

Len(text):NUMERIC

Gibt die Anzahl von Zeichen im Text zurück.

Beispiel: Len("five") gibt 4 zurück.

Lower

Lower(text):TEXT

Gibt den Text mit allen Zeichen als Kleinbuchstaben zurück.

Beispiel: Lower("UPPER") gibt upper zurück.

Trim

Trim(text):TEXT

Gibt den Text mit allen Leerzeichen außer einzelnen Leerzeichen zwischen Worten zurück.

Beispiel: Trim("Hello         World! ") gibt "Hello World!" zurück.

Upper

Upper(text):TEXT

Gibt den Text mit allen Zeichen als Großbuchstaben zurück.

Beispiel: Upper("lower") gibt "LOWER" zurück.

Number

Number(text):NUMERIC

Gibt den Zahlenwert, den der Text abbildet, als Zahl zurück. Als Trennzeichen ist ausschließlich ein Punkt (.) erlaubt.

Beispiel: Number("5") gibt 5 zurück.

Number

Number(text, default_value):NUMERIC

Gibt den Zahlenwert, den der Text abbildet, als Zahl zurück. Als Trennzeichen ist ausschließlich ein Punkt (.) erlaubt. Gibt default_value zurück, falls der Text nicht in eine Zahl umgewandelt werden kann.

Beispiel: Number("5,5", 10) gibt 10 zurück (Number("5.5", 10) gibt 5.5 zurück).

Mid

Mid(text, start, num_chars):TEXT

Gibt die Zeichenkette num_chars von der Startposition start des text Strings zurück.

Beispiel: Mid("Hello World!", 6, 5) gibt "World" zurück.

Left

Left(text, num_chars):TEXT

Gibt die Zeichenkette num_chars vom Beginn des text Strings zurück.

Beispiel: Left("Hello World!", 5) gibt "Hello" zurück.

Text

Text(num, format_text):TEXT

Gibt den Zahlenwert eines Strings in dem Format format_text zurück. Das Format wird über die Platzhalter # und 0, sowie über den Dezimalpunkt . spezifiziert.

Beispiel: Text(1, "#.000") gibt "1.000" zurück.

TextOccurrences

TextOccurrences(find_text, within_text):NUMERIC

Gibt zurück wie häufig find_text in within_text vorkommt.

Beispiel: TextOccurrences("can", "Can you can a can as a canner can can a can?") gibt 6 zurück.

Contains

Contains(text, substring): BOOLEAN

Bestimmt, ob text den substring enthält.

Beispiel: Contains("Hello World!", "o World") gibt true zurück.

StartsWith

StartsWith(text, prefix): BOOLEAN

Bestimmt, ob text``mit ``prefix beginnt.

Beispiel: StartsWith("Hello World!", "Hello") gibt true zurück.

EndsWith

EndsWith(text, suffix): BOOLEAN

Bestimmt, ob text``mit ``suffix endet.

Beispiel: endsWith("Hello World!", "!") gibt true zurück.

Logische Operatoren

Not

Not(boolean): BOOLEAN

Gibt die Negierung des Wahrheitswerts zurück.

Beispiel: Not(true) gibt false zurück.