Wie du eine CSV Datei mit ABAP erstellst

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.

Durch einen Erfahrungsaustausch lässt sich viel voneinander lernen. Tauschen Sie sich deshalb jetzt mit Experten auf Ihrem Gebiet aus und erweitern Sie Ihr Netzwerk! Treten Sie jetzt der exklusiven Gruppe von SAP Experten bei.

Der Inhalt des InfoCubes kann vorher mit dem Baustein RSDRI_INFOPROV_READ in eine Tabelle gelesen werden.

Wie du ein Flatfile mit ABAP erzeugst

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.
Inhalt der aktiven Tabelle des DSOs

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.
Werte mit Semikolon getrennt

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.

Flatfile auf dem desktop generieren

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.
Übersicht SAP Verzeichnisse
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.

Datei wird im SAP Verzeichnis angelegt
Der Inhalt der Datei kann direkt eingesehen werden. Drücken Sie dafür auf Anzeige (Taste F2) oder doppelklicken Sie auf die Datei.
Flatfile auf dem Applikationsserver
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.
ABAP Tipps und Tricks

Jetzt anfordern!

* Pflichtfeld
 
Kein SPAM. Ich hasse Spam genau so wie du.

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

8 Kommentare
  1. Jürgen Bohnert
    Jürgen Bohnert sagte:

    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?

    Antworten
  2. Jens Hoyer
    Jens Hoyer sagte:

    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

    Antworten
    • Sam
      Sam sagte:

      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.

      Antworten
      • Sam
        Sam sagte:

        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.

        Antworten
  3. Mareike
    Mareike sagte:

    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?

    Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.