✒️ABAP El Batch Input utilizando el Juego de datos
ABAP El Batch Input utilizando el Juego de datos
BATCH INPUT UTILIZANDO JUEGO DE DATOS
La ejecucion se realiza en forma batch y queda almacenada en SAP para su posterior ejecucion mediante la transaccion SM37, Se utilizan funciones estandar para la apertura, insercion y cierre del juego de datos.
Para ello vamos a crear un archivo de texto con registros que cunplan con la estructura de la tabla ZTABLA_USUARIOS, sin tener en cuenta el campo mandante.
1. DECLARACION DE LOS DATOS PROPIOS DEL BATCH INPUT
Declaramos una tabla interna y una estructura, ambas del tipo BDCDATA y otra tabla interna de usuarios que contendra los registros que levanteos del archivo de entrada.
*----------------------------------------------------------------------* * Declaracion de datos *----------------------------------------------------------------------* * Tabla del BI con la estructura de BDCDATA DATA: BEGIN OF ti_bdc_data OCCURS 0. INCLUDE STRUCTURE bdcdata. DATA: END OF ti_bdc_data. * Estructura del BI DATA: st_bdc_data TYPE bdcdata. * Tabla de usuarios DATA: BEGIN OF ti_archivo OCCURS 0, dni(8) TYPE c, "Dni nombre_ape(35) TYPE c, "Nombre y Apellido estado_usu(1) TYPE c, "Estado del usuario direccion(30) TYPE c, "Dirección codigo_postal(4) TYPE c, "Código Postal f_nacimiento(8) TYPE c, "Fecha Nacimiento estado_civil(1) TYPE c, "Estado civil END OF ti_archivo. DATA: st_archivo LIKE LINE OF ti_archivo. * Variables DATA: v_campo(35) TYPE c, v_indice(2) TYPE c, v_qid TYPE apq_quid, v_group TYPE apq_grpn. *--------------------------------------------------------------------* * Pantalla de selección *--------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK z2 WITH FRAME TITLE text-007. * Archivo de entrada PARAMETERS: p_path LIKE rlgrap-filename. SELECTION-SCREEN END OF BLOCK z2. *--------------------------------------------------------------------* AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. *--------------------------------------------------------------------* * Abrir ventana de archivos PERFORM abrir_ventana_archivos. *--------------------------------------------------------------------* START-OF-SELECTION. *--------------------------------------------------------------------* * Levanto el archivo de entrada PERFORM levantar_archivo_entrada. * Procesamiento de los datos PERFORM procesamiento_datos.
2. LECTURA DE DATOS DE ARCHIVO DE ENTRADA
Ejecutamos el metodo CALL METHOD cl_gui_frontend_services=>gui_upload para levantar el archivo de entrada con la informacion para generar el BATCH INPUT.
FORM levantar_archivo_entrada . DATA: vl_file TYPE string. IF p_path IS INITIAL. MESSAGE s000(z_prueba) WITH text-003. ELSE. vl_file = p_path. * Se abre el archivo de entrada para lectura CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = vl_file filetype = 'ASC' has_field_separator = '' CHANGING data_tab = ti_archivo[] EXCEPTIONS file_open_error = 1 file_read_error = 2 no_batch = 3 gui_refuse_filetransfer = 4 invalid_type = 5 no_authority = 6 unknown_error = 7 bad_data_format = 8 header_not_allowed = 9 separator_not_allowed = 10 header_too_long = 11 unknown_dp_error = 12 access_denied = 13 dp_out_of_memory = 14 disk_full = 15 dp_timeout = 16 not_supported_by_gui = 17 error_no_gui = 18 OTHERS = 19. IF sy-subrc NE 0. MESSAGE e000(z_prueba) WITH text-004. ENDIF. IF ti_archivo[] IS INITIAL. MESSAGE s000(z_prueba) WITH text-005. ENDIF. ENDIF. ENDFORM. " LEVANTAR_ARCHIVO_ENTRADA
3. APERTURA DE LA SESION DEL JUEGO DE DATOS
Se utiliza la funcion BDC_OPEN_GROUP, especificando el mandante, el grupo y el usuario.
*&---------------------------------------------------------------------* *& Form APERTURA_JD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM apertura_jd. v_group = sy-repid. CALL FUNCTION 'BDC_OPEN_GROUP' EXPORTING client = sy-mandt group = v_group keep = 'X' user = sy-uname IMPORTING qid = v_qid EXCEPTIONS client_invalid = 1 destination_invalid = 2 group_invalid = 3 group_is_locked = 4 holddate_invalid = 5 internal_error = 6 queue_error = 7 running = 8 system_lock_error = 9 user_invalid = 10 OTHERS = 11. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. " APERTURA_JD
4. CARGA DE LA TABLA BDCDATA
Se utiliza la subrutina BDC_FIELD, que vimos en la leccion dos. Antes debemos inicializar la tabla interna del BATCH INPUT.
*&---------------------------------------------------------------------* *& Form bdc_field *&---------------------------------------------------------------------* FORM bdc_field USING dyn_begin TYPE c campo1 campo2. CLEAR st_bdc_data. IF dyn_begin = 'X'. st_bdc_data-program = campo1. st_bdc_data-dynpro = campo2. st_bdc_data-dynbegin = dyn_begin. ELSE. st_bdc_data-fnam = campo1. st_bdc_data-fval = campo2. ENDIF. APPEND st_bdc_data TO ti_bdc_data. ENDFORM. " bdc_field
5. INSERCION DEL JUEGO DE DATOS
Se utiliza la funcion BDC_INSERT
*&---------------------------------------------------------------------* *& Form INSERTAR_JD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM insertar_jd . CALL FUNCTION 'BDC_INSERT' EXPORTING tcode = 'SM30' TABLES dynprotab = ti_bdc_data EXCEPTIONS internal_error = 1 not_open = 2 queue_error = 3 tcode_invalid = 4 printing_invalid = 5 posting_invalid = 6 OTHERS = 7. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. * Se ha lanzado el juego de datos, verificarlo en la trx SM35 MESSAGE s000(z_prueba) WITH text-010. ENDIF.
ENDFORM. " INSERTAR_JD
6. CIERRE DE LA SESION DEL JUEGO DE DATOS
Se utiliza la funcion BDC_CLOSE_GROUP
*&---------------------------------------------------------------------* *& Form CERRAR_JD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM cerrar_jd . CALL FUNCTION 'BDC_CLOSE_GROUP' EXCEPTIONS not_open = 1 queue_error = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. " CERRAR_JD
7. EJECUCION DEL JUEGO DE DATOS
Entrar a la transaccion SM35. Vamos a seleccionar el juego de datos y lo ejecutamos presionando el boton ejecutar (process).
En la siguiente ventana de dialogo marcamos la opcion invisible (background) y presionamos ejecutar (process).
Finalmente la sesion cambiara de status dependiendo del resultado de la ejecución y los datos se actualizaran en la tabla ZTABLA_USUARIOS.
Las diferencias entre CALL TRANSACTION y JUEGO DE DATOS
- CALL TRANSACTION el procesamiento es sincrono es decir on line, se transfieren datos a una sola transaccion en cada CALL TRANSACTION, no se generan logs .
- JUEGO DE DATOS el procesamiento es asincrono es decir de fondo se transfieren datos a multiples transacciones, se generan logs por cada transacción.
-----------------------------------------------------------------------------------------------------------
UTILIZACION DEL PROGRAMA RSBDCBTC PARA LA EJECUCION DEL JUEGO DE DATOS
Se puede ejecutar el juego de datos en forma online al ejecutar el programa RSBDCBTC y cerrar el job.
*&---------------------------------------------------------------------* *& Form PROCESAR_ONLINE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM procesar_online . * Asignamos un nombre al job v_jobname = 'ZPRUEBA_ABAP'. v_jobgroup = v_jobname. CALL FUNCTION 'JOB_OPEN' EXPORTING jobgroup = v_jobgroup jobname = v_jobname IMPORTING jobcount = v_jobcount EXCEPTIONS cant_create_job = 1 invalid_job_data = 2 jobname_missing = 3 OTHERS = 4. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. IF sy-subrc EQ 0. SUBMIT rsbdcbtc USER sy-uname VIA JOB v_jobgroup NUMBER v_jobcount WITH queue_id = v_qid WITH mappe = v_jobgroup WITH modus = 'N' "No display WITH logall = '' AND RETURN. IF sy-subrc EQ 0. CALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = v_jobcount jobname = v_jobname strtimmed = 'X' EXCEPTIONS cant_start_immediate = 1 invalid_startdate = 2 jobname_missing = 3 job_close_failed = 4 job_nosteps = 5 job_notex = 6 lock_failed = 7 invalid_target = 8 OTHERS = 9. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDIF. ENDIF. ENDFORM. " PROCESAR_ONLINEVamos a la transaccion SM35 vemos que el juego de datos se procesó sin la necesidad de hacerlo manualmente.
 
 
 
Sobre el autor
Publicación académica de Oscar Guillermo Rodriguez Villate, en su ámbito de estudios para la Carrera Consultor ABAP.
Oscar Guillermo Rodriguez Villate
Profesión: Ingeniero de Sistemas - Colombia - Legajo: WM49P
✒️Autor de: 103 Publicaciones Académicas
🎓Egresado de los módulos:
Disponibilidad Laboral: FullTime
Certificación Académica de Oscar Rodriguez