Formulare

Formulare sind die Ausdrucke (auch Berichte genannt), welche die Anwendung erstellen kann. Die Vorlagen der Formulare sind im XML-Format gespeichert und können mit wenigen XML-Kenntnissen und mit einem Texteditor bearbeitet werden.

Aufbau der XML-Datei

Jedes Formular ist grundsätzlich in folgende Bereiche aufgeteilt:

 <?xml version="1.0" encoding="ISO-8859-1"?>
 <report>
   <areas>
       <reportHead>
       </reportHead>
       <pageHead>
       </pageHead>
       <detail>
       </detail>
       <pageFoot>
       </pageFoot>
       <reportFoot>
       </reportFoot>
   </areas>
 </report>

Aufbau der Elemente mit Druckdaten

Alle Elemente mit Druckdaten (reportHead, pageHead, detail, pageFoot, reportFoot) enthalten Unterelemente, welche die zu druckenden Daten (Texte mit Platzhaltern) enthalten. Darüber hinaus gibt es Unterelemente, mit denen bestimmt wird, wie die Daten eingebunden werden (als einfacher Text oder als Unterelemente) oder welche die Positionierung des Elements beeinflussen.

 <reportHead>
   <text>
      <textbox 
          style="
              border-width: 0;
              text-align: left; 
              vertical-align: top; 
              left: 0; top: 95; width: 325; height: 100; 
              font-family: Courier New; 
              font-size: 10;
              font-weight: bold;"
              >{BillTo}</textbox>
   </text>
 </reportHead>

Das obige Beispiel zeigt den XML-Code für den Druckbereich “reportHead”. Die gezeigten Unterelemente haben folgende Funktion:

In der Praxis sind Elemente, welche ControlsPrinterData als Methode zur Interpretation des Elements ,,text” verwenden, am gebräuchlichsten, weil sich nur hiermit die Darstellung genau beeinflussen lässt. Ab Version 2011-12-XX wird das Element type nicht mehr ausgewertet und es steht somit nur noch die Druckmethode ControlsPrinterData zur Verfügung, welche automatisch ausgewählt wird.

Interpretation von Texten

Der Formularkopf (reportHead), die Detailbereiche (detail) und alle weiteren Elemente (pageHead, pageFoot, reportFoot) enthalten ein Unterelement mit Namen ,,text”. Dieses Element enthält Unterelemente für Textboxen etc. In diese Textboxen werden die Daten des zu druckenden Objektes (z.B. eine Rechnung) eingebunden. Hierfür werden Platzhalter verwendet:

 Rechnung: {UserID}
 Datum: {OrderDate}

Der obige Text könnte im text-Unterelement des reportHead-Elements enthalten sein. Das Druckmodul der Anwendung sucht vor dem Ausdruck des Textes alle Platzhalter im Text und ersetzt Sie durch gleichnamige Eigenschaften des Objektes.

Ein Platzhalter beginnt mit { und endet mit }. Dazwischen steht der Name des Platzhalters.

Formatierung von Platzhaltern

Platzhalter werden durch die gleichnamigen Eigenschaften des Objektes ersetzt, an welches das Formular gebunden ist . Das Objekt für Angebote, Aufträge, Rechnungen etc. enthält eine Eigenschaft mit dem Namen ,,OrderDate”. In dieser Eigenschaft ist das Auftragsdatum gespeichert. Durch Verwendung des Platzhalters {OrderDate} würde das Datum und die Uhrzeit ausgedruckt. Dieses Verhalten können Sie durch Formatangaben verändern.

Durch Verwendung von Formatangaben können Sie bestimmen, wie die Eigenschaft eines Objektes formatiert wird, bevor Sie dargestellt wird.

 Rechnung: {UserId}
 Datum: {Date:OrderDate}

Im Beispiel oben wird die Eigenschaft ,,OrderDate” als Datum formatiert, die Uhrzeit wird also nicht mit ausgegeben

