Dateioperationen ermöglichen das Lesen und Schreiben von Dateien auf dem SAP-Applikationsserver. Die Befehle OPEN DATASET, READ DATASET, TRANSFER und CLOSE DATASET bilden die Grundlage für Dateiverarbeitung in ABAP.
Grundbefehle
Befehl Beschreibung OPEN DATASETDatei öffnen READ DATASETDaten aus Datei lesen TRANSFERDaten in Datei schreiben CLOSE DATASETDatei schließen DELETE DATASETDatei löschen
Syntax
Datei öffnen
FOR { INPUT | OUTPUT | APPENDING | UPDATE }
IN { TEXT MODE | BINARY MODE | LEGACY TEXT MODE }
[ ENCODING { DEFAULT | UTF-8 | NON-UNICODE } ]
[ WITH { SMART | NATIVE | UNIX | WINDOWS } LINEFEED ]
Datei lesen/schreiben
READ DATASET <dateiname> INTO <daten> [ LENGTH <länge> ].
TRANSFER <daten> TO <dateiname> [ LENGTH <länge> ].
Datei schließen/löschen
CLOSE DATASET <dateiname>.
DELETE DATASET <dateiname>.
Beispiele
1. Textdatei schreiben
DATA : lv_file TYPE string VALUE '/tmp/output.txt' ,
" Datei zum Schreiben öffnen
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
TRANSFER 'Zeile 1: Hallo Welt' TO lv_file.
TRANSFER 'Zeile 2: ABAP ist toll' TO lv_file.
TRANSFER 'Zeile 3: Ende der Datei' TO lv_file.
WRITE : / 'Datei erfolgreich geschrieben' .
WRITE : / 'Fehler:' , lv_message.
2. Textdatei lesen
DATA : lv_file TYPE string VALUE '/tmp/input.txt' ,
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
READ DATASET lv_file INTO lv_line.
WRITE : / 'Datei konnte nicht geöffnet werden' .
3. Datei in Tabelle einlesen
DATA : lv_file TYPE string VALUE '/tmp/data.txt' ,
lt_lines TYPE TABLE OF string .
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING UTF-8 .
READ DATASET lv_file INTO lv_line.
APPEND lv_line TO lt_lines.
WRITE : / 'Gelesene Zeilen:' , lines ( lt_lines ).
4. Tabelle in Datei schreiben
DATA : lv_file TYPE string VALUE '/tmp/export.txt' ,
lt_lines TYPE TABLE OF string .
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8 .
LOOP AT lt_lines INTO DATA (lv_line).
TRANSFER lv_line TO lv_file.
WRITE : / 'Exportiert:' , lines ( lt_lines ), 'Zeilen' .
5. CSV-Datei verarbeiten
TYPES : BEGIN OF ty_customer,
DATA : lv_file TYPE string VALUE '/tmp/customers.csv' ,
lt_customers TYPE TABLE OF ty_customer,
lt_fields TYPE TABLE OF string .
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING UTF-8 .
READ DATASET lv_file INTO lv_line.
READ DATASET lv_file INTO lv_line.
SPLIT lv_line AT ';' INTO TABLE lt_fields.
IF lines ( lt_fields ) >= 3 .
APPEND VALUE ty_customer(
age = CONV #( lt_fields[ 2 ] )
LOOP AT lt_customers INTO DATA (ls_cust).
WRITE : / ls_cust-name, ls_cust-age, ls_cust-city.
6. CSV-Export erstellen
DATA : lv_file TYPE string VALUE '/tmp/export.csv' ,
DATA : lt_orders TYPE TABLE OF ty_order.
( id = 1 customer = 'Müller' amount = '100.50' )
( id = 2 customer = 'Schmidt' amount = '250.00' )
( id = 3 customer = 'Weber' amount = '75.25' )
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8 .
TRANSFER 'ID;Kunde;Betrag' TO lv_file.
LOOP AT lt_orders INTO DATA (ls_order).
lv_line = |{ ls_order-id } ; { ls_order-customer } ; { ls_order-amount }| .
TRANSFER lv_line TO lv_file.
7. Binärdatei lesen
DATA : lv_file TYPE string VALUE '/tmp/image.png' ,
lv_buffer TYPE x LENGTH 1024 ,
OPEN DATASET lv_file FOR INPUT IN BINARY MODE .
READ DATASET lv_file INTO lv_buffer LENGTH lv_length.
CONCATENATE lv_data lv_buffer(lv_length) INTO lv_data IN BYTE MODE .
WRITE : / 'Gelesen:' , xstrlen ( lv_data ), 'Bytes' .
8. Binärdatei schreiben
DATA : lv_file TYPE string VALUE '/tmp/output.bin' ,
" Binärdaten (z.B. aus DB oder Verarbeitung)
lv_data = 'A1B2C3D4E5F6' .
OPEN DATASET lv_file FOR OUTPUT IN BINARY MODE .
TRANSFER lv_data TO lv_file.
9. An Datei anhängen (APPENDING)
DATA : lv_file TYPE string VALUE '/tmp/log.txt' ,
" Datum/Zeit zum Log hinzufügen
lv_line = |{ sy-datum DATE = ISO } { sy-uzeit TIME = ISO } : Neuer Eintrag | .
OPEN DATASET lv_file FOR APPENDING IN TEXT MODE ENCODING UTF-8 .
TRANSFER lv_line TO lv_file.
10. Datei prüfen und löschen
DATA : lv_file TYPE string VALUE '/tmp/temp.txt' .
" Prüfen ob Datei existiert (durch Öffnen)
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING DEFAULT .
WRITE : / 'Datei existiert' .
WRITE : / 'Datei gelöscht' .
WRITE : / 'Datei existiert nicht' .
11. Verzeichnis lesen
DATA : lv_dir TYPE string VALUE '/tmp/' ,
lt_files TYPE TABLE OF string ,
CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING'
dir_name = CONV eps2path( lv_dir )
build_directory_failed = 3
read_directory_failed = 5
LOOP AT lt_files INTO lv_filename.
12. Datei mit Fehlermeldung
DATA : lv_file TYPE string VALUE '/nonexistent/path/file.txt' ,
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
WRITE : / 'Fehler beim Öffnen:' .
WRITE : / 'Return Code:' , sy - subrc .
13. Zeilenumbruch-Modi
" Unix-Zeilenumbruch (LF)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
" Windows-Zeilenumbruch (CRLF)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
" Automatisch (abhängig vom Server)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
" Smart: Schreiben wie Native, Lesen erkennt automatisch
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
14. Positionierung in Datei
DATA : lv_file TYPE string VALUE '/tmp/data.bin' ,
lv_data TYPE x LENGTH 100 ,
OPEN DATASET lv_file FOR UPDATE IN BINARY MODE .
GET DATASET lv_file POSITION lv_pos.
WRITE : / 'Aktuelle Position:' , lv_pos.
SET DATASET lv_file POSITION 100 .
READ DATASET lv_file INTO lv_data.
15. Große Dateien effizient verarbeiten
CONSTANTS : c_buffer_size TYPE i VALUE 8192 .
DATA : lv_file TYPE string VALUE '/tmp/large_file.txt' ,
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING UTF-8 .
READ DATASET lv_file INTO lv_buffer.
" Verarbeitung ohne Speichern aller Zeilen
" process_line( lv_buffer ).
" Fortschritt anzeigen (alle 10000 Zeilen)
IF lv_count MOD 10000 = 0 .
WRITE : / 'Verarbeitet:' , lv_count, 'Zeilen' .
WRITE : / 'Gesamt:' , lv_count, 'Zeilen' .
16. Temporäre Datei erstellen
DATA : lv_temp_file TYPE string ,
lv_guid TYPE sysuuid_c32.
" Eindeutigen Dateinamen generieren
lv_guid = cl_system_uuid=>create_uuid_c32_static( ).
lv_temp_file = | /tmp/temp_ { lv_guid } .txt | .
" Temporäre Datei verwenden
OPEN DATASET lv_temp_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8 .
TRANSFER 'Temporäre Daten' TO lv_temp_file.
CLOSE DATASET lv_temp_file.
DELETE DATASET lv_temp_file.
Encoding-Optionen
Encoding Beschreibung DEFAULTSystem-Standard UTF-8Unicode (empfohlen) NON-UNICODELegacy, nicht-Unicode
sy-subrc Werte
Wert Bedeutung 0 Erfolgreich 4 Ende der Datei (READ) 8 Fehler (Datei nicht gefunden, keine Berechtigung)
ABAP Cloud Alternative
" In ABAP Cloud: FILE-Interface nicht verfügbar
" Stattdessen: CL_ABAP_FILE_UTILITIES oder XCO
" Beispiel mit XCO (Cloud)
DATA (lo_file) = xco_cp=>file( '/tmp/test.txt' ).
DATA (lv_content) = lo_file->read( )->as_string( ).
Wichtige Hinweise / Best Practice
CLOSE DATASET immer aufrufen – auch bei Fehlern (TRY-FINALLY).
UTF-8 als Encoding für moderne Dateien verwenden.
MESSAGE -Zusatz für aussagekräftige Fehlermeldungen.
sy-subrc = 4 bei READ bedeutet Ende der Datei (EOF).
APPENDING zum Anhängen an bestehende Dateien.
Große Dateien zeilenweise verarbeiten statt komplett laden.
Berechtigungen (S_DATASET) für Dateizugriff prüfen.
Pfade immer absolut angeben (nicht relativ).
In ABAP Cloud sind Dateioperationen eingeschränkt – XCO verwenden.
Binärdateien für nicht-Text-Inhalte (Bilder, PDFs).