Beispiel-Vorlagen

Eine erste Vorlage

Wie man an den Beispieldaten sehen kann, sollten zwei Rechnungen generiert werden, eine für Herrn Hans Meier und eine für Frau Trude Mueller. Daher wird in der Konfiguration der Unit festgelegt, dass mehrere Dokumente generiert werden sollen. Und zwar eines pro Vorkommen des Knotens Rechnung. Wir setzen daher den Parameter create multiple files auf true und geben als root node for multiple files den Knoten Rechnung an. Für den Anfang wollen wir nur die Kopfdaten und die Adresse ausgeben. Unsere Vorlage ist also erst mal eine ODT-Datei mit folgendem Inhalt.

images/download/attachments/21306350/template_1_de-version-1-modificationdate-1468300222000-api-v2.png

Template_1_DE.odt

Daran kann man schon mal die wichtigsten Elemente einer solchen Vorlage erkennen: Blöcke und Feld-Platzhalter. Alles zwischen den Elementen {--Rechnung--} und {--/Rechnung--} ist zum Beispiel ein Block. Dies bedeutet, dass alle Felder und weiteren Blöcke, die zwischen den beiden Anfangs- und Endmarken stehen, sich auf den Knoten Rechnung beziehen. Hätten wir create multiple files auf false gesetzt, würde ein Dokument erzeugt, in dem für jede Rechnung die Kopf- und Adressdaten stehen.

Innerhalb des Blocks Rechnung werden zwei weitere Blöcke aufgemacht. Einer für die Kopfdaten und einer für die Adressdaten. Die Marken für diese Blöcke heißen genau so wie die Knoten, in denen sich die jeweiligen Felder befinden: Kopf und Adresse. Innerhalb dieser Blöcke wiederum werden die Werte der Felder, die sich unter den entsprechenden Knoten befinden, an den durch die Platzhalter vorgegebenen Stellen eingefügt. Die Platzhalter haben wiederum exakt die Namen, die die Felder im Baum haben. Also z. B. {--Lieferschein_Nummer--} oder {--Anrede--}. Sie sehen übrigens an der Zeile mit PLZ und Ort, dass auch beliebige Textformatierungen möglich sind. Die anstelle der Platzhalter eingesetzten Werte sind dann ebenfalls so formatiert.

Unsere Rechnung für Herrn Meier sieht bis dahin so aus:

images/download/attachments/21306350/zweites_template_de-version-1-modificationdate-1468300222000-api-v2.png

Template_2_DE.odt (Dies ist kein Template, sondern das Ergebnis eines verarbeiteten Templates.)

Erweiterungen der Vorlage

Nun brauchen wir eine Anrede. Natürlich könnten wir innerhalb des Adress-Blocks einfach folgendes schreiben:

images/download/attachments/21306350/drittes_template_de-version-1-modificationdate-1468300222000-api-v2.png

Template_3_DE.odt

Aber so ein "Sehr geehrte(r)" sieht doch nicht gerade schön aus. Also machen wir diese Zeile abhängig von der Anrede:

images/download/attachments/21306350/viertes_template_de-version-1-modificationdate-1468300222000-api-v2.png

Template_3b_DE.odt

Dies ist ein Beispiel für einen Block, der mit Anweisungen für die Unit arbeitet. In diesem Fall soll der jeweilige Block nur dann ausgeführt werden, wenn das Feld Anrede den Wert Herr, bzw. Frau hat. Das Ende eines solchen Blocks muss nur die Kennung odtcreator und die Anweisung selbst enthalten, in diesem Falle also /odtcreator:if. Den Rest aus der öffnenden Marke können Sie gerne dazuschreiben, um sich z. B. besser orientieren zu können, welchen if-Block Sie da gerade schließen. Ausgewertet wird das aber nicht mehr.

Als nächstes wollen wir nun die einzelnen Rechnungspositionen aufführen. Dies soll in einer Tabelle geschehen. Erst mal die einfache Variante:

images/download/attachments/21306350/template_5_de-version-1-modificationdate-1468300222000-api-v2.png

Template_4_DE.odt

Die Unit wiederholt so für jede Position die Inhalts-Zeile der Tabelle (die Kopfzeile wird nicht wiederholt) und füllt sie mit den Feldwerten aus dem jeweiligen Unterknoten PosKopf. Wie man sieht, können Blöcke auch innerhalb einer Tabellenzelle stehen. Aber auch hier müssen öffnende und schließende Marke wieder am Anfang einer ansonsten leeren Zeile stehen. Allerdings sieht das doch sehr unleserlich aus. Also warum beziehen wir die Tabelle nicht direkt auf den Knoten PosKopf? Weil der leider nicht direkt unter Rechnung liegt, sondern unter Position und wie vorhin schon erwähnt wurde, kann ein Knoten, oder Feld immer nur innerhalb eines Blocks angesprochen werden, der sich auf den direkt darüberliegenden Knoten bezieht.

Aber dafür gibt es eine Lösung. Statt der Anweisung table wird die Anweisung tabledeep benutzt:

images/download/attachments/21306350/template_6_de_-version-1-modificationdate-1468300222000-api-v2.png

Template_5_DE.odt

Bei dieser Variante wird auch tief unten in den Unterknoten von Rechnung nach Vorkommen des Knotens PosKopf gesucht und die Tabelleninhalte für diese Knoten wiederholt.

Dann fehlt uns noch die Summe über alle Positionen:

images/download/attachments/21306350/template_7_de-version-1-modificationdate-1468300222000-api-v2.png

Template_6_DE.odt