Wie du eine CSV Datei mit ABAP erstellst
In diesem Beitrag zeige ich Ihnen, wie Sie mit ABAP eine CSV Datei erstellen können. Dieses Vorgehen kann genutzt werden, um Flatfiles aus Tabellen, DSOs (im Grunde auch nur eine Tabelle) oder InfoCubes zu erstellen.
Der Inhalt des InfoCubes kann vorher mit dem Baustein RSDRI_INFOPROV_READ
in eine Tabelle gelesen werden.
In dem folgenden Beispiel möchten wir den Inhalt des DSOs FIAR_O06
als Flatfile ausgeben. Die Werte in der aktiven Tabelle des DSOs sehen wie folgt aus.
Um diese auszulesen und als CSV Datei auszugeben erstellen wir in der Transaktion SE38
ein Programm mit dem folgenden Code.
REPORT zcreate_csv.
CONSTANTS: lc_separ VALUE ';'. "separator
DATA: lt_output TYPE TABLE OF /bic/afiar_o0600 WITH HEADER LINE,
lt_iout TYPE TABLE OF string,
ls_xout TYPE string,
ls_str TYPE string, "convert P to string, otherwise concatenate is not possible
lv_file LIKE tstrf01-file.
FIELD-SYMBOLS: <fs> type any.
SELECT * INTO TABLE lt_output FROM /bic/afiar_o0600.
LOOP AT lt_output.
CLEAR ls_xout.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE lt_output TO <fs>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF sy-index = 1.
ls_str = <fs>.
ls_xout = ls_str.
ELSE.
ls_str = <fs>.
CONCATENATE ls_xout ls_str INTO ls_xout SEPARATED BY lc_separ.
ENDIF.
ENDDO.
APPEND ls_xout TO lt_iout.
ENDLOOP.
*output auf dem Desktop
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = 'C:\Users\Denis Reis\Desktop\output.csv'
TABLES
data_tab = lt_iout.
*output auf dem Applikationsserver
lv_file = '\\SAPNW73-PC\sapmnt\trans\output.csv'.
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
LOOP AT lt_iout ASSIGNING <fs>.
TRANSFER <fs> TO lv_file.
ENDLOOP.
CLOSE DATASET lv_file.
Zunächst werden alle benötigten Tabellen und Strukturen deklariert. In unserem Fall wollen wir alle Werte als String
konvertieren. Da ansonsten der Befehl CONCATENATE
bei Zahlen fehlschlägt.
Darüber hinaus setzen wir den Separator konstant als Semikolon. Dieser kann bei Bedarf angepasst werden.
CONSTANTS: lc_separ VALUE ';'. "separator
Im nächsten Schritt lesen wir den Inhalt des DSOs (bzw. der aktiven Tabelle) aus.
SELECT * INTO TABLE lt_output FROM /bic/afiar_o0600.
Als wir durch alle Zeilen loopen, adressieren wir mit dem Befehl ASSIGN COMPONENT
die einzelnen Spalten. Anschließend fügen wir sie wieder zusammen, durch einen Semikolon getrennt.
LOOP AT lt_output.
CLEAR ls_xout.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE lt_output TO <fs>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF sy-index = 1.
ls_str = <fs>.
ls_xout = ls_str.
ELSE.
ls_str = <fs>.
CONCATENATE ls_xout ls_str INTO ls_xout SEPARATED BY lc_separ.
ENDIF.
ENDDO.
APPEND ls_xout TO lt_iout.
ENDLOOP.
Nun haben wir alle Werte in der internen Tabelle lt_iout
.
Um diese lokal als Datei zu speichern kann der Funktionsbaustein GUI_DOWNLOAD
benutzt werden. Der folgende Befehl legt die Datei auf meinem Desktop ab.
*output auf dem Desktop
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = 'C:\Users\Denis Reis\Desktop\output.csv'
TABLES
data_tab = lt_iout.
Alternativ können Sie auch die Datei auf dem SAP Applikationsserver ablegen. Die Übersicht der Verzeichnisse mit dem genauen Pfad können Sie in der Transaktion AL11
einsehen.
Mit dem Befehl OPEN DATASET
öffnen wir die Datei und übertragen mit TRANSFER
den Inhalt der Tabelle lt_iout
zeilenweise in die Datei. Anschließend die Datei mit dem Befehl CLOSE DATASET
geschlossen.
lv_file = '\\SAPNW73-PC\sapmnt\trans\output.csv'.
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
LOOP AT lt_iout ASSIGNING <fs>.
TRANSFER <fs> TO lv_file.
ENDLOOP.
CLOSE DATASET lv_file.
Der Inhalt der Datei kann direkt eingesehen werden. Drücken Sie dafür auf Anzeige (Taste F2
) oder doppelklicken Sie auf die Datei.
Hat dir dieser Beitrag geholfen? Hinterlasse einen Kommentar!
Diese ABAP Tricks machen Ihr Leben leichter!
- In meinem Newsletter gebe ich eine Menge Tipps und Kniffe rund um ABAP.
- Die Mini-Tutorials unterstützen Sie dabei, Software in ABAP effizienter zu entwickeln.
- Praktische Anleitungen ermöglichen Ihnen schnelle Erfolge bei der Optimierung Ihrer Arbeit.
- Bei der Anmeldung zu meinem Newsletter erhalten Sie das Buch „ABAP Tipps und Tricks“ als Willkommensgeschenk.

