===== Externe Textdatei auslesen =====
==== Anforderung ====
Dann und wann kann es vorkommen, dass Informationen, die eigentlich innerhalb eines Dokuments benötigt werden, nicht im Druckdatenstrom vorhanden sind. Das kann von Dingen wie EMail-Adressen bis hin zu Produktbildern gehen. Manchmal ist es aber vielleicht auch nur eine Textinformation, die fehlt. Natürlich kann man in einer Datenbank eine Tabelle anlegen und diese mit einem ODBC-Feld abfragen. Es geht aber auch ohne Datenbank.
\\
\\
==== Realisierung ====
(p2f) bietet im Rahmen von Feldern innerhalb von Formularen ein sogenanntes ODBC-Feld an. ODBC steht für 'Open Database Connectivity' und beschreibt eine normierte Datenbankschnittstelle (siehe [[wpde>ODBC]]). Im Windows-System können solche ODBC-Schnittstellen angelegt werden.
Aber nicht nur Datenbanken können so abgefragt werden, sondern auch ganz normale - allerdings strukturierte - Textdateien. Als Beispiel soll hier die Artikelliste aus der Beispielinstallation von (p2f) dienen. In dieser Liste sind Artikelnummern ihren Artikelbeschreibungen zugeordnet. Hier ein kleiner Auszug:
2L1001A Kabelset AT 1,0 m
2L1002A Kabelset AT 2,0 m
2L1003A Kabelset AT 3,0 m
2L1001P Kabelset PS/2 1,0 m
2L1002P Kabelset PS/2 2,0 m
2L1003P Kabelset PS/2 3,0 m
USB2AA1 USB Kabel A/A Stecker 1.0 m
USB2AA2 USB Kabel A/A Stecker 2.0 m
USB1AMF USB Verlaengerungskabel 1 m
USB3AMF USB Verlaengerungskabel 3 m
...
Bei der Konfiguration der ODBC-Schnittstelle für eine Textdatei wird zunächst als Treiber der 'Microsoft Text-Treiber (*.txt,*.csv)' ausgewählt. Anschliessend kann man die Datei auswählen, mit der dieser Treiber arbeiten soll. Über die Schaltfläche 'Optionen' kommt man an eine weitere Schaltfläche mit dem Titel 'Textformat definieren...'. Hier verbergen sich die entscheidenden Dialoge, mit denen festgelegt wird, wie die Textdatei zu lesen ist.
{{print2forms:tips:0021-1.png|Formatdefinition 'NUMMER'}}
{{print2forms:tips:0021-2.png|Formatdefinition 'BEZEICHNUNG'}}
Im ersten Bildschirmfoto ist zu sehen, dass ein Feld mit dem Namen 'NUMMER' definiert wird, das die ersten acht Spalten der Textdatei umfasst. Im zweiten Bildschirmfoto wird das Feld mit dem Namen 'BEZEICHNUNG' definiert, welches die nächsten vierzig Spalten belegt.
\\
\\
Zur Demonstration wird die Lieferscheinanwendung aus der (p2f)-Demo herangezogen. Die Indexdatei eines Lieferscheins zeigt, dass die Artikelnummer ab der Zeile mit dem Index 0106810000 ab der elften Spalte zu finden ist. Die Artikelnummern enthalten keine Leerzeichen. Dementsprechend kann das Suchmuster zum Auslesen der Artikelnummer als '.{10}([^ ]+).*' angegeben werden - ab der elften Spalte wird bis zur ersten Leerstelle alles aufgesammelt.
[p2f]134676739
[Client]3.1.0.5720;A$O4ER.XML
[Param]3.0;10.1.17.27
[Time]20.06.13 07:56:04
[Computer]THINKCENTRE3
[User]Volker
[Model]p2f Printer
[Job]Sample 1
[File]1
[Process]ANLAGEN.XML
[0102C10000] 00001/11
[0103390000] 1704
[0103750000] Kunde AG
[0103B10000] Z.Hd. Hr. X. Kunde 347-57897
[0104290000] Kundengasse 19 15595
[0104650000] D-48535 Kundendorf
[0104A10000] Hr. G. Muster
[0105190000] 20.06.2013
[0106810000] 1 L1BL50 Schaltlitze 0,14x50 m blau St 330 0 330
[0106F90000] 2 L1SW500 Schaltlitze 0,14x500 m schw. St 50 0 50
[0107710000] 3 2L1002P Kabelset PS/2 2,0 m St 210 21 189
[0107E90000] 4 USB3AMF USB Verlaengerungskabel 3 m St 170 0 170
[Page]
[End]
Soll in einem Druckdokument eine Artikelnummer um die Artikelbezeichnung (die hier natürlich schon im Dokument steht) ergänzt werden, werden in einem entsprechenden Formular zwei Felder benötigt: ein ODBC-Anfragefeld, um die Artikelnummer auszulesen und dazu die Artikelbezeichnung zu holen, und ein Textfeld, das diese Artikelbezeichnung in der gewünschten Formatierung ausgibt.
Im Beispielformular mit den beiden erwähnten Feldern ist der reguläre Ausdruck im ODBC-Anfragefeld zu sehen. Wichtig ist hier der Bereich im Index. Mit '00[0681-0D11]0000' wird dafür gesorgt, dass alle möglichen Artikelzeilen des Lieferscheins geprüft werden. Das Suchmuster wird somit mehrfach ausgewertet und kann auch mehrfach Treffer finden. Die gefundenen Zeichenketten (die Artikelnummern) werden dann nacheinander in die SQL-Anweisung anstelle des Platzhalters '\Artikelname:1' eingesetzt.
Das Resultat der SQL-Anfrage wird anschliessend im Textfeld verwendet. In der Schablone des Textfeldes wird der Platzhalter '~Artikelname:1' gegen das Abfrageergebnis ersetzt. Darauf zu achten ist, dass hier der Platzhalter mit einer Tilde beginnt - würde auch hier der Backslash benutzt, würde wieder nur die Artikelnummer ausgegeben. Auch hier muss der Index '00[0681-0D11]0000' verwendet werden, damit genausoviele Textpositionen wie SQL-Anfragen ermittelt werden.
{{print2forms:tips:0021-3.png|}}
Um die Funktion dieses Formulars zu kontrollieren, hilft ein Blick in die Ablaufverfolgung des entsprechenden Clients oder Gateways. Hier ein Ausschnitt mit den interessierenden Meldungen:
{{print2forms:tips:0021-4.png|}}
Hier ist schön zu sehen, wie das Suchmuster 5 im Laufe des Dokuments vier Artikelnummern erkennt und das Suchmuster 6 (das nichts aufsammelt) die entsprechenden Positionen für die Textfelder ermittelt. Beim eigentlichen Druck des Formulars werden dann die vier SQL-Anfragen ausgeführt, deren Ergebnisse in der Ablaufverfolgung zu sehen sind. Die letzten zwei Punkte am Ende der Ergebnisse sind übrigens lediglich ein Ersatz für die dort stehenden Steuerzeichen 'Carriage Return' und 'Linefeed' - alle nicht druckbaren Zeichen werden in der Ablaufverfolgung gegen Punkte ersetzt.
\\
\\
==== Bemerkungen ====
* Im Zusammenhang mit (p2f) können ODBC-Konnektoren nur unter dem Tab 'System-DSNs' verwendet werden, da dies die einzigen sind, die von einem als Dienst laufenden Client oder Gateway benutzt werden können.
* Mit einem entsprechenden ODBC-Konnektor lassen auch genauso einfach Excel-Dateien auslesen.
* Mit der Möglichkeit, über den ODBC-Konnektor SQL nutzen zu können, sind natürlich auch ganz andere Dinge machbar. So kann zum Beispiel aus (p2f) heraus externer Speicher benutzt werden, es kann gerechnet werden (!) oder es lässt sich so auch ein externes Journal schreiben (siehe auch [[print2forms:tips:tip20|Protokollierung in einer Datenbank]]).