Um eine einfache Anwendung zu entwickeln, habe ich mich dazu entschlossen die ganze Logik innerhalb eines Reports in verschiedenen Includes unterzubringen. Ich verwende eine Klasse für die Anwendung selbst, eine für das Modell und ein Interface samt implementierender Klasse für das Logging. Letzteres habe ich auch aufgrund der verordneten Einfachheit nicht als BAL o.ä. realisiert, da ich auf Änderung der Systemeinstellungen verzichten möchte. Ich schreibe klassisch die Nachrichten auf den Ausgabebildschirm.
Die erste Aufgabe des Programms ist das Lesen aus dem ZIP-Archiv, das die Testdaten enthält. Die notwendigen Funktionen für das Lesen der Datei vom Frontend befinden sich in der Klasse CL_GUI_FRONTEND_SERVICES. Ich habe zur Auswahl der richtigen Datei die Methode FILE_OPEN_DIALOG und zum Upload der Datei auf den Application Server die Methode GUI_UPLOAD verwendet. Anschließend werden die binären Daten mit der Funktion SCMS_BINARY-TO_XSTRING aufbereitet, um sie als Input für das ZIP-Archiv (CL_ABAP_ZIP) verwenden zu können.
Der erste Schritt ist nun erledigt, das ZIP-Archiv steht in meiner Applikation zur Verfügung. Der nächste Schritt ist es nun, die CSV-Dateien aus dem ZIP in ein internes Datenmodell zu überführen. Die Dateien repräsentieren jeweils eine Geschäftsentität und sind über Schlüssel miteinander verbunden. Aus diesem Grund werden die Dateien nun nacheinander gelesen und in Datenquellen aus dem Modell überführt. Dabei gibt es allerdings eine Schwierigkeit, da die Anzahl und die Reihenfolge der Daten im CSV nicht bei jeder Generierung gleich ist. Wenn Du Dich mit Joe Bloggs schon etwas mehr beschäftigt hast, weißt Du, dass es die Möglichkeit gibt, die Entitäten durch eigene Attribute zu erweitern. Somit kommen je nach Zusammensetzung der Sets immer noch weitere Daten dazu. Als Lösung dieses Problems, erstelle ich zunächst einen Feldkatalog auf Grundlage der Daten. Der Header bestimmt den Feldnamen und die Datenzeilen den Datentyp und die Länge, wobei ich es mir hier einfach mache und nur Strings verwende. Anschließend verwende ich wieder Standardfunktionen. Die Klasse CL_ALV_TABLE_CREATE stellt über die Methode CREATE_DYNAMIC_TABLE eine dynamische interne Tabelle zur Aufnahme der Daten bereit. Den Inhalt bekomme ich über die Methode CSV_TO_STRUCTURE aus der Klasse CL_RSDA_CSV_CONVERTER.