Elektronischer Rechnungsversand 3/4

Seit nun fast zwei Wochen arbeite ich an meinem Projekt der Entwicklung einer App für den elektronischen Rechnungsversand. Ausgangsbasis dafür sind ein oder mehrere Rechnungsdokumente, die als PDF in einem Verzeichnis vorliegen. Der Dateiname des Dokuments soll dabei mit der Rechnungsnummer übereinstimmen. Ich brauche also Daten zum Verzeichnis und den darin enthaltenen PDF-Dateien. Einige Datenbanken bieten zwar die Möglichkeit mit dem SQL-Befehl CREATE TABLE AS FILETABLE, ein Verzeichnis in einer Tabelle abzubilden. Allerdings muss die Datenbank hierfür auf das entsprechende Zielverzeichnis zugreifen dürfen, ein klassisches Sicherheitsrisiko. Wesentlich schneller, einfacher und sicherer funktioniert das Ganze in DATANAUT, und zwar mit der Datenimport-Funktion, dem Eingangsparameter Datei und Verzeichnis und dem Ausgangsparameter Tabelle in Datenbank. Konfigurierbar ist sogar, dass nur PDF-Dateien berücksichtigt werden sollen. Ein paar Klicks und fertig.

Zu den Funktionen einzelner Prozessschritte einer App, die in DATANAUT in einer Dropdown-Liste ausgewählt werden können, zählt auch der Datencursor. Ein Werkzeug, das ich ebenfalls für meine App benötige.

Datencursor

Wenn Sie sich jetzt - genau wie ich vor ein paar Tagen - fragen, was und wofür das eigentlich ist, folgt hier ein kleiner Erklärungsversuch:

Die Abfrage einer Datenbanktabelle (mit dem SQL-Befehl SELECT) liefert in aller Regel mehrere Ergebnisdatensätze, ebenfalls in Tabellenform. Das erschwert die Weiterverarbeitung. Hier kommt der Datencursor ins Spiel. Er speichert zunächst alle Ergebnisdatensätze zwischen. Spätere Änderungen in der Datenbank (z.B. durch Dritte) haben also keine Auswirkungen auf die Daten im Cursor. Ähnlich wie ein Mauscursor am Computerbildschirm zeigt der Datencursor nun auf eine einzelne Tabellenzeile oder einen vorher definierten Datenbereich, liest nur die darin enthaltenen Daten und gibt diese zur Weiterverarbeitung als Variablen aus. Anschließend wird der nächste Datensatz abgefragt. Dieser Lesevorgang erfolgt Zeile für Zeile in einer Schleife. Wurden alle Ergebnisdatensätze über den Cursor abgefragt, behalten die Variablen die Werte des letzten Datensatzes und der Cursor muss geschlossen werden.

Weil die Ergebnisdatensätze in meiner App für den Rechnungsversand nicht nur abgefragt, sondern auch an eine Schleife übergeben und weiterverarbeitet werden sollen, wird auch hier ein Cursor benötigt.

Da ich bei der Entwicklung meiner App nicht auf bereits existierende Tabellen und Daten zugreifen kann - z.B. erzeugt von einer Software zur Rechnungserstellung im ERP-System - muss ich die zum Testen und erfolgreichen Ausführen meiner App erforderlichen Daten selbst bereitstellen. Die Definition von Datenbanktabellen und Spalten, in denen die Daten liegen sollen, sowie deren Beziehungen zueinander wird als Datenmodellierung bezeichnet. Für meine App brauche ich z.B. eine Tabelle mit Kunden- und eine weitere mit Rechnungsdaten. Damit die Daten dieser zunächst voneinander unabhängigen Tabellen miteinander verknüpft werden können, brauchen sie ein gemeinsames Merkmal. In diesem Fall steht in beiden Tabellen die Kundennummer. Damit sich die Kundennummer in der Rechnungstabelle auch auf eine tatsächlich existierende Kundennummer (in der Kundentabelle) bezieht, werden die Attribute Primär- und Fremdschlüssel vergeben.

Mein Datenmodell ist inzwischen fertig und die Tabellen sind mit ein paar Daten gefüttert, in der nächsten Woche folgen noch die letzten Schritte der App-Entwicklung in DATANAUT sowie der Entwurf eines Lösungsflyers.

Bis dahin
Florian Hartmann