Ausdrucks-Syntax {= ... }
Überblick#
Die {= ... } Syntax ermöglicht es, Berechnungen, logische Ausdrücke, Vergleiche und String-Operationen direkt in Attributwerten zu verwenden ohne dafür eine eigene Aktion ins Skript aufnehmen zu müssen.
Statt:
<CalculateAddition Value1="{@Preis}" Value2="{@Rabatt}" Float="true" Variable="{@Gesamt}" />Per Ausdruck:
<Set Variable="{@Gesamt}" Value="{= {@Preis} + {@Rabatt} }" />
Grundsyntax#
Einfacher Ausdruck#
{= Ausdruck }
<Set Variable="{@Ergebnis}" Value="{= 10 + 5 }" />
<Set Variable="{@Ergebnis}" Value="{= {@A} * {@B} }" />
Gemischter Wert#
Ausdrücke können mit normalem Text und Variablen gemischt werden:
<Set Variable="{@Info}" Value="Gesamt: {= {@Preis} * {@Menge} } EUR" />
<Set Variable="{@Info}" Value="Hallo {@Vorname}, dein Rabatt: {= {@Rabatt} * 100 }%" />
Mehrere Ausdrücke#
<Set Variable="{@Info}" Value="{= {@A} + {@B} } von {= {@C} * 2 }" />
Operatoren#
Arithmetische Operatoren#
| Operator | Beschreibung | Beispiel |
| + | Addition | {= {@A} + {@B} } |
| - | Subtraktion | {= {@Preis} - {@Rabatt} } |
| * | Multiplikation | {= {@Preis} * {@Menge} } |
| / | Division | {= {@Gesamt} / {@Anzahl} } |
| % | Modulo (Rest) | {= {@Wert} % 10 } |
Vergleichsoperatoren#
Vergleiche geben 1 (wahr) oder 0 (falsch) zurück. Kein XML-Escaping notwendig > und < können direkt verwendet werden.
| Operator | Beschreibung | Beispiel |
| = | Gleich | {= {@Status} = 'Aktiv' } |
| <> | Ungleich | {= {@Wert} <> 0 } |
| > | Größer als | {= {@Betrag} > 100 } |
| < | Kleiner als | {= {@Alter} < 18 } |
| >= | Größer oder gleich | {= {@Punkte} >= 50 } |
| <= | Kleiner oder gleich | {= {@Count} <= 10 } |
Logische Operatoren#
| Operator | Beschreibung | Beispiel |
| AND | Logisches Und | {= {@A} > 0 AND {@B} > 0 } |
| OR | Logisches Oder | {= {@X} = 1 OR {@Y} = 1 } |
| NOT | Negation | {= NOT {@IstGesperrt} } |
| ?? | Null-Coalescing: erster nicht-leerer Wert | {= {@A} ?? {@B} ?? 'Standard' } |
Unterschied ?? vs. ISNULL()#
ISNULL() ersetzt nur echte NULL-Werte. ?? ersetzt NULL und leere Strings ('') damit ist ?? in der Praxis die sichere Wahl wenn Variablen möglicherweise nicht gesetzt wurden.
XOR und Bit-Operatoren#
| Funktion | Beschreibung | Beispiel |
| XOR(a, b) | Logisches XOR genau einer der beiden muss wahr sein | {= XOR({@A}, {@B}) } |
| BITAND(a, b) | Bitweises AND beide Bits müssen 1 sein | {= BITAND({@Flags}, 4) } |
| BITOR(a, b) | Bitweises OR mindestens ein Bit muss 1 sein | {= BITOR({@Flags}, 8) } |
| BITXOR(a, b) | Bitweises XOR genau ein Bit muss 1 sein | {= BITXOR({@A}, {@B}) } |
| BITNOT(a) | Bitweises NOT alle Bits umkehren | {= BITNOT({@Flags}) } |
| BITSHIFT(a, n) | Bit-Verschiebung n > 0 links, n < 0 rechts | {= BITSHIFT({@Wert}, 2) } |
Funktionen#
Mathematische Funktionen#
| Funktion | Beschreibung | Beispiel |
| IIF(bed, dann, sonst) | Ternary / Bedingter Wert | {= IIF({@Wert} > 0, 'Positiv', 'Negativ') } |
| ROUND(zahl, stellen) | Runden | {= ROUND({@Preis} * 1.19, 2) } |
| ABS(zahl) | Absolutwert | {= ABS({@Differenz}) } |
| CEILING(zahl) | Aufrunden | {= CEILING({@Ergebnis}) } |
| FLOOR(zahl) | Abrunden | {= FLOOR({@Ergebnis}) } |
| SQRT(zahl) | Quadratwurzel | {= SQRT({@Flaeche}) } |
| MAX(a, b) | Maximum | {= MAX({@A}, {@B}) } |
| MIN(a, b) | Minimum | {= MIN({@A}, {@B}) } |
String-Funktionen#
| Funktion | Beschreibung | Beispiel |
| LEN(text) | Länge des Textes | {= LEN({@Name}) } |
| TRIM(text) | Leerzeichen entfernen | {= TRIM({@Eingabe}) } |
| SUBSTRING(text, start, len) | Teilstring | {= SUBSTRING({@Text}, 1, 5) } |
| LEFT(text, n) | Linke n Zeichen | {= LEFT({@Name}, 3) } |
| RIGHT(text, n) | Rechte n Zeichen | {= RIGHT({@Name}, 3) } |
| CONTAINS(text, such) | Enthält Text, liefert (0 oder 1) | {= CONTAINS({@Beschr}, 'Test') } |
| EMPTY(text) | Ist leer? liefert (0 oder 1) | {= EMPTY({@Eingabe}) } |
| ISNULL(wert, ersatz) | Null-Ersatz (prüft NULL) | {= ISNULL({@Name}, 'Unbekannt') } |
Formatierungsfunktion#
FORMAT() wird direkt ausgewertet und gibt immer einen String zurück. Es verwendet das deutsche Locale für Zahlen und Datumsangaben.
| Ausdruck | Ergebnis | Beschreibung |
| {= FORMAT({@Preis}, 'N2') } | 1.234,90 | Zahl mit 2 Dezimalstellen |
| {= FORMAT({@Anteil}, 'P0') } | 75 % | Prozentwert ohne Dezimalstellen |
| {= FORMAT({@ID}, '00000') } | 00042 | Zahl mit führenden Nullen |
| {= FORMAT(TODAY(), 'dd.MM.yyyy') } | 20.03.2026 | Datum deutsch |
| {= FORMAT(TODAY(), 'MMMM yyyy') } | März 2026 | Monatsname ausgeschrieben |
| {= FORMAT(NOW(), 'HH:mm:ss') } | 14:30:00 | Uhrzeit |
Datumsfunktionen#
| Funktion | Beschreibung | Beispiel |
| TODAY() | Heutiges Datum | {= TODAY() } |
| NOW() | Aktueller Zeitstempel | {= NOW() } |
Praxisbeispiele#
Berechnungen#
<!-- Einfache Arithmetik -->
<Set Variable="{@Gesamt}" Value="{= {@Preis} * {@Menge} }" />
<Set Variable="{@MwSt}" Value="{= ROUND({@Gesamt} * 0.19, 2) }" />
<Set Variable="{@Netto}" Value="{= {@Gesamt} - {@MwSt} }" />
<!-- Prozentwert -->
<Set Variable="{@Rabatt}" Value="{= {@Preis} * 0.1 }" />
<Set Variable="{@Endpreis}" Value="{= {@Preis} - {@Rabatt} }" />Bedingter Wert (Ternary)
<!-- IIF: Wenn Bedingung dann Wert-A sonst Wert-B -->
<Set Variable="{@Kategorie}" Value="{= IIF({@Gesamt} > 500, 'Großkunde', 'Standardkunde') }" />
<Set Variable="{@Status}" Value="{= IIF({@IstAktiv} = 1, 'Aktiv', 'Inaktiv') }" />
<Set Variable="{@Anrede}" Value="{= IIF({@Geschlecht} = 'M', 'Herr', 'Frau') }" />Null-Coalescing (??)
Gibt den ersten Wert zurück der weder NULL noch leer ist. Prüft damit sowohl auf NULL als auch auf leere Strings im Gegensatz zu ISNULL() das nur NULL prüft.
<!-- Ersten nicht-leeren Wert verwenden -->
<Set Variable="{@Name}" Value="{= {@Spitzname} ?? {@Vorname} ?? 'Unbekannt' }" />
<Set Variable="{@Betrag}" Value="{= {@Rabatt} ?? '0' }" />
<!-- Unterschied zu ISNULL: -->
<!-- ISNULL prüft nur auf NULL ? leerer String '' bleibt leer -->
<!-- ?? prüft NULL UND '' ? leerer String wird ersetzt -->
Formatierung#
<!-- Zahlen formatieren -->
<Set Variable="{@Anzeige}" Value="{= FORMAT({@Preis}, 'N2') }" />
<Set Variable="{@Prozent}" Value="{= FORMAT({@Anteil}, 'P0') }" />
<Set Variable="{@NummerID}" Value="{= FORMAT({@ID}, '00000') }" />
<!-- Datum formatieren -->
<Set Variable="{@DatumDE}" Value="{= FORMAT(TODAY(), 'dd.MM.yyyy') }" />
<Set Variable="{@Monat}" Value="{= FORMAT(TODAY(), 'MMMM yyyy') }" />
<!-- Berechnung + Formatierung kombiniert -->
<Set Variable="{@Zeile}" Value="Gesamt: {= FORMAT({@Preis} * {@Menge}, 'N2') } EUR" />
String-Operationen#
<!-- Länge prüfen -->
<Set Variable="{@ZuLang}" Value="{= LEN({@Eingabe}) > 100 }" />
<!-- Kürzel aus ersten 3 Zeichen -->
<Set Variable="{@Kürzel}" Value="{= LEFT({@Name}, 3) }" />
<!-- Null-Ersatz mit ?? (NULL und leer) -->
<Set Variable="{@Anzeigename}" Value="{= {@Spitzname} ?? {@Vorname} ?? 'Unbekannt' }" />
<!-- Enthält prüfen -->
<Set Variable="{@IstGmbH}" Value="{= CONTAINS({@Firma}, 'GmbH') }" />
Vergleiche und Logik#
<!-- Einfacher Vergleich -->
<Set Variable="{@IstVolljaehrig}" Value="{= {@Alter} >= 18 }" />
<!-- Kombinierte Bedingung -->
<Set Variable="{@IstVIP}" Value="{= {@Umsatz} > 10000 AND {@Jahre} >= 2 }" />
<!-- Bereichsprüfung -->
<Set Variable="{@IstMittel}" Value="{= {@Wert} >= 10 AND {@Wert} <= 100 }" />
XOR #
<!-- Genau eine von zwei Bedingungen darf wahr sein -->
<Set Variable="{@Exklusiv}" Value="{= XOR({@IstAdmin}, {@IstGast}) }" />
<!-- Schalter-Logik: war an ? wird aus, war aus ? wird an -->
<Set Variable="{@NeuerStatus}" Value="{= XOR({@IstAktiv}, 1) }" />
<!-- Unterschied zu OR: OR gibt true wenn beide true, XOR nicht -->
<!-- XOR(1,1) = 0 OR(1,1) = 1 -->
<!-- XOR(1,0) = 1 OR(1,0) = 1 -->
<!-- XOR(0,0) = 0 OR(0,0) = 0 -->
Bit-Operatoren#
Bit-Operatoren sind besonders nützlich wenn Flags oder Berechtigungen als Ganzzahl in einer Datenbank gespeichert werden:
<!-- Flag-Werte (Beispiel): 1=Lesen, 2=Schreiben, 4=Löschen, 8=Admin -->
<!-- Prüfen ob ein bestimmtes Flag gesetzt ist -->
<Set Variable="{@KannSchreiben}" Value="{= BITAND({@Rechte}, 2) }" />
<!-- Ergebnis: 2 wenn Flag gesetzt, 0 wenn nicht -->
<!-- Flag setzen (hinzufügen) -->
<Set Variable="{@NeueRechte}" Value="{= BITOR({@Rechte}, 4) }" />
<!-- Fügt das Löschen-Flag hinzu, lässt andere Flags unverändert -->
<!-- Flag entfernen -->
<Set Variable="{@NeueRechte}" Value="{= BITAND({@Rechte}, BITNOT(4)) }" />
<!-- Entfernt das Löschen-Flag, lässt andere Flags unverändert -->
<!-- Bit-Verschiebung: schnelle Multiplikation/Division durch 2er-Potenzen -->
<Set Variable="{@Mal4}" Value="{= BITSHIFT({@Wert}, 2) }" />
<!-- BITSHIFT(x, 2) = x * 4 (2 Stellen links) -->
<!-- BITSHIFT(x, -1) = x / 2 (1 Stelle rechts) -->
Datum#
<!-- Heutiges Datum setzen -->
<Set Variable="{@Heute}" Value="{= TODAY() }" />
<Set Variable="{@Jetzt}" Value="{= NOW() }" />
<!-- Datumsvergleich -->
<Set Variable="{@Abgelaufen}" Value="{= {@Ablaufdatum} < TODAY() }" />
In Condition-Attributen#
<!-- Kein > oder < Escaping mehr nötig -->
<Set Variable="{@MwSt}" Value="{= ROUND({@Preis} * 0.19, 2) }" Condition="{= {@Preis} > 0 }" />
<!-- Komplexe Bedingung in einer Zeile -->
<Print Text="Rabatt gewährt!" Condition="{= {@Betrag} > 200 AND {@IstNeukunde} = 0 }" />
Gemischte Ausdrücke#
<!-- Text + Ausdruck + normale Variable -->
<Set Variable="{@Info}" Value="Gesamt: {= {@Preis} * {@Menge} } EUR, Kunde: {@Kunde}" />
<!-- Mehrere Ausdrücke in einem Wert -->
<Set Variable="{@Zeile}" Value="{@Artikel}: {= {@Menge} } x {= ROUND({@Preis},2) } EUR" />
Einschränkungen#
Die folgenden Operationen sind mit {= ... } nicht möglich und erfordern weiterhin dedizierte Aktionen:
- Verschachtelte Aufrufe wie {= LEFT({= ... }, 3) } Ausdrücke dürfen nicht ineinander geschachtelt werden
- Mehrzeilige Logik / komplexe Schleifen
- Direkte Datenbankabfragen
- String-Verkettung mit &