Vor kurzem erhielt ich die Anfrage eines Kunden: Wie kann man eine Db2-Datei von der IBM i als CSV-Datei ins IFS übertragen und dabei beliebige Spaltenüberschriften wählen?
Die zu lösende Aufgabe
Die Übertragung einer kompletten Datei als CSV-Datei ins IFS kann mit dem CL-Befehl CPYTOIMPF erfolgen. Als Überschrift für die einzelnen Spalten kann entweder *SYS oder *SQL ausgewählt werden. Wie kann man auch andere Texte als Spaltenüberschriften verwenden?
Vorgehensweise
Zunächst wird mit DDS eine Datei erstellt. Dabei werden die verschiedenen Möglichkeiten von Texten implementiert, die dann als Spaltenüberschriften genutzt werden können.
Die so erstellte Datei wird mit SQL weiter bearbeitet und Kommentare für die Spalten hinzugefügt.
Im nächsten Schritt wird der CL-Befehl CPYTOIMPF analysiert und gezeigt, welche Überschriften zum Einsatz kommen können.
Hier stellt sich dann die Frage, ob es andere Möglichkeiten für Spaltenüberschriften gibt, als die bei CPYTOIMPF verfügbaren. Dazu wird zunächst gezeigt, wie man für eine Datei oder Tabelle mit dem Systemkatalog QSYS2.SYSCOLUMNS die Spaltenbezeichnungen auswählen kann.
We können diese Spalten dann als Überschrift für eine CSV-Datei verwendet werden? Dazu kommt nun die SQL-Funktion zum LISTAGG Einsatz.
Dieses Konstrukt kann nun verwendet werden, um als Überschrift in eine CSV-Datei übertragen zu werden. Dazu stellt SQL eine Stored Procedure QSYS2.IFS_WRITE zur Verfügung.
Danach erfolgt die Ausführung des CL-Befehls CPYTOIMPF.
Zum Testen des aktuellen Inhaltes der CSV-Datei kann SQL mit einer Tabellen-Funktion eingesetzt werden: QSYS2.IFS_READ.
Zu guter Letzt werden die einzelnen Schritte in einem CL-Programm zusammengefasst.
Datei CSVDat mit DDS erstellen
Als Beispiel wird die Datei CSVDAT mit folgender DDS erstellt:

Die möglichen Überschrifts-Arten wurden beim FELD1 mit den Schüsselwörtern TEXT, COLHDG und ALIAS hinzugefügt. Bei den Feldern FELD2 und FELD3 wird nur das Schlüsselwort TEXT verwendet.
Nach dem Hinzufügen von einigen Sätzen erhält man bei der Ausführung mit verschiedenen Varianten folgende Ergebnisse:

In diesem Beispiel wird für die erste Spalte als Überschrift der Wert von COLHDG und für die anderen Spalten, für die kein COLHDG angegeben wurde, der Wert von TEXT als Überschrift eingesetzt.
Für die Ausführung mit IBM i ACS kann über die Vorgaben eingestellt werden, welche Spaltenüberschriften angezeigt werden sollen:

Die Ausführung mit IBM i ACS und Run SQL Scripts liefert das folgende Ergebnis:

