Les opérations sur fichiers permettent de lire et d’écrire des fichiers sur le serveur d’applications SAP. Les commandes OPEN DATASET, READ DATASET, TRANSFER et CLOSE DATASET constituent la base du traitement de fichiers en ABAP.
Commandes de base
Commande Description OPEN DATASETOuvrir un fichier READ DATASETLire des données d’un fichier TRANSFERÉcrire des données dans un fichier CLOSE DATASETFermer un fichier DELETE DATASETSupprimer un fichier
Syntaxe
Ouvrir un fichier
OPEN DATASET <nom_fichier>
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 ]
Lire/écrire un fichier
READ DATASET <nom_fichier> INTO <données> [ LENGTH <longueur> ].
TRANSFER <données> TO <nom_fichier> [ LENGTH <longueur> ].
Fermer/supprimer un fichier
CLOSE DATASET <nom_fichier>.
DELETE DATASET <nom_fichier>.
Exemples
1. Écrire un fichier texte
DATA : lv_file TYPE string VALUE '/tmp/output.txt' ,
" Ouvrir le fichier en écriture
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
TRANSFER 'Ligne 1: Bonjour le monde' TO lv_file.
TRANSFER 'Ligne 2: ABAP est génial' TO lv_file.
TRANSFER 'Ligne 3: Fin du fichier' TO lv_file.
WRITE : / 'Fichier écrit avec succès' .
WRITE : / 'Erreur:' , lv_message.
2. Lire un fichier texte
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 : / 'Le fichier n''a pas pu être ouvert' .
3. Lire un fichier dans une table
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 : / 'Lignes lues:' , lines ( lt_lines ).
4. Écrire une table dans un fichier
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 : / 'Exporté:' , lines ( lt_lines ), 'lignes' .
5. Traiter un fichier CSV
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 .
" Ignorer la ligne d'en-tête
READ DATASET lv_file INTO lv_line.
" Lire les lignes de données
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. Créer une exportation CSV
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;Client;Montant' 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. Lire un fichier binaire
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 : / 'Lu:' , xstrlen ( lv_data ), 'octets' .
8. Écrire un fichier binaire
DATA : lv_file TYPE string VALUE '/tmp/output.bin' ,
" Données binaires (par ex. de la DB ou traitement)
lv_data = 'A1B2C3D4E5F6' .
OPEN DATASET lv_file FOR OUTPUT IN BINARY MODE .
TRANSFER lv_data TO lv_file.
9. Ajouter à un fichier (APPENDING)
DATA : lv_file TYPE string VALUE '/tmp/log.txt' ,
" Ajouter date/heure au log
lv_line = |{ sy-datum DATE = ISO } { sy-uzeit TIME = ISO } : Nouvelle entrée | .
OPEN DATASET lv_file FOR APPENDING IN TEXT MODE ENCODING UTF-8 .
TRANSFER lv_line TO lv_file.
10. Vérifier et supprimer un fichier
DATA : lv_file TYPE string VALUE '/tmp/temp.txt' .
" Vérifier si le fichier existe (en l'ouvrant)
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING DEFAULT .
WRITE : / 'Le fichier existe' .
WRITE : / 'Fichier supprimé' .
WRITE : / 'Le fichier n''existe pas' .
11. Lire un répertoire
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. Fichier avec message d’erreur
DATA : lv_file TYPE string VALUE '/nonexistent/path/file.txt' ,
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
WRITE : / 'Erreur lors de l''ouverture:' .
WRITE : / 'Code retour:' , sy - subrc .
13. Modes de saut de ligne
" Saut de ligne Unix (LF)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
" Saut de ligne Windows (CRLF)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
" Automatique (dépend du serveur)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
" Smart: Écriture comme Native, lecture détecte automatiquement
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
14. Positionnement dans un fichier
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 : / 'Position actuelle:' , lv_pos.
SET DATASET lv_file POSITION 100 .
" Lire à partir de la position 100
READ DATASET lv_file INTO lv_data.
15. Traiter efficacement des fichiers volumineux
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.
" Traitement sans sauvegarder toutes les lignes
" process_line( lv_buffer ).
" Afficher la progression (toutes les 10000 lignes)
IF lv_count MOD 10000 = 0 .
WRITE : / 'Traité:' , lv_count, 'lignes' .
WRITE : / 'Total:' , lv_count, 'lignes' .
16. Créer un fichier temporaire
DATA : lv_temp_file TYPE string ,
lv_guid TYPE sysuuid_c32.
" Générer un nom de fichier unique
lv_guid = cl_system_uuid=>create_uuid_c32_static( ).
lv_temp_file = | /tmp/temp_ { lv_guid } .txt | .
" Utiliser le fichier temporaire
OPEN DATASET lv_temp_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8 .
TRANSFER 'Données temporaires' TO lv_temp_file.
CLOSE DATASET lv_temp_file.
DELETE DATASET lv_temp_file.
Options d’encodage
Encodage Description DEFAULTStandard système UTF-8Unicode (recommandé) NON-UNICODELegacy, non-Unicode
Valeurs sy-subrc
Valeur Signification 0 Succès 4 Fin du fichier (READ) 8 Erreur (fichier non trouvé, pas d’autorisation)
Alternative ABAP Cloud
" Dans ABAP Cloud: Interface FILE non disponible
" À la place: CL_ABAP_FILE_UTILITIES ou XCO
" Exemple avec XCO (Cloud)
DATA (lo_file) = xco_cp=>file( '/tmp/test.txt' ).
DATA (lv_content) = lo_file->read( )->as_string( ).
Remarques importantes / Bonnes pratiques
Toujours appeler CLOSE DATASET – même en cas d’erreurs (TRY-FINALLY).
Utiliser UTF-8 comme encodage pour les fichiers modernes.
Utiliser MESSAGE pour des messages d’erreur significatifs.
sy-subrc = 4 lors du READ signifie fin du fichier (EOF).
APPENDING pour ajouter à des fichiers existants.
Traiter les fichiers volumineux ligne par ligne au lieu de les charger complètement.
Vérifier les autorisations (S_DATASET) pour l’accès aux fichiers.
Toujours spécifier les chemins en absolu (pas relatif).
Dans ABAP Cloud , les opérations sur fichiers sont limitées – utiliser XCO.
Fichiers binaires pour les contenus non texte (images, PDF).