Eine Formatangabe steht vor dem Namen der Eigenschaft, getrennt durch einen Doppelpunkt.

Folgende Formatierungen stehen zur Verfügung:

Besondere Platzhalter: Pfadangaben

Es gibt einige besondere, vordefinierte Platzhalter. Diese Platzhalter werden in Pfadangaben aufgelöst.

Folgende Platzhalter für Pfadangaben gibt es:

Alle genannten Platzhalter werden in absolute Pfadangaben umgesetzt.

Besondere Platzhalter: Funktionen

Folgende Platzhalter führen eine Funktion aus. Das Ergebnis wird dann eingefügt:

Objekt-Eigenschaften (Datenbindung)

Die Anwendung stellt Angebote, Aufträge, Rechnungen und auch Kontakte (Kunden, Lieferanten) als Objekt zur Verfügung.

Objekte besitzen Eigenschaften. Eine Rechnung beispielsweise hat ein Datum, z.B. den 12.01.2006. Anders ausgedrückt könnte man sagen: Ein Objekt ,,Rechnung” besitzt die Eigenschaft ,,Datum” mit dem Wert ,,12.01.2006”.

Wenn Sie einen Eigenschaftswert darstellen bzw. ausdrucken wollen, müssen Sie Platzhalter verwenden (wie oben beschrieben). In den Platzhalter schreiben sie den Namen der Eigenschaft, deren Wert Sie ausdrucken wollen. Beispiel: Um das Rechnungsdatum auszudrucken, verwenden Sie folgenden Platzhalter: {Date:OrderDate}

Es gibt verschiedene Arten von Eigenschaften. Das Rechnungsdatum ist ein Datum (z.B. ,,12.02.2007”), die Rechnungsnummer ist eine Zeichenkette (z.B: ,,RNR 12324”).

Eine Eigenschaft kann aber auch eine Liste sein. Die Eigenschaft ,,Positionen” könnte z.B. alle Rechnungspositionen enthalten.

Wenn Sie eine Eigenschaft, die eines Datums oder einer Zeichenkette, im Formular ausdrucken wollen, funktioniert das wie beschrieben mit Platzhaltern.

Um eine Eigenschaft auszugeben, die eine Liste enthält, muss diese Eigenschaft an einen detail-Bereich gebunden werden.

Verfügbare Eigenschaften

Jedes Objekt stellt bestimmte Eigenschaften zur Verfügung. Eine Rechnung stellt die gleichen Eigenschaften wie ein Angebot zur Verfügung, nämlich beispielsweise ein Datum oder die Positionen. Ein Kunde (eine Adresse) stellt aber wieder ganz andere Eigenschaften zur Verfügung.

Um herauszufinden, welches Objekt welche Eigenschaften zur Verfügung stellt und welche Platzhalter für den Ausdruck eines Objektes verwendet werden können, gibt es den Objekt-Inspektor. Dieser kann alle verfügbaren Eigenschaften eines Objektes auflisten und deren Wert anzeigen.

So finden Sie den Objekt-Inspektor: Wenn Sie eine Rechnung öffnen, sehen Sie oben im Menü den Eintrag ,,Datei”. Hier gibt es einen Untereintrag ,,Objekt-Inspektor”. Wenn sie auf diesen Untereintrag klicken, wird der Objekt-Inspektor geöffnet. Dieser zeigt dann alle Eigenschaften des aktuellen Objektes an.

Eigenschaften, die Listen enthalten

In einer Eigenschaft, die eine Liste enthält, befinden sich mehrere Datumsangaben, Zeichenketten oder Objekte hintereinander (sofern die Liste nicht leer ist).

Um jedes einzelne Element einer Liste ausdrucken zu können, muss die Liste mit einem detail-Element verbunden werden. Das detail-Element wird dann mehrmals untereinander ausgedruckt (einmal für jedes Listenelement). Dabei werden jeweils die Daten des aktuellen Listenelements eingefügt.

