Variablen sind mächtige Werkzeuge in Output.Rocks Vorlagen, die es ermöglichen, Werte zu speichern, Berechnungen durchzuführen und komplexe Datenstrukturen zu referenzieren. Sie werden durch das <<$>> (Dollar) Symbol gekennzeichnet und bieten eine flexible Möglichkeit, Vorlagen zu optimieren und zu strukturieren.

Was sind Variablen?

Variablen können in Vorlagen erstellt werden, um den Wert eines einzelnen Datenfelds zu speichern oder als Referenz auf ein Datenobjekt zu dienen. Sie sind besonders nützlich für:

  • Vereinfachung von langen Feldnamen
  • Speicherung von Berechnungsergebnissen
  • Referenzierung komplexer Objektstrukturen
  • Performance-Optimierung durch Wiederverwendung

Grundlegende Variablen-Syntax

<<$firma=kunde.stammdaten.kontaktdaten.rechnungsadresse.name>>
<<$verbrauch=kunde.jahresverbrauch>>
<<$tarif=vertrag.tarifbezeichnung>>

Sehr geehrte Damen und Herren der <<$firma>>,

Ihr Jahresverbrauch beträgt <<$verbrauch>> kWh.
Sie sind im Tarif <<$tarif>> eingestuft.

Die Definitionszeile einer Variable (<<$variablenName=wert>>) wird vollständig aus dem Dokument entfernt, wenn sie allein in einer Zeile steht. Nur die Verwendung der Variable erzeugt Ausgabe.

Expressions in Variablen

Variablen können nicht nur einfache Feldwerte speichern, sondern auch das Ergebnis komplexer Berechnungen und Ausdrücke. Für Expressions müssen die Werte in geschweifte Klammern {...} gesetzt werden:

<<$summe={betrag1 + betrag2 + betrag3}>>
<<$kundenname={kunde.vorname + ' ' + kunde.nachname}>>
<<$rabatt={map(kunde.typ == 'Premium', true, 0.15, 0.05)}>>
<<$grundpreis_formatiert={numFormat(grundpreis, '#,##0.00')}>>

Verfügbare Expression-Typen:

Ohne geschweifte Klammern wird der Wert als Feldname interpretiert: <<$wert=summe>> speichert das Feld "summe", während <<$wert={1+2+3}>> das Berechnungsergebnis "6" speichert.

In Expressions müssen String-Literale in einfache Anführungszeichen gesetzt werden: {kunde.vorname + ' GmbH'}. Doppelte Anführungszeichen führen zu Fehlern.

Mehr Details zu Expressions finden Sie unter Ausdrücke und Funktionen.

Erweiterte Variablen-Anwendungen

<<$gesamtkosten=0>>
<<$ersterkunde=kunden[0]>>
<<$firmenname={ifBlank($ersterkunde.name, 'Unbekannter Kunde')}>>

Kostenaufstellung für das Jahr:

<<rs_tarife>>
- <<bezeichnung>>: <<$kosten={ifBlank(grundpreis, 0) * 12 + ifBlank(arbeitspreis, 0) * ifBlank(verbrauch, 0)}>> €
<<$gesamtkosten={$gesamtkosten + $kosten}>>
<<es_>>

Gesamtkosten: <<{numFormat($gesamtkosten, '#,##0.00')}>> €
Referenzkunde: <<$firmenname>>

Variablen können sowohl einfache Werte als auch komplexe Objekte wie Arrays, Pfade oder ihre JSON-Objekte speichern. Bei Objektvariablen können Sie mit der Punktnotation auf Eigenschaften zugreifen.

Variablen sind nur auf der Ebene sichtbar, auf der sie definiert wurden. Wird eine Variable nur innerhalb einer wiederholenden Sektion definiert, ist sie außerhalb nicht verfügbar.

Gültigkeitsbereiche von Variablen

Komponenten-Variablen
Vorgerendert - isoliert, nicht global sichtbar
Teil-Vorlage
Interne Variablen
Nicht global sichtbar
Stamm-Vorlage
Template-global
überall aufrufbar
rs_/rr_
interne + globale
cs_
interne + globale
Zugriff
Teil-Vorlagen können
globale Variablen lesen

