Zum Hauptinhalt springen

SmartFormulas

SmartFields liefern dir die Werte in deinem Flow. Eine SmartFormula macht daraus eine berechnete Zahl, die du inline in ein Textfeld einfügst, indem du sie in [[ … ]] einschließt. Die Runtime wertet den Ausdruck aus, formatiert das Ergebnis und ersetzt den gesamten [[ … ]]-Block durch die formatierte Zahl. (Willst du stattdessen eine Ja/Nein-Frage stellen, siehe SmartFilters.)

Die Form ist:

[[Ausdruck]]
[[Ausdruck;Format]]

Die ;Format-Klausel ist optional und wählt einen konkreten Business-Central-Formatstring. Lässt du sie weg (oder schreibst nur ein bares ;), bekommst du die Standardausgabe – AutoFlow nutzt intern <Standard Format,9>, also eine sprachneutrale Darstellung (Dezimalpunkt, keine Tausendertrennzeichen).

Operatoren

OperatorBedeutungBeispiel
+Addition[[2 + 3;]]5
-Subtraktion[[10 - 4;]]6
*Multiplikation[[{{order.total}} * 0.19;]]
/Division[[{{order.total}} / {{order.lines}};]]
%Modulo (Rest)[[7 % 3;]]1
^Potenz[[2 ^ 8;]]256
( )Gruppierung[[(1 + 2) * 3;]]9

Funktionen

FunktionBedeutungBeispiel
max(a, b)größerer der beiden Werte[[max({{order.total}}, 100);]]
min(a, b)kleinerer der beiden Werte[[min({{quote}}, {{cap}});]]
abs(a)Absolutwert[[abs({{difference}});]]
round(Wert, Dezimalstellen)auf N Dezimalstellen runden (kaufmännisch)[[round({{order.total}} * 1.19, 2);]]
floor(Wert, Dezimalstellen)auf N Dezimalstellen abrunden[[floor({{order.total}}, 0);]]
ceil(Wert, Dezimalstellen)auf N Dezimalstellen aufrunden[[ceil({{order.total}}, 0);]]

round, floor und ceil nehmen ein Dezimalstellen-Argument: 2 rundet auf zwei Nachkommastellen (12,34712,35), 0 rundet auf ganze Zahlen, negative Werte runden auf Zehner / Hunderter (-2 → nächster Hunderter).

Eine Liste aggregieren

Wenn ein SmartField eine Liste enthält – die Zeilen eines Belegs, mehrere Datensätze aus einem Find-Schritt – kannst du die ganze Liste mit einer Aggregatfunktion zu einer Zahl zusammenfassen:

FunktionTut
sum(…)Summe der Werte
avg(…)Durchschnitt der Werte
min(…)kleinster Wert
max(…)größter Wert
count(…)Anzahl der Einträge in der Liste

Es gibt zwei Formen, je nachdem, was die Liste enthält:

Eine Liste von Werten. Ist das SmartField bereits eine Liste von Zahlen, übergibst du sie allein:

[[sum({{invoice.lineAmounts}});]]

Eine Liste von Datensätzen. Ist das SmartField eine Liste von Datensätzen (eine Referenz), gib zuerst die Liste an und dann den je Zeile zu summierenden Wert:

[[sum({{invoice.lines}}, {{invoice.lines.amount}});]]

Hier ist {{invoice.lines}} die zu durchlaufende Liste und {{invoice.lines.amount}} der Betrag jeder Zeile. count braucht nur die Liste selbst – [[count({{invoice.lines}});]].

Der Editor führt dich durch beide Fälle: Wählst du eine Liste, und ist es eine Datensatzliste, öffnet er einen zweiten Auswahldialog, der auf diese Liste beschränkt ist – so kannst du nur einen Wert wählen, der auf ihren Zeilen liegt.

min und max haben eine Doppelrolle – mit einem einzelnen Listen-Argument aggregieren sie die Liste, mit zwei einfachen Zahlen (min(2, 3)) bleiben sie die Kleinster/Größter-von-zwei-Funktionen aus der Tabelle oben. AutoFlow entscheidet danach, ob das erste Argument eine Liste ist.

Der Formatstring

Der Teil hinter dem ; ist ein Standard-BC-Formatstring – derselbe, den du in AL an Format(Wert, 0, '<Format>') übergeben würdest. Ein paar nützliche Formen:

FormatErgebnis für 1234.5
(weggelassen oder leer)1234.5
<Precision,2:2>1234.50
<Standard Format,0>1,234.5 (Englisch) / 1.234,5 (Deutsch)
<Precision,2:2><Standard Format,0>1,234.50 (Englisch) / 1.234,50 (Deutsch)

In den meisten Fällen reicht es, das Format komplett wegzulassen ([[…]]) – du bekommst eine sprachneutrale Dezimaldarstellung (Dezimalpunkt, keine Tausendertrennzeichen). Greife nur dann zu einem Formatstring, wenn du gezielt Präzision oder dein lokales Zahlenformat brauchst.

Darstellung im lokalen (regionalen) Format

Damit eine Zahl so erscheint, wie deine BC-Sitzung Beträge anzeigt – mit den Tausender- und Dezimaltrennzeichen deiner Region – ergänze <Standard Format,0>. Beispiel in einer deutschen Sitzung:

Betrag: [[{{order.total}};<Precision,2:2><Standard Format,0>]] EUR

Aus dem Wert 38401.05 wird so 38.401,05. Der Teil <Standard Format,0> schaltet auf deine lokalen Trennzeichen und die Tausendergruppierung um; stelle <Precision,2:2> davor, um die Anzahl der Dezimalstellen festzulegen. Ein Präzisions-Token allein (<Precision,2:2>) bleibt sprachneutral.

Beispiele

Bruttobetrag: [[{{order.total}} * 1.19;]] EUR.

Inline-Berechnung.

Netto: [[{{order.total}};<Precision,2:2>]] EUR
Steuer: [[round({{order.total}} * 0.19, 2);<Precision,2:2>]] EUR

Zwei Formeln in einem Textblock, beide auf zwei Dezimalstellen formatiert.

Pufferzeit (Tage): [[max({{daysLeft}} - 2, 0);]]

Nie unter null.

Tipps

  • Zahlen nicht in Anführungszeichen. Formeln sehen nur Zahlen – {{order.total}} löst zur Zahl auf, nicht zu Text. Liefert ein SmartField Text, der wie eine Zahl aussieht, klappt es; liefert es nicht-numerischen Text, bricht die Formel.
  • Eine Formel = eine Zahl. Hängt eine Berechnung von einer Ja/Nein-Entscheidung ab, wähle den richtigen Wert vorher per Decision- oder Parser-Schritt aus und verwende danach das SmartField in der Formel.
  • Klammern frei verwenden. Multiplikation und Division binden stärker als Addition und Subtraktion, aber Klammern sind die einfache Art, die Absicht klarzustellen.

Wo SmartFormulas vorkommen

SmartFormulas können inline in jedem Textfeld einer Schritt-Konfiguration stehen – Beschreibungen, URLs, Request-Bodies, Parser-Eingaben, Fehlermeldungen und so weiter. Überall, wo ein SmartField-Token ({{ … }}) erlaubt ist, ist auch ein SmartFormula-Block ([[ … ; ]]) erlaubt.