Falls Ihnen dieser Beitrag weitergeholfen hat, wäre es eine sehr nette Anerkennung meiner Arbeit wenn Sie z.B. Ihre Bücher über Amazon bestellen würden. Wenn Sie ein Produkt kaufen, erhalte ich dafür eine Provision. Für Sie ändert sich am Preis des Produktes gar nichts. Ich möchte mich an dieser Stelle jetzt schon für Ihre Unterstützung bedanken.
Weiterfürende Links:
SAP Help – Strukturen komponentenweise zuweisen
SAP Help – Arbeiten mit Dateien auf dem Applikationsserver
SAP Help – Dateischnittstelle
Tolle Lösung!!!
Funktioniert prima. Wird das Programm in eine Prozesskette eingebunden bricht die Kette mit folgendem Error ab:
Fehler im Controlframework (FES 022)
Gibt es dafür eine Lösung?
Freut mich, dass es funktioniert. Würde in ST22 nachschauen wo genau es hackt.
Viele Grüße
Denis
Hallo Denis,
das Coding funktioniert super. Ist es auch möglich den Header der Tabelle in die erste Zeile der csv mit aufzunehmen.
Habe gerade keine gute Idee, wie ich dies umsetzen kann.
Über einen Tipp würde ich mich sehr freuen.
Viele Grüsse
Jens
Hi Jens, von der Tabelle einen Feldkatalog erzeugen:
DATA CT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA LS_FIELDCAT like LINE OF ct_fieldcat .
CALL FUNCTION ‚REUSE_ALV_FIELDCATALOG_MERGE‘
EXPORTING
I_STRUCTURE_NAME = target_tab
CHANGING
ct_fieldcat = ct_fieldcat
* EXCEPTIONS
* INCONSISTENT_INTERFACE = 1
* PROGRAM_ERROR = 2
* OTHERS = 3
.
und bevor du die Daten reinschreibst die Header-Zeile schreiben.
LOOP AT ct_fieldcat into ls_fieldcat .
CONCATENATE ls_xout ls_fieldcat-fieldname INTO ls_xout SEPARATED BY lc_separ.
ENDLOOP.
APPEND ls_xout TO lt_iout.
Hier noch mal als kompletter FuBa:
FUNCTION ZFB_CSV_EXPORT.
*“———————————————————————-
*“*“Lokale Schnittstelle:
*“ IMPORTING
*“ REFERENCE(I_STRUCTURE_NAME) TYPE DD02L-TABNAME
*“ REFERENCE(I_FILENAME) TYPE STRING
*“ TABLES
*“ DATA_TAB
*“ EXCEPTIONS
*“ UNKNOWN_STRUCTURE
*“———————————————————————-
DATA dref_table TYPE REF TO data.
DATA dref_line TYPE REF TO data.
FIELD-symbols: TYPE ANY.
FIELD-symbols: TYPE ANY.
FIELD-symbols: TYPE STANDARD TABLE.
FIELD-SYMBOLS: TYPE STANDARD TABLE.
CONSTANTS: lc_separ VALUE ‚;‘. „separator
DATA: „lt_output TYPE TABLE OF /bic/afiar_o0600 WITH HEADER LINE,
lt_iout TYPE TABLE OF string,
ls_xout TYPE string,
ls_str TYPE string, „convert P to string, otherwise concatenate is not possible
lv_file LIKE tstrf01-file.
DATA filename TYPE string.
* filename = p_file .
DATA ct_fieldcat TYPE slis_t_fieldcat_alv.
DATA ls_fieldcat LIKE LINE OF ct_fieldcat .
CALL FUNCTION ‚REUSE_ALV_FIELDCATALOG_MERGE‘
EXPORTING
i_structure_name = i_structure_name
CHANGING
ct_fieldcat = ct_fieldcat .
IF sy-subrc 0.
raise unknown_structure .
ELSE.
CREATE DATA dref_table like data_tab[].
ASSIGN dref_table->* TO .
* = data_tab .
CREATE DATA dref_line TYPE (i_structure_name).
ASSIGN dref_line->* TO .
LOOP AT ct_fieldcat INTO ls_fieldcat .
IF sy-tabix = 1.
ls_str = ls_fieldcat-fieldname.
ls_xout = ls_str.
ELSE.
CONCATENATE ls_xout ls_fieldcat-fieldname INTO ls_xout SEPARATED BY lc_separ.
ENDIF.
ENDLOOP.
CONCATENATE ls_xout lc_separ INTO ls_xout . „Letztes Seminkolon anhängen
APPEND ls_xout TO lt_iout.
LOOP AT ASSIGNING .
CLEAR ls_xout.
* DO.
LOOP AT ct_fieldcat INTO ls_fieldcat .
ASSIGN COMPONENT ls_fieldcat-fieldname OF STRUCTURE TO .
IF sy-subrc 0.
EXIT.
ENDIF.
IF sy-tabix = 1.
ls_str = .
ls_xout = ls_str.
ELSE.
ls_str = .
CONCATENATE ls_xout ls_str INTO ls_xout SEPARATED BY lc_separ.
ENDIF.
* ENDDO.
ENDLOOP.
CONCATENATE ls_xout lc_separ INTO ls_xout . „Letztes Seminkolon anhängen
APPEND ls_xout TO lt_iout.
ENDLOOP.
CALL FUNCTION ‚GUI_DOWNLOAD‘
EXPORTING
filename = i_filename
TABLES
data_tab = lt_iout
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
IF sy-subrc 0.
* Implement suitable error handling here
ENDIF.
endif.
ENDFUNCTION.
Hallo Sam, vielen Dank für dein Coding. Es funktioniert wunderbar und es hat mir sehr geholfen. Vielen Dank noch einmal.
Hallo,
Ich erstelle in meinem Programm eine CSV-Datei und verschicke diese aus einem Job heraus gezippt per Mail. Ich habe nun schon herausgefunden, wie ich führende Nullen „behalten“ kann (Syntax: …;=“001234″;…). Nun suche ich nach einem Weg, wie ich Zahlen auch als Zahlen exportieren kann, um sie danach in Excel auch als Zahlen anzuzeigen (es sollte möglich sein, die Liste auf- und absteigend nach einem Wert zu sortieren, momentan sortiert Excel von A bis Z, weil das Feld als Textfeld deklariert ist).
Kennt jemand hierfür eine Lösung?
Hi Mareike…
Kuck doch mal ob es hilft, die Datei nicht erst als csv zu exportieren sondern direkt in Excel.
Wie z.B. Lukas hier (http://abapblog.com/articles/tricks/33-create-xlsx-mhtml-file-from-internal-table-in-background)
Den mailversand danach wie hier (http://abapblog.com/articles/tricks/104-send-mail-in-badi-or-user-exit-without-commiting).
Sorry Denis das ich auf andere Seiten verlinke. ;-)