Hier werden dieselben Werte wie im Beispiel zuvor eingesetzt und zusätzlich bei der ersten Spalte der Wert von ALIAS.
Datei CSVDat mit SQL weiter bearbeiten
Für die mit DDS erstellte Datei kann man eine SQL-Anweisung generieren lassen, mit der eine Datei bzw. Tabelle mit denselben Eigenschaften erzeugt werden kann.
Bei Dateien oder Tabellen, die mit SQL bearbeitet werden, gibt es noch die Möglichkeit, einen Kommentar für jede Spalte anzugeben. Dies ist mit DDS nicht möglich.
Mit der folgenden Anweisung werden Kommentare für die drei Spalten hinzugefügt, die dann auch als Spaltenüberschrift verwendet werden können. (Diese Wert fehlt übrigens beim Ändern der Definition mit ACS.)
COMMENT ON COLUMN TKLLIB.CSVDAT
( ALIASNAME_FUER_F1 IS ‘comment1’ ,
FELD2 IS ‘comment2’ ,
FELD3 IS ‘comment3’ ) ;
Hinweis:
Die Generierung einer SQL-Anweisung für eine mit SQL erstellte Tabelle oder auch für eine mit DDS erstellte Datei kann mit der SQL Stored Procedure QSYS2.GENERATE_SQL erfolgen.
— Generierung mit Stored Procedure
CALL QSYS2.GENERATE_SQL (
DATABASE_OBJECT_NAME => ‘CSVDAT’,
DATABASE_OBJECT_LIBRARY_NAME => ‘TKLLIB’,
DATABASE_OBJECT_TYPE => ‘TABLE’);
Der CL-Befehl CPYTOIMPF
Die Übertragung einer Datei ins IFS kann mit dem CL-Befehl CPYTOIMPF erfolgen. Alternativ dazu kann dies auch mit dem Befehl CPYTOSTMF ausgeführt werden. Hier wird nur der CL-Befehl CPYTOIMPF verwendet.
Für eine erfolgreiche Durchführung sind vor allem folgende Parameter wichtig:
- Datenstromdatei-CCSID . . . . . STMFCCSID
Mit dem Wert *PCASCII wurden hier die besten Erfahrungen für die Umsetzung von EBCDIC in ASCII gemacht - Feldbegrenzer . . . . . . . . . FLDDLM
Im deutschen Sprachraum ist es hier erforderlich, ein Semikolon ‘;‘ enzutragen und kein Komma!
Weiterhin besteht die Möglichkeit anzugeben, ob Spaltennamen als Überschrift hinzugefügt werden sollen. Dies wird über den Parameter ADDCOLNAM gesteuert. Folgende Werte sind möglich:
- *NONE – keine Spaltennamen
- *SYS – Die Systemspaltennamen werden hinzugefügt
- *SQL – Die SQL-Spaltennamen werden hinzugefügt
In unserem Fall mit der oben erstellten Datei ergibt sich das folgende Ergebnisse:


Aus diesen beiden ist zu erkennen, daß die beiden mit TEXT, COLHDG und COMMENT definierten Spalten mit dem CL-Befehl nicht aktivierbar sind. Wie dies dennoch realisierbar ist, wird im folgenden CL-Programm gezeigt.
Weitere Infos zu CPYTOIMPF:
https://www.ibm.com/docs/en/i/7.3?topic=ssw_ibm_i_73/cl/cpytoimpf.html
https://www.ibm.com/support/pages/cpytoimpf-and-cpyfrmimpf-examples
Und jetzt alles in einem CL-Programm:

Verwendete Features
In diesem Artikel wurden die folgenden Features verwendet:
o DDS - externe Dateibeschreibung
o CRTPF – Datei mit DDS erstellen
o CREATE OR REPLACE TABLE – Tabelle mit SQL erstellen
o QSYS2.GENERATE_SQL – SQL Stored Procedure
o COMMENT ON COLUMN – SQL-Anweisung
o CPYTOIMPF – CL-Befehl
o QSYS2.SYSCOLUMNS – Systemkatalog Spalten
o LISTAGG – SQL Aggregatfunkton
o QSYS2.IFS_WRITE – SQL Stored Procedure
o QSYS2.IFS_READ – SQL Tabellenfunktion
Vorschau:
Im nächsten Artikel wird das CL-Programm erweitert und flexibler gestaltet. Die einzelnen Schritte werden detailliert beschrieben.
Bis dahin wünsche ich Ihnen weiterhin viel Spaß beim Vermehren Ihrer Fertigkeiten.
Der Autor Theo Bär schreibt regelmäßig für den TechKnowLetter.
Sie erreichen ihn unter
EDV-Beratung Theo Bär
Ringmauerweg 1
69250 Schönau
Tel.: (+49) 6228 912 630
E-Mail: [info@edv-baer.com]
Sechs Ausgaben des TechKnowLetters erhalten Sie hier für 88 Euro.