Legende:

  • Teil-Vorlagen (Blau): Interne Variablen nur innerhalb der Teil-Vorlage verfügbar

  • Überschneidung: Teil-Vorlagen können globale Variablen lesen (aber nicht umgekehrt)

  • Global (Grün): Vorlagen-übergreifende Variablen mit Schleifen- und bedingten Unterbereichen

  • Variablen-Sichtbarkeit:

  • Globale Variablen: Überall verfügbar (Stamm-Vorlagen, Teil-Vorlagen)

  • Teil-Vorlagen: Sehen globale Variablen, eigene Variablen nicht global sichtbar

  • Komponenten: Völlig isoliert, vorgerendert in eigenem Kontext

  • Schleifen/Bedingte: Lokaler Scope (rs_/rr_ und cs_ Bereiche)

<<$jahreskosten=0>>

Kostenübersicht:

<<rs_quartale>>
  <<$quartalssumme={map(monate, 'betrag') + map(monate, 'grundpreis')}>>
  Quartal <<$itemnum>>: <<$quartalssumme>> €
  <<$jahreskosten={$jahreskosten + $quartalssumme}>>
<<es_>>

Gesamtkosten: <<$jahreskosten>> €

Alternative Syntax mit var_

Output.Rocks unterstützt eine alternative Syntax für Variablen mit var_ anstelle von $. Diese ist besonders nützlich in Microsoft Word, wo das Dollar-Symbol in Bookmark-Namen nicht verwendet werden kann.

<<$firmenname=kunde.unternehmen.name>>
<<var_kontakt=kunde.ansprechpartner.name>>

Firma: <<$firmenname>>
Kontakt: <<var_kontakt>>

Beide Werte: <<$firmenname>> / <<var_firmenname>>

<<$name>> und <<var_name>> sind vollständig äquivalent. Sie können beide Syntaxformen in demselben Template verwenden und sogar zwischen ihnen wechseln.

Sichere Variablen-Referenzen

In Vorlagen, die von verschiedenen Quellen aufgerufen werden, kann es vorkommen, dass eine Variable möglicherweise nicht initialisiert wurde. Output.Rocks bietet dafür "nachsichtige" Variablen-Lookups:

<<cs_{isBlank($?unternehmen)}>>
Kein Unternehmen angegeben
<<else>>
Unternehmen: <<$unternehmen>>
<<es_>>

Kontakt: <<$?ansprechpartner>>

Verwenden Sie <<$?variablenName>> (mit Fragezeichen) für Variablen, die möglicherweise nicht gesetzt sind. Ohne das Fragezeichen würde Output.Rocks einen Fehler ausgeben.

Die Kombination aus nachsichtigen Variablen ($?variable) mit bedingten Abschnitten und der isBlank-Funktion ist ein häufiges Muster für robuste Templates.

Built-in Variables

Output.Rocks stellt eine Reihe von eingebauten Variablen zur Verfügung, die automatisch in jedem Template verfügbar sind. Diese Built-in Variables bieten Zugriff auf Kontext-Informationen, Zeitstempel, Formatierungshilfen und Meta-Daten ohne explizite Definition.

Diese Variablen ermöglichen die Navigation durch die JSON-Datenstruktur und den Zugriff auf verschiedene Kontext-Ebenen.

Stammdaten: <<$root.kunde.firmenname>>

<<rs_rechnungen>>
  Rechnung: <<rechnungsnummer>>
  Aktueller Kontext: <<$this.betrag>> €
  
  <<rs_positionen>>
    Position: <<beschreibung>>
    Preis: <<$this.einzelpreis>> €
    
    Von oben: <<$parent.rechnungsnummer>>
    Stamm: <<$root.kunde.firmenname>>
  <<es_>>
<<es_>>

Verfügbare Navigation-Variablen:

  • <<$root>> oder <<$top>>: Zugriff auf die Stamm-Datenstruktur
  • <<$this>> oder <<$current>>: Aktueller Datenkontext
  • <<$parent>>: Übergeordneter Datenkontext (bei verschachtelten Schleifen)

Zeitstempel

