Einfache Berechnung (+,-,*,/,%)
Wertauflöser - Kurzfassung
Zweck: Verknüpft mehrere skalare numerische Werte mit einer der vier Grundrechenarten (+,-,*,/ und % für Modulo), um ein skalares Ergebnis mit dem ausgewählten numerischen Datentyp zurückzugeben.
Siehe auch: Berechne Wert, Berechnungsausdruck
Der Einfache Berechnung (+,-,*,/,%)-Wertauflöser verknüpft mehrere numerische Werte mit einer der folgenden Rechenarten, um ein skalares Ergebnis - also eine "Zahl ohne Einheit" - zurückzugeben:
Rechenart |
Berechnungsschema |
Ähnliche Funktion |
|
+ |
Addition mit mehreren Summanden |
A + B [+ C [+ ...]] |
|
- |
Subtraktion mit einem Minuenden (erster Wert) und einem oder mehreren Subtrahenden |
A - B [- C [- ...]] |
|
* |
Multiplikation mit mehreren Faktoren |
A x B [x C [x ...]] |
|
/ |
Division mit einem Dividenden (erster Wert) und einem oder mehreren Divisoren |
A ÷ B [÷ C [÷ ...]] |
|
% |
Modulo-Rechnung (ermittelt den "Rest" einer ein- oder mehrstufigen Ganzzahldivision) |
A % B [% C [% ...]] |
calc (Funktionsausdruck berechnen) mit einem Ausdruck wie a % b |
Listenwerte als Eingangsdaten
Analog zu den Funktionen für Grundrechenarten in Berechnungsausdrücken (sum(), dif(), product(), quotient()) akzeptiert der Einfache Berechnung (+,-,*,/,%)-Wertauflöser auch Listen anstelle von oder in Kombination mit Einzelwerten als "Eingangsdaten". Darüber hinaus können Liste sogar in einer Modulo-Rechnung (%) verwendet werden.
Sofern Wert-Konfigurationen für Eingangsdaten eine Liste von Werten zurückgibt, werden diese in Einzelwerte "aufgelöst" und in die Liste aller Eingangsdaten eingereiht:
►WICHTIG◄ Das Auflösen von Listen betrifft genau eine Ebene. Aus verschachtelten Listen werden nicht rekursiv Einzelwerte aufgelöst.
Beispiele:
Eine Mischung von Einzelwerten und Listen (in JSON beschrieben als: [1,2],[3,4],5,6) wird per Rechenart Subtraktion so verarbeitet wie dif(1,2,3,4,5,6) und liefert den Wert -19 (=1-2-3-4-5-6).
Versucht man die beiden Listenwerte zu einer Liste von Listen bereitzustellen (Beispiel in JSON: [[1,2],[3,4]],5,6) wird eine Subtraktion wie dif(5,6) ausgeführt und das Ergebnis lautet -1 (=5-6).
Die eingeschachtelten Listen werden zwar aufgelöst, ergeben aber keinen numerischen Einzelwert sondern $null. Sie werden deshalb übersprungen.
Enthält die verschachtelte Liste auch Einzelwerte (Beispiel in JSON: [0,[1,2],[3,4]],5,6) werden diese berücksichtigt. Eine Subtraktion der Beispieldaten berechnet dif(0,5,6) und ergibt -11 (=0-5-6).
►HINWEIS◄ Für komplexere Rechenoperationen steht der Berechne Wert-Wertauflöser zur Verfügung, der allerdings grundsätzlich den Datentyp "Zahl mit Einheit" (s. a. Zahlenangabe mit Einheit, Einheitenumrechnung) für das Ergebnis verwendet. Geht aus der Berechnung keine Einheit hervor, wird eine "Zahl mit Einheit" ohne Einheit zurückgegeben. Das ist eigentlich kein Problem, kann aber umständlich oder verwirrend erscheinen. Der Einfache Berechnung (+,-,*,/,%)-Wertauflöser liefert dagegen direkt ein rein numerisches Ergebnis und ergibt für einzelne Rechenschritte mit Grundrechenoperationen eine übersichtlichere Konfiguration. Er kann auch verwendet werden, um "Aggregate" mit mehreren Rechenschritten auf der Basis von Grundrechenoperationen zu konstruieren (s. Beispiele), allerdings ergibt bei höherer Komplexität des Rechengangs der Berechne Wert-Wertauflöser eine schlankere und transparente Konfiguration.
Beispiele
Einfacher Anwendungsfall (Addition): Offset für Schleifenindex
Im Kontext einer Für jeden Eintrag wiederholen (Schleife) soll bei jedem Schleifendurchlauf eine Hinweis anzeigen-Ereignisaktion ausgeführt werden, die per "Meldung" über den gerade verarbeiteten Listenwert informiert und im "Titel" den Iterationsindex beginnend bei 1 benennt. Über letzteren gibt während der Iteration die Variable $index Auskunft, die allerdings mit einem Startwert von 0 arbeitet. Maschinen mögen das. Menschen eher nicht. Für das gewünschte Ergebnis muss demnach "umgerechnet" werden. Die sehr einfache Formel hierfür lautet sinngemäß: $input + 1. Diese Aufgabe ist ein klarer Fall für den Einfache Berechnung (+,-,*,/,%)-Wertauflöser.
Konfiguration:
Der Screenshot rechts zeigt die Konfiguration für eine Für jeden Eintrag wiederholen (Schleife)-Ereignisaktion:
|
|
Einfacher Anwendungsfall (Subtraktion): "Countdown" - Iterationsindex im Rückwärtsgang
Wie im vorherigen Beispiel soll eine per Variable listOfEntities bereitgestellte Liste von Entitäten in einer Schleife verarbeitet werden.
Im Unterschied zum vorherigen Fall soll im Titel der je Iterationsschritt ausgegebenen Benachrichtigung nicht mehr die Rangnummer des Iterationsschritts (aufsteigend vom Wert 1) angezeigt werden, sondern ein "Countdown", also eine Angabe zur Anzahl der verbleibenden Iterationen, die im letzten Schritt den Wert 0 angibt.
Konfiguration:
Der "Countdown" kann innerhalb der Für jeden Eintrag wiederholen (Schleife) erreicht werden, indem je Iterationsschritt die Differenz aus zwei automatisch bereitgestellten "Schleifenvariablen" gebildet wird:
$length → Integer-Wert für die Gesamtzahl der Iterationsschritte
$index → Integer-Wert für den aktuellen Iterationsindex (aufsteigend vom Wert 0)
Damit der Countdown in der letzten Iteration den Wert 0 anzeigt, muss vom $length-Wert neben dem $index auch noch der Festwert 1 abgezogen werden.
Die je Iterationsschritt auszuführende Berechnung lautet also insgesamt: $length - $index - 1
Der Screenshot rechts zeigt hier nur die Wert-Konfiguration für den Parameter Titel in der Hinweis anzeigen-Ereignisaktion. Die umgebende Konfiguration kann aus dem vorherigen Beispiel unverändert übernommen werden.
|
|
►ANMERKUNG◄ Obwohl die "Countdown"-Zählung im Titel durch die Umrechnung rückwärts läuft, werden die Einträge der listOfEntities unverändert vorwärts abgearbeitet. Eine Richtungsumkehr für die Iteration würde etwas mehr Aufwand erfordern, da die Für jeden Eintrag wiederholen (Schleife)-Ereignisaktion ausschließlich vorwärts iteriert. Wenn man den Countdown-Index über den Einfache Berechnung (+,-,*,/,%)-Wertauflöser berechnet und in einer Variable speichert, kann man den Namen dieser Variable im "Offset"-Parameter eines Listenwert-Wertauflösers adressieren, um den zum angezeigten Index passenden Listeneintrag abzurufen.
Komplexerer Anwendungsfall (Subtraktion und Division): "Alter" eines Firmenkontos berechnen
Als Beispiel für die Möglichkeit aus mehreren Instanzen des Einfache Berechnung (+,-,*,/,%)-Wertauflösers ein Aggregat mit unterschiedlichen Rechenoperationen aufzubauen, soll hier das "Alter" eines konkreten Firmenkontos in Jahren ermittelt werden.
Als "Alter" einer Entität soll dabei die Zeitspanne zwischen dem Erstelldatum (Feld created) und der aktuellen Systemzeit (Relatives Datum mit Zeit mit dem Typ "Jetzt") betrachtet werden.
Da Zeitspannen primär immer als Millisekunden-Differenz ermittelt werden, ist anschließend eine Umrechnung in die Zieleinheit (hier: Jahre) per Division (durch "Millisekunden pro Jahr") nötig.
Die Dauer eines Jahres in Millisekunden veranschlagen wir hier als 1000 ms/s x 3600 s/h x 24 h/d x 365,25 d/y = 31557600000 ms. Schalttage werden also mit 0,25 Tagen pro Jahr pauschal "umgelegt".
Konfiguration:
Der Screenshot rechts zeigt eine Wertauflöserkette, die das "Alter" der Firma der Session in Jahren als Double-Dezimalzahl zurückgibt:
|
|
►ANMERKUNG◄ Nachfolgend zum Vergleich eine inhaltlich entsprechende Konfiguration mit dem Berechne Wert-Wertauflöser:
Im Unterschied zum Einfache Berechnung (+,-,*,/,%)-Wertauflöser müssen die Wert-Konfigurationen für Eingangswerte auf dem Umweg über willkürlich benannte Variablen (now, created) in die Berechnung eingebunden werden. Die Variablen können dann zusammen mit statischen Werten direkt verwendet werden, um die Berechnung zu formulieren (ganz oben im Bild rechts). Um am Ende den reinen Zahlenwert aus dem Berechnungsergebnis zu erhalten, dass formal als "Zahl mit Einheit" erzeugt wird, muss explizit auf das Objekt-Feld "Wert" (value) zugegriffen werden. Der direkte Vergleich zeigt, dass der Berechne Wert-Wertauflöser bereits in diesem noch nicht zu komplexen Anwendungsfall das benötigte "Aggregat" kompakter und übersichtlicher abbilden kann als die vergleichbare Konfiguration mit zwei verschachtelten Einfache Berechnung (+,-,*,/,%)-Instanzen im Beispiel oben. Mit der Anzahl der zu aggregierenden Rechenschritte wächst eine Konfiguration, die Einfache Berechnung (+,-,*,/,%)-Instanzen verschachtelt, überproportional stark an, sodass der Vorteil eines "Berechnungsausdrucks", der Eingangsdaten als Variablen benennt und diese in eine als "Gesamtansatz" definierte Beziehung setzt, immer deutlicher wird. Analog wäre für einen Berechnungsausdruck abzuwägen, ob man für Aggregate auf Basis der Grundrechenarten die Funktionen sum (Addition), dif (Differenz), product (Multiplikation) und quotient (Division) anstelle calc (Funktionsausdruck berechnen) mit einem Gesamtansatz einzusetzen. |
|
Komplexerer Anwendungsfall (Multiplikation): Produkt von Wirkungsgraden berechnen
In einer Variable efficiencyFactors wird eine Liste mit einer endlichen Anzahl von Double-Werten aus dem Wertebereich [0,1] bereitgestellt, die als Wirkungsgrade multiplikativ verkettet werden sollen, um einen Gesamtwirkungsgrad zu ermitteln.
Konkretes Zahlenbeispiel:
Konkret könnte der Wert der efficiencyFactors-Variable im JSON-Format so aussehen: [0.9, 0.95, 0.75]
Als Gesamtwirkungsgrad ergibt sich daraus 64,125% (0.9 x 0.95 x 0.75 = 0.64125).
Konfiguration:
In einem Berechnungsausdruck könnte man den Listenwert aus der Variablen direkt in der product (Multiplikation)-Funktion verarbeiten. Sinngemäß wäre $product($var(efficiencyFactors)) ein zielführender Berechnungsausdruck.
Da der Einfache Berechnung (+,-,*,/,%)-Wertauflöser - wie oben per Fußnote bereits kurz angemerkt - Listenwerte nicht direkt verarbeiten kann, scheitert die direkte Übersetzung des Berechnungsdrucks in eine entsprechende Wert-Konfiguration.
Der folgende Ansatz demonstriert, wie eine "multiplikative Verkettung" für bis zu fünf Faktoren aussehen könnte:
Der Screenshot rechts zeigt eine Wertauflöserkette, an deren Anfang die Liste der einzelnen Wirkungsgrade aus der Variable efficiencyFactors steht.
Enthält die Liste im Eingabewert weniger als fünf Werte liefern einige der Listenwert-Wertauflöser "Kein Wert" ($null). Leere Werte werden in der Berechnung einfach übersprungen, sodass alle nicht-leeren Werte wie gewünscht verkettet werden. |
|
►ANMERKUNG◄ Der aufgezeigte Ansatz erfüllt die Aufgabe nur, wenn die maximale Anzahl an Faktoren vorab hinreichend nach oben abgegrenzt werden kann. Ein vorab unbestimmte Anzahl von Faktoren kann dagegen nicht verarbeitet werden. Es macht sicher auch wenig Sinn, eine größere Anzahlen von Listenwerten auf diese Weise abzudecken, wenn sie nur selten benötigt werden. Die folgende Alternative umgeht diese Restriktion.
Alternative Konfiguration:
Der Screenshot rechts zeit eine Wertauflöserkette, an deren Anfang wieder die Liste der einzelnen Wirkungsgrade aus der Variable efficiencyFactors steht. Die Liste wird bei diesem Ansatz als Eingabewert an den verketteten Einfache Berechnung (+,-,*,/,%)-Wertauflöser übergeben:
|
|
►ANMERKUNG◄ Der Zugriff auf die Variable efficiencyFactors könnte hier auch direkt anstelle des Objekt-Feld-Wertauflösers innerhalb der Berechnung erfolgen. Die Variante im Screenshot soll aber verdeutlichen, dass eine Liste von Eingangsdaten für die Berechnung als Eingabewert per Verkettung bereitgestellt werden kann. Bei Bedarf kann dann innerhalb der Berechnung auch ein Sammle Werte-Wertauflöser verwendet werden, z. B. um Eingangsdaten aus einer Liste von komplexen Objekten zu extrahieren.
Komplexerer Anwendungsfall (Addition & Modulo): Container-Beladung
Eine Variable shipments stellt eine Liste mit Daten zu Sendungen bereit, die unter anderem das Gewicht jeder Sendung im Feld item_kgs angibt.
Deise Sendungen sollen für einen gemeinsamen Transport auf typgleiche Container verladen werden, deren maximale Zuladung eine weitere Variable kgs_per_container spezifiziert.
Unter der Annahme, dass die Stückelung der Sendungen eine Vollauslastung aller verwendeten Container bis auf einen zulässt, soll das Gewicht für die Teilladung berechnet werden, die diesem "letzten" Container theoretisch zufällt.
Konfiguration:
Der Screenshot rechts zeigt eine Wertauflöserkette (s. Verketteter Wertauflöser), die ausgehend von der Liste der Sendungsdaten in der Variable shipments die Berechnung der theoretischen "Teilladung" vornimmt:
|
|