Eigenschaften, die Objekte enthalten

Eigenschaften können ein Datum, eine Zeichenkette oder Listen beinhalten.

Darüber hinaus kann eine Eigenschaft auch ein Objekt enthalten, welches wiederum eigene Eigenschaften besitzt.

Eine Rechnung hat die Eigenschaft ,,ContactBillTo”. Diese Eigenschaft enthält ein Objekt welches den Rechnungsempfänger repräsentiert. Dieses Objekt (der Rechnungsempfänger) wiederum kennt die Eigenschaft ,,Phone”, welche eine Liste mit allen Telefonnummern des Rechnungsempfängers enthält.

Es ist möglich auf Eigenschaften direkt zuzugreifen, auch wenn diese Teil eines Objektes sind, welches selber in einer Eigenschaft enthalten ist. Mann trennt dabei die Namen der Eigenschaften einfach durch einen Punkt.

Beispiel:

Der Zugriff auf die Liste mit allen Telefonnummern des Rechnungsempfängers wird so notiert:

ContactBillTo.Phone

Erstellung von Formularen

Um ein Formular zu erstellen muss zunächst eine Datei erstellt werden, welche die benötigen XML-Elemente wie im Absatz ,,Aufbau der XML-Datei” beschrieben, enthält.

Am einfachsten wird die Erstellung eines Formulars anhand eines praktischen Beispiels. Wenn Sie also ein Rechnungsformular erstellen oder anpassen wollen, wählen Sie am Besten eine Rechnung aus und drucken diese mit der Vorschauansicht um das Ergebnis einer Veränderung zu überprüfen.

Datenbindung des Formulars

Das Formular enthält Bereiche für Berichts- und Seitenköpfe sowie für detail-Daten (reportHead etc.). Jeder dieser Bereiche wird automatisch an die Daten gebunden, die dem Formular durch das Programm zur Verfügung gestellt wurden. Diese bedeutet, wenn eine Rechnung ausgedruckt wird, ist jeder Bereich automatisch mit dem Objekt ,,Rechnung” verbunden. Verbunden heißt, es kann auf die Eigenschaften zugegriffen werden, um sie auszudrucken.

Der Ausdruck der Eigenschaftswerte erfolgt, wie zuvor beschrieben, über Platzhalter.

Datenbindung an Listen

Damit das Detailelement die Positionen einer Rechnung darstellen kann, muss es an die Eigenschaft des Rechnungsobjektes gebunden werden, welche die Positionen enthält. Diese Eigenschaft enthält also eine Liste.

 <detail>
    <type>ControlsPrinterData</type>
    <bind>Items</bind>
    <text>                
      <textbox 
          style="
              border-width: 0;
              text-align: left; 
              vertical-align: bottom; 
              left: 350; top: 2; width: 100; height: 10; 
              font-family: Arial; 
              font-size: 10;
              font-weight: normal;"
              >{ItemNumber}</textbox>
      <textbox 
          style="
              border-width: 0;
              text-align: left; 
              vertical-align: bottom; 
              left: 450; top: 2; width: 250; height: 10; 
              font-family: Arial; 
              font-size: 10;
              font-weight: normal;"
              >{ProductId}</textbox>
   </text>
 </detail>

Das Unterelement bind stellt die Verbindung zur darin genannten Eigenschaft her (im Beispiel ist dies die Eigenschaft Items). An dieser Stelle sind nur Eigenschaften sinnvoll, die eine Liste enthalten.

Im Beispiel werden die zu druckenden Inhalte pro vorhandener Rechnungsposition einmal ausgedruckt. Die Wiederholung erfolgt untereinander. Das oben gezeigte Detailelement wird also nicht nur einmal ausgedruckt, sondern pro Listenelement ein mal. Sollte die Liste leer sein, wird das Detailelement gar nicht ausgedruckt.

Erstellung eines detail-Elements

