✒️ABAP La ejecución de fondo
ABAP La ejecución de fondo
BATCH
EJECUCION DE FONDO
Se puede ejecutar un programa en abapa: online y batch
ONLINE : Se ejecuta al presionar f8 y los resultados se producen inmediatamente. Interaccion con el usuario o el tiempo de ejecucion es muy poco.
BATCH: tiempo de procesamiento alto. Tiene muchos accesos a base de datos, multiples transacciones o a otras varias razones.
BATCH INPUT: TECNICA EMPLEADA PARA CARGA MASIVA.
REPORTES EN ABAP : muchas veces se utiliza en batch.
ej:
DATA: TI_USUARIOS TYPE STANDARD TABLE OF ZTABLA_USUARIOS,
ST_USUARIOS LIKE LINE OF TI_USUARIOS.
START-OF-SELECTION.
SELECT DNI NOMBRE_APE ESTADO_USU
FROM ZTABLA_USUARIOS
INTO TABLE TI_USUARIOS.
LOOP AT TI_USUARIOS INTO ST_>USUARIOS.
WRITE:/ ST_USUARIOS-DNI,
ST_USUARIOS-NOMBRE_APE,
ST_USUARIOS-ESTADO_USU.
ENDLOOP.
Ahora vamos a crear el nuevo programa abap ZPRUEBA_FONDO el cual cumplirá el rol de programa padere del programa ZPRUEBA_FONDO_B.
Lo primero que debemos hacer es crear un job. Para esto le asignamos un nombre a la variable V_JOBNAME y luego ejecutamos la funcion JOB_OPEN. Para modularizar vamo a crear la subrutina ABRIR_JOB que tendrá el siguiente código.
FORM ABRIR_JOB.
CONCATENATE 'ZPRUEBA_FONDO_' SY-DSTUM
INTO V_JOBNAME.
CALL FUNCTION 'JOB:OPEN'
EXPORTING
JOBNAME = V_JOBNAME
IMPORTING
JOBCOUNT = V_JOBCOUNT
EXCEPTIONS
CANT_CREATR_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.
ENDFORM.
Lo que sigue es lanzar el job. Para esto vamos a crear la subrutina LANZAR_JOB, que ejecutará la sentencia SUBMIT, la cual se utiliza para ejecutar un programa dentro de otro programa y con el agragado de la clausula VIA JOB NUMBER la ejecucion del programa se realizará a fondo.
Mediante la sentencia SUBMIT se pueden pasar parámetros al programa llamado, los cuales deben existir en la pantalla de selección de éste.
FORM LANZAR_JOB.
SUBMIT ZPRUEBA_FONDO_B
VIAJOB V_JOBNAME
NUMBER V_JOBCOUNT
AND RETURN.
ENDFORM.
Con el agregado de la clausula AND RETURN el programa llamador permanece en espera mientras se ejecuta el programa llamado. Cuando el programa llamado termina, se devuelve el control al programa llamador.
Luego debemos cerrar el job mediante la función JOB_CLOSE. ara esto vamos a crear la subrutina CERRAR_JOB como vemos a continuación.
FORM CERRAR_JOB.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
JOBCOUNT = V_JOBCOUNT
JOBNAME = V_JOBNAME
STRINMED = 'X'
EXCEPTIONS
CANT_START_INMEDIATE = 1
INVALID_STARDATE = 2
JOBNAME_MISSING = 3
JO_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.
ELSE
WRITE 'SE LANZO EL JOB, PARA VISUALIZAR IR A LA TRX SM37 ' .
ENDIF.
ENDFORM.
Por último cerramos el job, imprimimos en pantalla el mensaje.
TRANSACCION SM37: Visualizar los jobs procesados en el sistema SAP.
Presionamos el boton SPOOL.
Vemos el pedido del job correspondiente a nuestro programa.
Presionamos el boton de visualización y vemos el resultado del procesamiento.
El programa completo
*&---------------------------------------------------------------------* *& Report zprueba_fondo *& *&---------------------------------------------------------------------* REPORT zprueba_fondo. * Declaración de datos DATA: v_jobname TYPE btcjob, v_jobcount TYPE btcjobcnt. *----------------------------------------------------------------------* START-OF-SELECTION. *----------------------------------------------------------------------* * Apertura del Job PERFORM abrir_job. * Lanzo el Job PERFORM lanzar_job. * Cierro el Job PERFORM cerrar_job. ************************************************************************ ********************* SUBRUTINAS *************************************** ************************************************************************ *&---------------------------------------------------------------------* *& Form abrir_job *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM abrir_job . * Asigamos un nombre al job CONCATENATE 'ZPRUEBA_FONDO_' sy-datum INTO v_jobname. CALL FUNCTION 'JOB_OPEN' EXPORTING 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. ENDFORM. " abrir_job *&---------------------------------------------------------------------* *& Form lanzar_job *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* form lanzar_job. * Lanzo el Job SUBMIT zprueba_fondo_b USER sy-uname "usuario que ejecuta VIA JOB v_jobname NUMBER v_jobcount AND RETURN. endform. " lanzar_job *&---------------------------------------------------------------------* *& Form cerrar_job *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM cerrar_job. CALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = v_jobcount jobname = v_jobname strtimmed = 'X' "Comienza de inmediato 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. ELSE. WRITE 'Se lanzo el Job, para visualizarlo ir a la Trx SM37'. ENDIF. ENDFORM. " cerrar_job *&---------------------------------------------------------------------* *& Report zprueba_fondo_b *& *&---------------------------------------------------------------------* REPORT zprueba_fondo_b. * Declaración de datos DATA: ti_usuarios TYPE STANDARD TABLE OF ztabla_usuarios, st_usuarios LIKE LINE OF ti_usuarios. *---------------------------------------------------------------------* START-OF-SELECTION. *---------------------------------------------------------------------* CLEAR ti_usuarios. REFRESH ti_usuarios. SELECT dni nombre_ape estado_usu FROM ztabla_usuarios INTO CORRESPONDING FIELDS OF TABLE ti_usuarios. LOOP AT ti_usuarios INTO st_usuarios. WRITE:/ st_usuarios-dni, st_usuarios-nombre_ape, st_usuarios-estado_usu. ENDLOOP.
 
 
 
2 Agradecimientos:
Han agradecido este aporte: William Lemus, Yeffer Sierra Saenz
Favorito:
Está publicación ha sido agregada a sus favoritos por: William Lemus
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