Built-in Variables für Zeitinformationen werden automatisch zum Zeitpunkt der Vorlagen-Verarbeitung generiert.

Rechnung erstellt am: <<dateFormat($nowUTC, 'dd.MM.yyyy')>>
Zeitstempel: <<dateFormat($nowUTC, 'dd.MM.yyyy HH:mm:ss')>>

Millisekunden seit 1970: <<$nowMS>>
UTC-Zeit (ISO): <<$nowUTC>>

Verarbeitungszeit: <<$nowMS>> ms

Die Zeitstempel-Variablen werden zum Zeitpunkt der Template-Verarbeitung generiert, nicht beim Laden der Daten. Dies ist wichtig für Archivierungs- und Audit-Zwecke.

Zeilenumbrüche

Die Built-in Variablen <<$nl>> und <<$nl2>> helfen bei der Formatierung und Strukturierung der Ausgabe, besonders in Wiederholenden Abschnitten wie Tabellen und Listen.

Kunde: EnergiePartner Nord GmbH<<$nl>>
Adresse: Musterstraße 123<<$nl>>

Rechnungspositionen:<<$nl>>
<<rs_positionen>>
- <<beschreibung>>: <<einzelpreis>> €<<$nl>>
<<es_>>

Zeilenumbruch-Test:
Zeile 1<<$nl>>Zeile 2<<$nl>>Zeile 3

<<$nl>> ist besonders nützlich in Microsoft Word-Vorlagen, wo explizite Zeilenumbrüche innerhalb von Vorlagen-Ausdrücken benötigt werden.

Meta-Informationen

Built-in Variables, die Informationen über die Vorlagen-Verarbeitung und -Umgebung bereitstellen.

Template-Engine: <<$tornado>>
Tornado-Version: <<$tornadoVersion>>
Docmosis-Version: <<$docmosisVersion>>

Verarbeitungszeit: <<$nowMS>> ms
UTC-Format: <<$nowUTCFormat>>

Debug-Informationen:
- Engine: <<$tornado>>
- Version: <<$tornadoVersion>>
- Zeitstempel: <<$nowUTC>>

Debugging-Tipp: Die Meta-Informations-Variablen sind besonders nützlich für die Fehlersuche und das Versionstracking in komplexen Template-Umgebungen.

Verfügbare Meta-Variablen:

  • <<$tornado>>: Name der Template-Engine ("Tornado")
  • <<$tornadoVersion>>: Version der Tornado-Engine
  • <<$docmosisVersion>>: Version der Docmosis-Plattform
  • <<$nowUTCFormat>>: UTC-Zeit im ISO 8601 Format

Range Specifiers und Lookups

Range Specifiers sind ein Werkzeug, um den gezielten Zugriff auf bestimmte Elemente in Arrays und Listen zu ermöglichen. Sie können kombiniert mit hierarchischen Lookups (z.B. <<kunde.stammdaten.firmenname>>) verwendet werden, um eine große Auswahl an Daten zu selektieren.

Erste Rechnung: <<rechnungen[0].nummer>>
Letzte Rechnung: <<rechnungen[L].nummer>>
Alle Rechnungen: <<rechnungen[*].nummer>>

Erste 3 Rechnungen:
<<rs_rechnungen[F3]>>
- <<nummer>>: <<betrag>> €
<<es_>>

Letzte 2 Rechnungen:
<<rs_rechnungen[L2]>>
- <<nummer>>: <<betrag>> €
<<es_>>

Spezielle Auswahl (Index 1,3,5):
<<rs_rechnungen[1,3,5]>>
- <<nummer>>: <<betrag>> €
<<es_>>

Komplex: Letzte Position der ersten Rechnung:
<<rechnungen[0].positionen[L].beschreibung>>

Verfügbare Range Specifiers:

  • [0]: Erstes Element (Index beginnt bei 0)
  • [F]: Erstes Element (equivalent zu [0])
  • [L]: Letztes Element
  • [*]: Alle Elemente
  • [F3]: Erste 3 Elemente
  • [L3]: Letzte 3 Elemente
  • [1,2,4]: Spezifische Indices (1, 2 und 4)
  • [1-3,L2]: Range 1-3 plus letzte 2 Elemente
  • [0-L2]: Alle außer den letzten 2 Elementen
