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):





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):



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:

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':



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):



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):



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):



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):



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.



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:


Bemerkungen