Liste aller Anweisungen
Im folgenden eine Liste aller Anweisungen, die zur Steuerung der ODTCreatorUnit eingesetzt werden können. Wenn diese Anweisungen Blöcke einschließen, nennen wir sie Blockmarken, wenn sie durch Werte ersetzt werden, Wertmarken. Daneben gibt es noch Aktionsmarken, die sich nicht sofort auf das erzeugte Dokument auswirken, sondern nur eine Aktion innerhalb der Unit auslösen.
table
Typ: Blockmarke
Format: odtcreator:table:<Knotenname>
Ein table-Block schließt immer eine Tabelle ein. Die Inhalts-Zeilen dieser Tabelle werden für jeden Datensatz des angegebenen Knotens wiederholt, während die Überschrifts-Zeile gleich bleibt. Diese Überschriftszeile wird normalerweise beim Anlegen einer Tabelle (in OpenOffice) automatisch als erste Zeile generiert. Soll eine Tabelle mehrere Überschriften enthalten, die pro Datensatz wiederholt werden sollen, darf keine "echte" Überschrifts-Zeile verwendet werden, sondern es muss eine normale Inhalts-Zeile verwendet werden, in der die Texte eben als Überschrift formatiert sind. Dies erreicht man, indem man nach Anlage der Tabelle die Überschriftszeile löscht und dann stattdessen eine normale Zeile einfügt.
Der Knoten, auf den sich die Tabelle bezieht, muss im aktuellen Block liegen. Innerhalb des table-Blocks befindet man sich dann in dem angegebenen Knoten, kann also direkt auf seine Felder und Unterknoten zugreifen.
tabledeep
Typ: Blockmarke
Format: odtcreator:tabledeep:<Knotenname>
Die tabledeep-Anweisung arbeitet im Prinzip wie die table-Anweisung. Allerdings müssen hier die Knoten, auf die sich die Anweisung bezieht, nicht direkt unter dem Knoten des aktuellen Blocks liegen. So kann man sich unter Umständen einige Blöcke sparen, wenn man diese nur benötigen würde, um zu den Tabellen-Knoten zu kommen.
deep
Typ: Blockmarke
Format: odtcreator:deep:<Knotenname>
Ähnlich wie tabledeep kann auch deep mehrere Blöcke einsparen, wenn man nur schnell in einen Knoten mehrere Ebenen unter dem aktuellen Knoten gehen will. Im Rechnungs-Beispiel könnte man also z. B. direkt aus dem Block Rechnung in den Block PosKopf gelangen. Mit "normalen" Blöcken müsste man erst noch den Knoten Position betreten, bevor man in PosKopf gelangt.
Beispiel ohne deep:
{--Rechnung--}
...
{--Position--}
{--PosKopf--}
Position {--Pos-Nr--}: Artikelnr. {--Artikelnummer--}, {--Kurzbeschreibung--}
{--/PosKopf--}
{--/Position--}
...
{--/Rechnung--}
Beispiel mit deep (dort geht das in einem Schritt):
{--Rechnung--}
...
{--odtcreator:deep:PosKopf--}
Position {--Pos-Nr--}: Artikelnr. {--Artikelnummer--}, {--Kurzbeschreibung--}
{--/odtcreator:deep--}
...
{--/Rechnung--}
parent
Typ: Blockmarke
Format: odtcreator:parent
Mit dieser Anweisung kann man in der Baumstruktur wieder ein Element nach oben gehen. Der Inhalt des parent-Blocks wird auf den aktuellen Datensatz des übergeordneten Knotens angewandt. Das heißt, man könnte von dort aus auch wieder in andere Knoten dieses Vaterknotens gelangen.
Beispiel:
{--Rechnung--}
...
{--odtcreator:deep:PosKopf--}
Position {--Pos-Nr--}: Artikelnr. {--Artikelnummer--}, {--Kurzbeschreibung--}
{--odtcreator:parent--}
Detailinformationen:
{--PosDetail--}
{--Detailtext--}
{--/PosDetail--}
Zusätze:
{--PosZusatz--}
{--Zusatzinfo--}
{--/PosZusatz--}
{--/odtcreator:parent--}
{--/odtcreator:deep--}
...
{--/Rechnung--}
if
Typ: Blockmarke
Format: odtcreator:if:equal:<Feld>:<Wert>
oder: odtcreator:if:notequal:<Feld>:<Wert>
oder: odtcreator:if:textis:<Wert>
oder: odtcreator:if:textisnot:<Wert>
oder: odtcreator:if:inelement:<Elementname>
Bedingungen equal und notequal:
Der Block wird nur ausgewertet, wenn das angegebene Feld den gewünschten Wert hat (equal), bzw. nicht hat (notequal).
Bedingungen textis und textisnot:
Wenn man sich in einem Block direkt auf Felder bezieht, kann so der Inhalt des Feldes überprüft werden.
Bedingung inelement:
Diese Bedingung ist nur in einem Block der Anweisung in sinnvoll. Der Block der if-Anweisung wird dann nur ausgewertet, wenn man sich im Element (Knoten oder Feld) des angegebenen Namens befindet. Ein Beispiel hierzu finden Sie bei der Beschreibung der in-Anweisung (Beispiel 2).
Beispiel 1: equal
{--Rechnung--}
...
{--Adresse--}
...
{--odtcreator:if:equal:Anrede:Herr--}
Sehr geehrter Herr {--Nachname--},
{--/odtcreator:if--}
{--odtcreator:if:equal:Anrede:Frau--}
Sehr geehrte Frau {--Nachname--},
{--/odtcreator:if--}
{--/Adresse--}
...
{--/Rechnung--}
Die Bedingung notequal wird entsprechend ausgewertet.
Beispiel 2: textis
{--Rechnung--}
...
Aktionspreise erhalten Sie bei folgenden Positionen:
{--odtcreator:deep:Zusatzinfo--}
{--odtcreator:if:textis:Aktionspreis--}
{--odtcreator:parent--}
{--odtcreator:parent--}
{--PosKopf--}
Position {--Pos-Nr--}: Artikelnr. {--Artikelnummer--}, {--Kurzbeschreibung--}
{--/PosKopf--}
{--/odtcreator:parent--}
{--/odtcreator:parent--}
{--/odtcreator:if--}
{--/odtcreator:deep--}
...
{--/Rechnung--}
In diesem Beispiel werden sämtliche Zusatzinformationen daraufhin überprüft, ob sie den Wert Aktionspreis haben. Wenn ja, werden die Kopfdaten der jeweiligen Position ausgegeben. Dazu muss man sich erst im Baum hocharbeiten, von der Zusatzinfo über PosZusatz (1. parent) zur Position (2. parent) und dann den Knoten PosKopf betreten. Die Bedingung textisnot wird analog ausgewertet.
in
Typ: Blockmarke
Format: odtcreator:in:[Liste von Knotennamen] oder odtcreator:in:*
Mit dieser Anweisung können alle Unterknoten und Felder des aktuellen Knotens angesprochen werden. Man gibt entweder die gewünschten Knoten- und Feldnamen (durch : getrennt) an, oder setzt einen Stern (*) für alle Unterelemente dieses Knotens.
Beispiel 1: Die Namen und Werte aller Felder von PosKopf ausgeben
{--Rechnung--}
...
{--odtcreator:deep:PosKopf--}
Position {--Pos-Nr--} hat folgende Inhalte:
{--odtcreator:in:*--}
{--odtcreator:elementname--} = {--odtcreator:elementtext--}
{--/odtcreator:in--}
{--/odtcreator:deep--}
...
{--/Rechnung--}
Zu den Anweisungen elementname und elementtext siehe dort.
Beispiel 2: Kombination mit if:inelement
{--Rechnung--}
...
{--Position--}
{--odtcreator:in:PosKopf:PosZusatz--}
{--odtcreator:if:inelement:PosKopf--}
Position {--Pos-Nr--}: Artikelnr. {--Artikelnummer--}, {--Kurzbeschreibung--}
{--/odtcreator:if--}
{--odtcreator:if:inelement:PosZusatz--}
Zusatz: {--Zusatzinfo--}
{--/odtcreator:if--}
{--/odtcreator:in--}
{--/Position--}
...
{--/Rechnung--}
Im Block zum Knoten Position werden die beiden Knoten PosKopf und PosZusatz durch die in-Anweisung durchlaufen. Je nach dem, in welchem Unterknoten man sich befindet, wird die entsprechende Zeile ausgegeben. Das ist natürlich in diesem Fall etwas sinnlos, da man gleich direkt die Blöcke angeben kann. Aber es zeigt das Prinzip.
elementname und elementtext
Typ: Wertmarken
Format: odtcreator:elementname oder odtcreator:elementtext
Diese beiden Marken werden durch den Namen des aktuellen Elements (Knoten oder Feld) ersetzt, bzw. durch den Text (also Wert), falls es sich um ein Feld handelt. Ein Beispiel zur Anwendung finden Sie bei der in-Anweisung (Beispiel 1).
define und undefine
Typ: Aktionsmarken
Format: odtcreator:define:<BeliebigerName> oder odtcreator:undefine:<BeliebigerName>
Diese beiden Marken haben keine direkte Auswirkung im Text und werden einfach durch einen Leerstring ersetzt. Allerdings merkt sich die ODTCreatorUnit die angegebenen Namen als definiert, bzw. löscht diese Definition wieder. So kann z.B. an anderer Stelle darauf reagiert werden, ob davor mal eine bestimmte Bedingung erfüllt war.
Im folgenden Beispiel erweitern wir die Ausgabe der Positionen mit Aktionspreis (Beispiel 2 der if-Anweisung) um eine Zeile, die nur dann ausgegeben wird, wenn keine Position mit Aktionspreis gefunden wurde. Dazu nutzen wir die Anweisung ifundef, die weiter unten beschrieben wird.
Beispiel: Zeile ausgeben, wenn keine Aktionspreise existieren
{--Rechnung--}
...
Aktionspreise erhalten Sie bei folgenden Positionen:
{--odtcreator:deep:Zusatzinfo--}
{--odtcreator:if:textis:Aktionspreis--}
{--odtcreator:parent--}
{--odtcreator:parent--}
{--PosKopf--}
Position {--Pos-Nr--}: Artikelnr. {--Artikelnummer--}, {--Kurzbeschreibung--}
{--odtcreator:define:Aktionspreis gefunden--}
{--/PosKopf--}
{--/odtcreator:parent--}
{--/odtcreator:parent--}
{--/odtcreator:if--}
{--/odtcreator:deep--}
{--odtcreator:ifundef:Aktionspreis gefunden--}
Leider kommen Sie nicht in den Genuss von Aktionspreisen.
{--/odtcreator:ifundef--}
...
{--/Rechnung--}
Will man eine ähnliche Überprüfung später noch mal machen, kann man die Definition von "Aktionspreis gefunden" hinterher wieder löschen: {–odtcreator:undefine:Aktionspreis gefunden–}.
ifdef und ifundef
Typ: Blockmarken
Format: odtcreator:ifdef:<BeliebigerName> oder odtcreator:ifundef:<BeliebigerName>
Der mit ifdef definierte Block wird nur ausgewertet, wenn der angegebene Name vorher mittels der define-Anweisung definiert wurde.
Der mit ifundef definierte Block dagegen wird nur ausgewertet, wenn der Name nicht definiert, oder die Definition mittels der undefine-Anweisung wieder gelöscht wurde. Ein Beispiel zur Verwendung von ifundef finden Sie oben bei der Beschreibung der Anweisungen define und undefine (ifdef wird analog benutzt).