Erweiterte Range-Kombinationen:

Alle außer letzten 2: <<rechnungen[0-L2].nummer>>

Range 1-3 plus letzte 2:
<<rs_rechnungen[1-3,L2]>>
<<$itemnum>>. <<nummer>> (<<betrag>> €)
<<es_>>

Hierarchische Navigation:
Kunde: <<kunde.stammdaten.firmenname>>
Anschrift: <<kunde.stammdaten.adresse.strasse>> <<kunde.stammdaten.adresse.hausnummer>>

Verbrauchsdaten - Letzte Messung:
Zählerstand: <<kunde.zaehler[0].messungen[L].stand>> kWh
Datum: <<kunde.zaehler[0].messungen[L].datum>>

Erste und letzte Messung vergleichen:
Start: <<kunde.zaehler[0].messungen[0].stand>> kWh
Ende: <<kunde.zaehler[0].messungen[L].stand>> kWh
Verbrauch: <<{kunde.zaehler[0].messungen[L].stand - kunde.zaehler[0].messungen[0].stand}>> kWh

Dot-Notation für Hierarchien: Die Punkt-Notation (.) ermöglicht die Navigation durch verschachtelte Datenstrukturen. kunde.stammdaten.firmenname navigiert von kunde zu stammdaten zu firmenname.

Wichtige Einschränkungen bei Range Specifiers:

  • Nur EINE Multi-Value-Range pro Feld erlaubt: freunde[*].haustiere[*] ist nicht zulässig
  • Index-Bereiche beginnen immer bei 0 (null-basiert)
  • Bei ungültigen Indices wird ein leerer Wert zurückgegeben

Praktische Anwendung: Range Specifiers sind besonders nützlich für:

  • Zusammenfassungen ([F3] für "Top 3")
  • Vergleiche ([0] vs [L] für "Erste vs Letzte")
  • Berichte mit begrenzten Datensätzen ([0-L5] für "Alle außer letzten 5")

Best Practices für Variablen

Defensive Programmierung mit Logik-Funktionen

1. Sichere Standardwerte:

// Statt unsicherer Variablen:
<<$name=kunde.vorname + ' ' + kunde.nachname>>

// Verwende ifBlank() für Fallbacks:
<<$name={ifBlank(kunde.vorname, 'Unbekannt') + ' ' + ifBlank(kunde.nachname, 'Unbekannt')}>>

2. Null-sichere Berechnungen:

// Statt direkter Berechnungen:
<<$jahreskosten={monatlich * 12}>>

// Verwende ifBlank() für null-Werte:
<<$jahreskosten={ifBlank(monatlich, 0) * 12}>>

3. Intelligente Klassifizierung:

// Status-Mapping mit map():
<<$status_text={map(kunde.status, 'A', 'Aktiv', 'I', 'Inaktiv', 'Unbekannt')}>>

// Case-insensitive mit mapi():
<<$verbrauchstyp={mapi(zaehler.typ, 'smart', 'Intelligenter Zähler', 'analog', 'Standard-Zähler', 'Unbekannt')}>>

Allgemeine Richtlinien

AnwendungsfallEmpfehlung
Lange FeldnamenAussagekräftige Kurznamen: $kundenname statt $k
BerechnungenLogik-Funktionen für null-sichere Operationen
Globale WerteAkkumulator-Variablen vor Schleifen initialisieren
Unsichere Variablen$?variable in wiederverwendbaren Vorlagen
ObjektreferenzenHäufig verwendete Objekte einmal am Anfang speichern
FormatierungnumFormat() für konsistente Zahlen-Darstellung

Variablen sind ein mächtiges Werkzeug zur Optimierung von Vorlagen. Kombinieren Sie sie mit Logik-Funktionen für defensive Programmierung und Bedingten Abschnitten für komplexe Vorlagen-Logik.

Performance-Tipp: Verwenden Sie ifBlank() in Variablen-Definitionen, um null-Pointer-Exceptions zu vermeiden und Vorlagen robuster zu machen. Dies ist besonders wichtig bei Berechnungen und String-Konkatenationen.