Las operaciones de archivo permiten leer y escribir archivos en el servidor de aplicaciones SAP. Los comandos OPEN DATASET, READ DATASET, TRANSFER y CLOSE DATASET forman la base para el procesamiento de archivos en ABAP.
Comandos basicos
Comando Descripcion OPEN DATASETAbrir archivo READ DATASETLeer datos de archivo TRANSFEREscribir datos en archivo CLOSE DATASETCerrar archivo DELETE DATASETEliminar archivo
Sintaxis
Abrir archivo
OPEN DATASET <nombrearchivo>
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 ]
Leer/Escribir archivo
READ DATASET <nombrearchivo> INTO <datos> [ LENGTH <longitud> ].
TRANSFER <datos> TO <nombrearchivo> [ LENGTH <longitud> ].
Cerrar/Eliminar archivo
CLOSE DATASET <nombrearchivo>.
DELETE DATASET <nombrearchivo>.
Ejemplos
1. Escribir archivo de texto
DATA : lv_file TYPE string VALUE '/tmp/output.txt' ,
" Abrir archivo para escritura
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
TRANSFER 'Linea 1: Hola Mundo' TO lv_file.
TRANSFER 'Linea 2: ABAP es genial' TO lv_file.
TRANSFER 'Linea 3: Fin del archivo' TO lv_file.
WRITE : / 'Archivo escrito exitosamente' .
WRITE : / 'Error:' , lv_message.
2. Leer archivo de texto
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 : / 'No se pudo abrir el archivo' .
3. Leer archivo en tabla
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 : / 'Lineas leidas:' , lines ( lt_lines ).
4. Escribir tabla en archivo
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 : / 'Exportadas:' , lines ( lt_lines ), 'lineas' .
5. Procesar archivo 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 .
" Saltar linea de cabecera
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. Crear exportacion CSV
DATA : lv_file TYPE string VALUE '/tmp/export.csv' ,
DATA : lt_orders TYPE TABLE OF ty_order.
( id = 1 customer = 'Garcia' amount = '100.50' )
( id = 2 customer = 'Lopez' amount = '250.00' )
( id = 3 customer = 'Martinez' amount = '75.25' )
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8 .
TRANSFER 'ID;Cliente;Monto' 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. Leer archivo binario
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 : / 'Leidos:' , xstrlen ( lv_data ), 'bytes' .
8. Escribir archivo binario
DATA : lv_file TYPE string VALUE '/tmp/output.bin' ,
" Datos binarios (por ej. de BD o procesamiento)
lv_data = 'A1B2C3D4E5F6' .
OPEN DATASET lv_file FOR OUTPUT IN BINARY MODE .
TRANSFER lv_data TO lv_file.
9. Agregar a archivo (APPENDING)
DATA : lv_file TYPE string VALUE '/tmp/log.txt' ,
" Agregar fecha/hora al log
lv_line = |{ sy-datum DATE = ISO } { sy-uzeit TIME = ISO } : Nueva entrada | .
OPEN DATASET lv_file FOR APPENDING IN TEXT MODE ENCODING UTF-8 .
TRANSFER lv_line TO lv_file.
10. Verificar y eliminar archivo
DATA : lv_file TYPE string VALUE '/tmp/temp.txt' .
" Verificar si el archivo existe (abriendo)
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING DEFAULT .
WRITE : / 'Archivo existe' .
WRITE : / 'Archivo eliminado' .
WRITE : / 'Archivo no existe' .
11. Leer directorio
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. Archivo con mensaje de error
DATA : lv_file TYPE string VALUE '/nonexistent/path/file.txt' ,
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
WRITE : / 'Error al abrir:' .
WRITE : / 'Codigo de retorno:' , sy - subrc .
13. Modos de salto de linea
" Salto de linea Unix (LF)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
" Salto de linea Windows (CRLF)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
" Automatico (dependiente del servidor)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
" Smart: Escribe como Native, Lectura detecta automaticamente
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
14. Posicionamiento en archivo
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 : / 'Posicion actual:' , lv_pos.
SET DATASET lv_file POSITION 100 .
" Leer desde posicion 100
READ DATASET lv_file INTO lv_data.
15. Procesar archivos grandes eficientemente
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.
" Procesamiento sin guardar todas las lineas
" process_line( lv_buffer ).
" Mostrar progreso (cada 10000 lineas)
IF lv_count MOD 10000 = 0 .
WRITE : / 'Procesadas:' , lv_count, 'lineas' .
WRITE : / 'Total:' , lv_count, 'lineas' .
16. Crear archivo temporal
DATA : lv_temp_file TYPE string ,
lv_guid TYPE sysuuid_c32.
" Generar nombre de archivo unico
lv_guid = cl_system_uuid=>create_uuid_c32_static( ).
lv_temp_file = | /tmp/temp_ { lv_guid } .txt | .
OPEN DATASET lv_temp_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8 .
TRANSFER 'Datos temporales' TO lv_temp_file.
CLOSE DATASET lv_temp_file.
DELETE DATASET lv_temp_file.
Opciones de Encoding
Encoding Descripcion DEFAULTEstandar del sistema UTF-8Unicode (recomendado) NON-UNICODELegacy, no-Unicode
Valores de sy-subrc
Valor Significado 0 Exitoso 4 Fin de archivo (READ) 8 Error (archivo no encontrado, sin permiso)
Alternativa ABAP Cloud
" En ABAP Cloud: Interfaz FILE no disponible
" En su lugar: CL_ABAP_FILE_UTILITIES o XCO
" Ejemplo con XCO (Cloud)
DATA (lo_file) = xco_cp=>file( '/tmp/test.txt' ).
DATA (lv_content) = lo_file->read( )->as_string( ).
Notas importantes / Mejores practicas
CLOSE DATASET siempre llamar - incluso en caso de error (TRY-FINALLY).
UTF-8 como encoding para archivos modernos.
Agregar MESSAGE para mensajes de error descriptivos.
sy-subrc = 4 en READ significa fin de archivo (EOF).
APPENDING para agregar a archivos existentes.
Procesar archivos grandes linea por linea en lugar de cargar completos.
Verificar autorizaciones (S_DATASET) para acceso a archivos.
Especificar rutas siempre de forma absoluta (no relativa).
En ABAP Cloud las operaciones de archivo estan restringidas - usar XCO.
Archivos binarios para contenido no textual (imagenes, PDFs).