===== Länge eines Tabellenrahmens an Nutzdaten angepassen =====
\\
==== Anforderung ====
In einem Dokument befindet sich eine Tabelle mit einer unterschiedlichen Anzahl an Tabellenzeilen. Es soll eine Tabellenumrandung erzeugt werden, die sich an die Anzahl der Zeilen anpasst.
Grundlage für ein erstes Beispiel ist das Formular '**Angebot einzelne Seite variable Tabelle**' aus der Beispielinstallation. Das gewünschte Ergebnis soll in etwa wie folgt aussehen (Ausschnitte):
\\
\\
{{print2forms:tips:0008-1.GIF}}
\\
\\
{{print2forms:tips:0008-2.GIF}}
\\
\\
==== Realisierung ====
Um den Tabellenrahmen in der Länge an die Nutzdaten anpassen zu können, muß der Rahmen in zwei Teile zerlegt werden: den Tabellenkopf mit den Beschreibungen der Spalten, und in einen nach oben offenen Rahmen, der eine Tabellenzeile begrenzt. Der Tabellenkopf befindet sich in einer Ressource mit dem Namen '**Tabellenkopf**' im Subcontainer '**Angebot mit variabler Tabelle**' und hat folgendes Aussehen (die übrigen Bestandteile des Angebotsformulars wurden hier gleich mit aufgenommen):
\\
\\
{{print2forms:tips:0008-3.GIF}}
\\
\\
Der Tabellenrahmen befindet sich in einer Ressource mit dem Namen '**Tabellenrahmen**' und ist ebenfalls im Subcontainer '**Angebot mit variabler Tabelle**' abgelegt. Sein Aussehen ist wie folgt:
\\
\\
{{print2forms:tips:0008-4.GIF}}
Im Formular '**Angebot einzelne Seite variable Tabelle**' muß jetzt dafür gesorgt werden, daß zunächst der Tabellenkopf einmal gedruckt wird, und dann für jede Tabellenzeile ein Rahmen hinzugefügt wird. Die Ressource '**Angebot mit variabler Tabelle/Tabellenkopf**' wird einfach als '**Formular Ressource**' aufgenommen, was hier möglich ist, da alle sonstigen Bestandteile des Formulars mit aufgenommen wurden. Für das mehrfache Zeichnen des Tabellenrahmens ist es natürlich notwendig, die Tabellenzeilen zu erkennen. Dies leistet das Ressourcenfeld '**Tabellenrahmen**':
\\
\\
{{print2forms:tips:0008-5.GIF}}
\\
\\
Eine Tabellenreihe ist daran zu erkennen, daß eine Positionsnummer innerhalb der Tabelle vergeben wurde. Diese ein- oder zweistellige Positionsnummer wird mit dem Vergleichsmuster ' **.# @.***' und dem Feldindex '**01????0000**' gesucht. Zur Verdeutlichung hier ein Ausschnitt aus der Indexdatei des Beispieldatenstroms, der die Tabelle zeigt:
...
[0106450000] 1 SK20F1 Scart Kabel, high quality 9.99€ 8.88€ 7.77€
[0106810000] 1 x Scartstecker auf 1 x Scartstecker (21 pin),
[0106AE0000] transparentes Kabel mit vergoldeten Kontakten,
[0106DB0000] 4 x 0.14 mm² abgeschirmt (Audio), 6 x 75 Ohm
[0107080000] RG59 (Video), Länge 2 m, VPE 10 Kabel
[0108070000] 2 SK20HQT Scart-Flachkabel 9.99€ 8.88€ 7.77€
[0108430000] Stecker auf Stecker, 21 polig belegt, 1 m
[0108700000] VPE 25 Kabel
[0109C90000] 3 SV3 Scart Verteiler 99.99€ 88.88€ 77.77€
[010A050000] Vollständig beschaltet für den Anschluß von 3
[010A320000] Geräten, alle Buchsen parallel geschaltet
[010A5F0000] VPE 1 Verteiler
[010B8B0000] 4 AVS1020 Video-Kabel Scart auf Cinch 9.99€ 8.88€ 7.77€
[010BC70000] 1 x Scartstecker auf 3 x Cinchstecker, 2 x
[010BF40000] 0.14 mm² abgeschirmt (Audio), 1 x 75 Ohm
[010C210000] RG 59 (Video), Länge 1 m, VPE 100 Kabel
[Page]
...
Der Teilausdruck ' **.# @**' erkennt die fünf oder sechs Leerstellen am Zeilenanfang, die ein- oder zweistellige Positionsnummer, drei weitere Leerstellen und den ersten Buchstaben der Artikelbezeichnung. Damit ist sichergestellt, daß keine andere Zeile erkannt wird. Am Ende des Vergleichsmusters steht ein '**.***', um den Rest der Zeile zu überspringen. Ein Vergleichsmuster wird immer gegen die gesamte Zeile geprüft. Im Beispiel werden auf diese Weise insgesamt vier Zeilen gefunden.
Mit der Angabe '**Angebot mit variabler Tabelle/Tabellenrahmen**' als Wert für den Parameter '**Fixe Ressource**' wird dann für jede der vier Fundstellen der eigentliche Tabellenrahmen gedruckt. Da bereits in der Ressource '**Tabellenrahmen**' durch Angabe korrekter Offsets dafür gesorgt wurde, daß die Positionierung relativ zum Tabellenkopf stimmt, ist im Ressourcenfeld selbst keine weitere Positionierung notwendig. Allerdings sorgt die Angabe '**Relativ zum Feld**' dafür, daß der Rahmen mit verschoben wird, wenn das gesamte Formular '**Angebot einzelne Seite variable Tabelle**' verschoben wird.
Mit diesem einzelnen Ressourcenfeld wird bereits das in der Anforderung abgebildete Ergebnis erzeugt.
\\
Das bisherige Beispiel beschreibt den einfachen Fall, daß jede Tabellenreihe gleich hoch ist. Der Fall unterschiedlich hoher Tabellenreihen erfordert eine etwas komplexeres Vorgehen. Im hier gewählten Beispiel kommt sogar noch hinzu, daß die erste Artikelzeile optisch hervorgehoben werden soll.
Um das gewünschte Ziel zu erreichen, muß die Tabelle in vier Teile zerlegt und in vier eigenen Ressourcen abgelegt werden. Wie beim bisherigen Vorgehen auch, enthält der erste Teil der Tabelle den (nach unten offenen) Tabellenkopf (sowie die sonstigen fixen Bestandteile des Formulars). Die Ressource ist unter dem Namen '**Tabellenkopf**' im Subcontainer '**Lieferschein mit variabler Tabelle**' abgelegt und sieht wie folgt aus (Ausschnitt):
\\
\\
{{print2forms:tips:0008-7.GIF}}
\\
\\
Für die Hervorhebung der ersten Artikelzeile wird ein mit grau hinterlegter nach unten offener Rahmen benötigt, der unter dem Namen '**Tabellenrahmen erste Zeile**' im Subcontainer '**Lieferschein mit variabler Tabelle**' abgelegt ist. Der Rahmen sieht wie folgt aus (Ausschnitt):
\\
\\
{{print2forms:tips:0008-8.GIF}}
\\
\\
Für die weiteren Artikelzeilen benötigen wir eine Ressource, in der lediglich die senkrechten Linien innerhalb der Tabelle verlängert werden. Hierbei ist eine Besonderheit zu beachten. Da im Nutzdatenstrom zwischen den einzelnen Artikelzeilen zur Abgrenzung vertikale Zwischenräume erzeugt wurden, und auf diese Zwischenräume nicht geprüft werden kann, ergibt sich das Problem, wie die vertikalen Linien der Tabelle in diesem Bereich gezeichnet werden sollen.
Eine Lösung dieses Problems besteht darin, die vertikalen Linien in der Ressource '**Tabellenrahmen weitere Zeilen**' so lang zu machen, daß sie den Leerraum überbrücken (auch den Leerraum am Ende der Tabelle!). Die ebenfalls im Subcontainer '**Lieferschein mit variabler Tabelle**' abgelegte Ressource hat dann folgendes Aussehen (Ausschnitt):
\\
\\
{{print2forms:tips:0008-9.GIF}}
\\
\\
Als Letztes benötigen wir noch eine Abschlußlinie, die unsere Tabelle nach unten hin abschließt. Die Ressource ist unter dem Namen '**Tabellenrahmen Abschluß**' im Subcontainer '**Lieferschein mit variabler Tabelle**' abgelegt und sieht wie folgt aus (Ausschnitt):
\\
\\
{{print2forms:tips:0008-10.GIF}}
\\
\\
Um die Teile des Tabellenrahmens korrekt zu positionieren, benötigen wir drei Ressourcenfelder - die vierte Ressource '**Tabellenkopf**' wird als '**Formular Ressource**' angegeben. Diese Ressourcenfelder sind in einem Formular mit dem Namen '**Einzelne Seite mit variabler Tabelle**' enthalten.
\\
\\
{{print2forms:tips:0008-11.GIF}}
\\
\\
Das erste Ressourcenfeld '**Erste Zeile Artikel**' sucht mit dem Feldindex '**01????0000**' und dem Vergleichsmuster ' **[ 0-9]# @.***' nach den Zeilen mit den Positionsnummern, und druckt dann an allen Fundstellen (sechs Stück) mit einem vertikalen Versatz von '**-1,70 cm**' die Ressource '**Tabellenrahmen erste Zeile**' aus dem Subcontainer '**Lieferschein mit variabler Tabelle**'. Der vertikale Offset kommt dadurch zustande, daß als Position der Fundstelle die Grundlinie des gefundenen Textes angenommen wird, und dadurch, daß der Rahmen in der Ressource einen Versatz zum oberen Rand hat. Der Bezugspunkt einer Ressource ist die linke obere Ecke des Blattes, auf dem sie importiert wurde (eine Positionierung direkt in der linken oberen Ecke des Blattes ist nicht möglich, weil die beim Importieren verwendeten Druckertreiber von einem undruckbaren Rand des realen Druckers ausgehen, und Ausgaben innerhalb des Randbereichs unterdrücken).
Zum besseren Verständnis der Arbeitsweise dieses und der weiteren noch benötigten Vergleichsmuster ist hier ein Ausschnitt aus der Indexdatei des Beispieldatenstroms abgebildet:
...
[0106810000] 1 SK20HQT Scart Kabel, high quality St 230 0 230
[0106BD0000] 1 x Scartstecker auf 1 x Scartstecker (21 pin),
[0106EA0000] transparentes Kabel mit vergoldeten Kontakten,
[0107170000] 4 x 0.14 mm² abgeschirmt (Audio), 6 x 75 Ohm
[0107440000] RG59 (Video), Länge 2 m
[0107DA0000] 2 SK20F1 Scart-Flachkabel St 160 0 160
[0108160000] Stecker auf Stecker, 21 polig belegt, 1 m
[0108AC0000] 3 SV3 Scart Verteiler St 10 0 10
[0108E80000] Vollständig beschaltet für den Anschluß von 3
[0109150000] Geräten, alle Buchsen parallel geschaltet
[0109AB0000] 4 AVS1020 Video-Kabel Scart auf Cinch St 160 0 160
[0109E70000] 1 x Scartstecker auf 3 x Cinchstecker, 2 x
[010A140000] 0.14 mm² abgeschirmt (Audio), 1 x 75 Ohm
[010A410000] RG 59 (Video), Länge 1 m
[010AD70000] 5 AV3030 Video-Kabel Cinchstecker St 260 0 260
[010B130000] 3 x Cinchstecker auf 3 x Cinchstecker, 2 m
[010BA90000] 6 HC7502 AV-Kabel S-VHS/Cinch - Scart St 20 5 15
[010BE50000] 4 pol. S-VHS-Stecker / 2 Cinchstecker nach
[010C120000] Scartstecker, verchromte Metallstecker, vergol-
[010C3F0000] dete Kontakte, High Quality, molded
...
Das Ressourcenfeld '**Weitere Zeilen Artikel**' sorgt mit dem Feldindex '**01????0000**' und dem Vergleichsmuster ' **{19}[A-Za-z0-9].***' nun dafür, daß die weiteren Zeilen zur Beschreibung des Artikels gefunden werden. Dabei wird davon ausgegangen, daß die Zeile mit 19 Leerstellen beginnt und das erste Zeichen der Beschreibung ein Buchstabe oder eine Ziffer ist. Der Rest der Beschreibung ist ohne Interesse.
An allen Fundstellen (vierzehn Stück) wird dann mit einem vertikalen Versatz von '**-1,50 cm**' die Ressource '**Tabellenrahmen weitere Zeilen**' aus dem Subcontainer '**Lieferschein mit variabler Tabelle**' gedruckt. Bezüglich des vertikalen Versatzes gilt das beim vorherigen Feld Gesagte.
Für den Druck der Abschlußlinie ist das dritte Ressourcenfeld mit dem Namen '**Abschlußlinie**' zuständig. Auch hier wird mit dem Feldindex '**01????0000**' und dem Vergleichsmuster ' **{19}[A-Za-z0-9].***' nach den weiteren Artikelzeilen gesucht. Der entscheidende Unterschied zum vorherigen Feld ist aber, daß durch die Positionierung '**Relativ zum letzten Feld**' nur einmal die Ressource '**Tabellenrahmen Abschluß**' aus dem Subcontainer '**Lieferschein mit variabler Tabelle**' gedruckt wird. Dadurch entsteht genau eine Abschlußlinie und man erhält als Resultat die fertige Tabelle:
\\
\\
{{print2forms:tips:0008-6.GIF}}
\\
==== Bemerkungen ====
* Beim letzten Beispiel ist klar, daß durch die langen Linien in der Ressource '**Tabellenrahmen weitere Zeilen**' ein mehrfaches Übereinanderdrucken des Tabellenrandes stattfindet. Dies hat aber auf das Druckbild keine Auswirkung.
* Die Abschlußlinie könnte natürlich auch mit einem Linienfeld direkt erzeugt werden.
* Eine weitere Lösung des Problems des Zeichnens der vertikalen Linien im Leerraum zwischen den Artikelbeschreibungen bestände darin, in der Ressource für die erste Artikelzeile und in der Ressource für die Abschlußlinie die vertikalen Linien nach oben (!) zu verlängern. Die vertikalen Linien im Tabellenkopf könnten dann entfallen oder würden überdruckt werden.
* Im (p2f)-System gibt es einen Automatismus, der dafür sorgt, daß bei mehrfach erfüllten Bedingungen die zugehörigen Aktionen mehrfach ausgeführt werden. In diesem Beispiel wurde das dazu benutzt, eine von den Nutzdaten abhängige Anzahl von einzelnen Rahmen zu drucken.
* Die Ausdrucke zum Austesten dieses Beispiels wurden mit Hilfe des beim (p2f) mitgelieferten Programms 'Beispielprogramm' erstellt. Dazu wurde für die Tabelle mit fester Reihenhöhe das Beispiel '**Angebot mit variabler Tabelle**' benutzt.
* Um das Beispiel für Tabellen mit variabler Reihenhöhe auszuprobieren, muß man zunächst im Prozess '**Lieferschein einzelne Seite mit variabler Tabelle**' in der Seitenfolge den Wert für '**Formular**' von '**Einzelne Seite mit Tabelle ohne Reihen**' auf '**Einzelne Seite mit variabler Tabelle**' ändern. Anschließend kann mit dem Beispiel '**Lieferschein mit variabler Tabelle**' aus dem 'Beispielprogramm' der hier beschriebene Druck der variabel langen Lieferscheintabelle erfolgen.