Das Element detail ist ein Unterelement des Element areas. Es ist das einzige Element, das beliebig oft vorkommen darf.

So könnte beispielsweise ein detail-Element verwendet werden, um die Eigenschaften einer Rechnung (z.B. Liefertermin, Versandart, Sachbearbeiter etc.) auszudrucken und ein weiteres detail-Element für die Positionen der Rechnung.

Elemente

Wie bereits zuvor erwähnt, ist die beste Methode, einen Bericht zu gestalten, die Verwendung von Bereichen des Typs ,,ControlsPrinterData”. Hier können Sie Textboxen, Bilder und Linien gestalten.

 <detail>
    <type>ControlsPrinterData</type>
    <text>
      <textbox 
          style="
              border-width: 0;
              text-align: left; 
              vertical-align: top; 
              left: 0; top: 95; width: 325; height: 100; 
              font-family: Courier New; 
              font-size: 10;
              font-weight: bold;"
              >{BillTo}</textbox>
    </text>
 </detail>

Das obige Beispiel zeigt einen Detailbereich vom Typ ,,ControlsPrinterData”. Damit ist es möglich, im Element text Unterelemente einzufügen, welche z.B. einen Text formatieren und darstellen oder Bilder ausgeben.

Texte: Element “textbox”

Das Element “textbox” kann verwendet werden, um Texte formatiert darzustellen.

Die Formatierung und Darstellung erfolgt so:

Es wird die Größe des Textelements festgelegt. Wichtig ist die Angabe der Breite. Die Höhe sollte ebenfalls angegeben werden, im Unterschied zur Breite wird diese allerdings automatisch erweitert, wenn der vorgegebene Platz nicht ausreicht.

Der Text wird in das so definierte Rechteck eingefügt. Zu lange Zeilen werden dabei automatisch umgebrochen, damit der Text nicht mehr als die vorgegebene Breite ,,verbraucht”.

Alle Formatangaben werden im Attribut style der Textbox angegeben. Die Angaben werden im CSS-Syntax gemacht.

Beispiel:

font-size: 10;

Regel:

Trennen Sie den Namen der Formateigenschaft und den zugehörigen Wert mit einem Doppelpunkt. Schreiben Sie nach dem Wert einen Strichpunkt. Sie können alle Formatangaben in einer Zeile hintereinander schreiben oder in mehrere Zeilen aufteilen.

Folgende Formatierungen (Formateigenschaften) werden erkannt:

 <textbox 
   style="
   text-align: left; 
   vertical-align: middle; 
   border-width: 0; 
   left: 0; top: 0; width: 300; height: 80; 
   font-family: Arial; 
   font-size: 14;
   font-weight: bold;"
   >Auftragsbestätigung {Val:UserId}</textbox>

Linien: Element “line”

Das Element line stellt eine Linie dar.

Zur Darstellung einer Linie wird zunächst ein Rechteck definiert. Die Anwendung zeichnet dann eine Line von der linken oberen Ecke zur linken unteren Ecke des Rechtecks.

Im Attribut style des line-Elements werden die Position und Größe des Rechtecks angegeben sowie die Linienfarbe und die Linienstärke.

 <line style="
    border-width: 0.5; 
    border-color: gray;
    left: 350; top: 0; width: 350; height: 0;" 
    ></line>

Bilder: Element “image”

Das Element image lädt ein Bild von der Festplatte und stellt es dar. Die Bildgröße kann dabei frei eingestellt werden.

Im Attribut style des line-Elements werden die Position und Größe des Bildes angegeben. Der Inhalt des Elements ist der Pfad zur Bilddatei.

 <image style="
    border-width: 0; 
    left: 500; top: 0; width: 182; height: 94;"
    >{rep}/images/logoDemmeler.bmp</image>

In der Pfadangabe können Platzhalter verwendet werden.

