Was macht dieser Import-Service?
Der Import-Service index-from-db liest einen eindeutigen Datenbankschlüssel aus dem Dateinamen eines zu archivierenden Dokuments. Anschließend greift er mit diesem Schlüssel auf eine Datenbanktabelle zu, um die Index-Feldwerte zu ermitteln.
Installation
Kopieren Sie folgende Dateien in das Unterverzeichnis customisation\importservices des Archiv-Installationsverzeichnisses:
index-from-db.pyindex-from-db.ini
Im folgenden wird der Importservice anhand eines Beispiels für Ausgangsrechnungen beschrieben.
hotfolder.ini
Der Eintrag in der hotfolder.ini für das Verzeichnis D:\Hotfolder und ein Archiv für Ausgangsrechnungen sieht folgendermaßen aus:
[ausgangsrechnungen]
Directory=D:\Hotfolder
Type=importservice
Filemask=AR*.pdf
Module=index-from-db
Archive=ausrech
index-from-db.ini
In der index-from-db.ini muss eine ODBC-Datenbank hinzugefügt werden, die von der index-from-db.py zum extrahieren der Feldwerte benutzt wird.
Die Einträge UID und PWD sind optional, falls sie in der DSN selbst bereits eingetragen sind. Die ODBC-Datenquelle muss ein 64-Bit-ODBC-Treiber sein.
[Database]
DSN = FIREBIRD_DSN
UID = user
PWD = password
Die Sektion, die den Importvorgang steuert, muss den gleichen Namen haben, wie die zugehörige Sektion in der hotfolder.ini, in unserem Beispiel also [ausgangsrechnungen].
Der Eintrag key beschreibt mit einem Teilstring oder einem regulären Ausdruck, wie sich der eindeutige Schlüssel des Datensatzes aus dem Dateiname bildet.
Ein Teilstring wird in eckigen Klammer festgelegt, also z.B. [10, 13] für das 10. - 12. Zeichen. (Dies ist die Slicing-Notation der Programmiersprache Python).
Reguläre Ausdrücke werden mit # geklammert. Der key muss dabei die erste Gruppe (= erste Klammer) im regulären Ausdruck sein. Eine zweite Möglichkeit ist eine benannte Gruppe mit dem Namen “result”, also (?P…)
Beispiel mit dem regulären Ausdruck weiter unten:
Dateiname=`AR12345.pdf` --> key=`12345`
Der Eintrag sql beschreibt die SQL-Abfrage, mit der die Indexwerte aus einer Datenbanktabelle ermittelt werden.
Der Platzhalter {key} steht dabei für die im Eintrag key beschriebene id.
[ausgangsrechnungen]
key=#AR([0-9]*).pdf#
sql=SELECT belegnr, belegdatum, lieferant, nummer FROM erp_belege WHERE belegnr = {key}
In der Sektion [/fields] wird die Zuordnung zwischen den Feldnamen (Kurzname) des Archives und den SQL-Spalten beschrieben. Falls ein fester Wert statt eines Feldwertes verwendet werden soll, muss dieser Wert in Anführungszeichen gesetzt werden (Im Beispiel dokart="AR").
[ausgangsrechnungen/fields]
; <Feldname Archiv>=<Spaltenname SQL>
dokart="AR"
doknr=belegnr
beldat=belegdatum
name=lieferant
konto=nummer
SQL-Log
In der Sektion [/url] kann eine SQL-Abfrage definiert werden, mit der Dokumenten-ID in eine SQL-Tabelle geschrieben wird.
Dies kann sinnvoll sein, um es z.B. einem ERP-System zu ermöglichen den archivierten Beleg aufzurufen.
Der Platzhalter {key} steht für die im Eintrag key beschriebene eindeutigen Schlüssel. Der Platzhalter {id} steht für die im Archiv-ID des Dokumentes.
In dem Beispiel wird die gesamte URL des archivierten Belegs übergeben.
Diese Sektion ist optional.
[ausgangsrechnungen/url]
sql=INSERT INTO urls (belegnr, url) VALUES ({key}, 'localhost:5000/?attachment=' || '{id}')
Datei-Log
In [/log] kann eine Logausgabe definiert werden, die das Ergebnis der Archivierung in eine Datei sichert.
Der Aufbau der Ausgabe-Datei muss dabei über eine Template-Datei selbst definiert werden:
[ausgangsrechnungen/log]
filename = D:\Log\{record_id}-{_order}-{timestamp}.csv
template = index-from-db-template.csv
mode = write
encoding = utf-8
Die Parameter filename und template sind Pflicht. filename gibt die Ausgabedatei an, in die das Ergebnis der Archivierung geschrieben werden soll.
filename
Wenn kein absoluter Pfad in filename angegeben wird, ist dieser Pfad relativ zum Verzeichnis, in dem die index-from-db.py liegt. filename kann durch in geschweiften Klammern angegebene Parameter dynamisch erzeugt werden:
{record_id}ist die ID des erzeugten Vorgangs.{timestamp}ist eine Ganzahl, die die Unixzeit in Millisekunden enthält.Auf die Indexdaten des archivierten Vorgangs kann über den mit einem Unterstrich vorangestellten Kurznamen zugegriffen werden, z.B.
{_order}für das Feld mit dem Kurznamen “order”. In Dateinamen nicht erlaubte Zeichen werden infilenamedurch einen Unterstrich ersetzt.
template
template gibt den Namen der Template-Datei an, die im gleichen Verzeichnis wie die index-from-db.py liegen muss.
Diese Datei verwendet das jinja2-Format, Variablen werden dabei in doppelten geschweiften Klammern angegeben, Schleifen etc. sind ebenfalls möglich.
Templates müssen im UTF-8-Encoding geschrieben werden.
Das folgende Beispiel generiert eine einzeilige CSV-Datei:
order;{{ metadata['_order'] }};{{ url }}?attachment={{ record['attachments'][0]['id'] }};;OK;Ablieferbeleg
metadata enthält die Werte der Index-Daten, in diesem Fall wird der Wert aus der Spalte mit dem Kurznamen order verwendet.
Über das record-Dictionary kann auf sämliche Werte des archivierten Vorgangs zugegriffen werden, in diesem Fall wird beispielsweise noch die ID des ersten Dokuments für das Erzeugen der URL verwendet.
mode
mode gibt an, wie die Ausgabedatei geöffnet werden soll. Der Wert write öffnet eine neue Datei bzw. überschreibt eine vorhandene.
Mit append kann die Ausgabe aber auch an eine bestehende Datei angehängt werden. Die Voreinstellung ist write.
encoding
Gibt an, in welchem Encoding die Ausgabedatei geschrieben werden soll. Der Standard ist utf-8, für das ISO-8859-1-Encoding sollte hier latin1 angegeben werden.