Das Image-Element passt die eingebundene Bilddatei an die angegebene (width, height) Größe an. Dieses Verhalten lässt sich abstellen, indem man das Attribut scale=,,none” verwendet:

 <image 
    scale="none"
    style="
    border-width: 0; 
    left: 500; top: 0; width: 182; height: 94;"
    >{rep}/images/logoDemmeler.bmp</image>

Positionierung von Elementen

Die Positionierung von Druckbereichen erfolgt untereinander. Wenn es mehrere detail-Bereiche gibt, werden diese direkt untereinander ausgedruckt.

Es gibt 2 Möglichkeiten, um die Positionierung von Bereichen zu beeinflussen: Relative Positionierung und absolute Positionierung. Relative Positionierung

Bei der relativen Positionierung wird ein Druckbereich (meistens ein detail-Bereich) verschoben. Die Verschiebung erfolgt dabei relativ zu der Position, an der sich der Bereich normalerweise befinden würde.

Die Positionierung erfolgt über das XML-Element offset. Dieses Element ist optional. Es muss also nur dann in einem Druckbereich auftauchen, wenn der Druckbereich ,,verschoben” werden soll.

Das offset-Element benötigt die Attribute x und y. Diese Attribute bestimmen die Verschiebung auf der X- und der Y-Achse.

Ein positiver x-Wert verschiebt nach rechts, ein negativer x-Wert verschiebt nach links.

Ein positiver y-Wert verschiebt nach unten, ein negativer y-Wert verschiebt nach oben.

 <detail>
    <type>ControlsPrinterData</type>
    <offset x="50" y="-280"></offset>
    <text>
        (...)
    </text>
 </detail>

Im Beispiel oben wird der Druckbereich nach rechts oben verschoben.

Absolute Positionierung

Bei der absoluten Positionierung wird die genaue Position angegeben, an der ein Druck-Bereich ausgedruckt werden soll.

Die Positionierung erfolgt über das XML-Element position. Dieses Element ist optional. Es muss also nur dann in einem Druckbereich auftauchen, wenn der Druckbereich fix an einer Stelle positioniert werden soll.

Das position-Element benötigt die Attribute x und y. Diese Attribute bestimmen die Position auf der X- und der Y-Achse. Bei positiven x-Werten wird vom linken Rand aus gemessen. Bei negativen x-Werten vom rechten Rand.

Bei positiven y-Werten wird vom oberen Rand aus gemessen. Bei negativen y-Werten vom unteren Rand.

 <pageHead>
   <type>ControlsPrinterData</type>
   <position x="0" y="0"></position>
   <text>
       (...)
   </text>
 </pageHead>

Im Beispiel oben wird der Seitenkopf in der oberen linken Ecke positioniert.

 <pageFoot>
   <type>ControlsPrinterData</type>
   <position y="-80"></position>
   <text>
       (...)
   </text>
 </pageFoot>

Das obige Beispiel positioniert den Seitenfuß 80 Punkte oberhalb vom unteren Seitenrand.

Zusätzliche Seitenränder

Wenn Sie beispielsweise den Seitenfuß absolut am unteren Rand des Ausdruckes positionieren, kann es passieren, dass Detailbereiche, die bis ganz nach unten reichen, in den Seitenfuß ,,hinein drucken”. Um dies zu verhindern kann ein zusätzlicher Seitenrand geschaffen werden, in den normal (fortlaufend untereinander) positionierte Druckbereiche nicht hinein drucken können.

Dieser zusätzlich Seitenrand wird durch das XML-Element margin definiert. Das margin-Element muss sich direkt unterhalb des report-Elements befinden

 <?xml version="1.0" encoding="ISO-8859-1"?>
 <report>
   <margin>
       <!-- Platz am oberen und unteren Rand für die Kopf- und Fußzeile frei halten: -->
       <top>80</top>
       <bottom>80</bottom>
   </margin>
   <areas>
       (...)

Das top-Element bestimmt den Rand von oben. Das bottom-Element bestimmt den Rand von unten.