Archivo
Evitar la ejecución de JOBs en paralelo
Caso: se desea programar un job, pero que no se ejecute otra instancia del mismo si éste se encuentra ya en ejecución.
Por ejemplo si tengo un job que se ejecuta cada 1 minuto pero hay veces que su ejecución tarda más que 1 minuto, entonces queremos evitar que se ejecute la próxima instancia del job antes que termine el job actual.
Solución: utilizamos el report RSBTONEJOB2 como “puente” para ejecutar como JOB nuestro programa:
1. Ante todo tenemos que tener definido el programa y la variante que vamos a ejecutar en el JOB.
En nuestro caso es el programa ZPRUEBA_ABAP y la variante es SOC_1000.
2. Ingresamos a la SE38 y ejecutamos el report RSBTONEJOB2. Allí debemos indicar:
– JOBNAME: el nombre del job que crearemos (puede ser igual al nombre del report)
– REPORT: Nombre del programa que vamos a ejecutar en el JOB (ver paso 1)
– VARIANT: variante del programa a ejecutar en el JOB (ver paso 1)
3. Ahora bien, con estos datos debemos crear en el programa RSBTONEJOB2 una variante que tenga el mismo nombre que la variante del REPORT del paso 1. Es importante este punto.
- image0031
- image004
4. Vamos a la SM36 y programamos el JOB. Para el caso debemos respetar los nombres utilizados: El nombre del JOB y la variante
Definimos el paso, en este caso ponemos el nombre del programa RSBTONEJOB2, que funcionará como un “puente” al programa que queremos ejecutar en el JOB y la variante.
Definimos la condición de inicio (nosotros probaremos cada 1 minuto para forzar a que cancele la ejecución)
Grabamos el JOB para que se libere automáticamente (ya que nuestra condición de inicio fue “Inmediato”).
5. Vamos a ver su comportamiento en la SM37.
Vemos que se encuentra un JOB activo y al minuto intentó ejecutarse nuevamente y terminó, viendo el log del job terminado tenemos que:
Podemos ver los distintos mensajes que se generarán en el programa RSBTONEJOB2:
Debug de Proceso de Fondo / JOB
Caso: Se desea ejecutar un reporte como proceso de fondo (JOB) y luego debuggearlo.
Solución: Previamente necesitamos permisos para el debug de jobs activos , más precisamente el objeto S_ADMI_FCD (PADM – Process administration para las transacciones SM04 y SM50).
Si tenemos los permisos, entonces:
1. Si el JOB está corriendo, vamos a la transacción SM50 y marcamos el checkbox del proceso que corre nuestro JOB y vamos a la opción del menú Program/Mode->Program->Debugging.
Allí comenzará el debug.
2.- Si el job ya finalizo podemos debugearlo desde la SM37 seleccionando el job y escribiendo la transacción JDBG.
Si el job es demasiado rápido para poder pillarlo por la SM50 un truco es programar el job por SM36 usando dos pasos y siendo el primer paso el report de bucle standard BTCLOOP, al comenzar el debug solo tendremos que salir del bucle de este report.
Llamar programa mediante JOB programado
Caso: se busca crear un job de un programa ABAP, programado a una cierta fecha-hora para que sea ejecutado.
*&———————————————————————*
*& Form crear_datos_job
*&———————————————————————*
* Crear datos vía JOB
*———————————————————————-*
FORM crear_datos_job.
DATA: lv_respuesta TYPE c,
lv_error TYPE c,
lv_jobname TYPE tbtcjob-jobname,
lv_jobcount TYPE tbtcjob-jobcount,
lv_jobdate TYPE tbtcjob-sdlstrtdt,
lv_jobtime TYPE tbtcjob-sdlstrttm,
lv_fec_ini TYPE ztmm_ep_secuenc-fecha_ini,
lv_fec_fin TYPE ztmm_ep_secuenc-fecha_fin.
CALL FUNCTION ‘POPUP_TO_CONFIRM’
EXPORTING
titlebar = ‘Creación de Datos vía JOB’
text_question = ‘¿Confirma la creación de datos vía JOB?.’
default_button = ‘2’
display_cancel_button = ‘X’
IMPORTING
answer = lv_respuesta
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
IF lv_respuesta EQ ‘1’.
* Llamada al JOB
CONCATENATE ‘ZJOB_CREAR’ sy-datum sy-uname INTO lv_jobname SEPARATED BY ‘_’.
CALL FUNCTION ‘JOB_OPEN’
EXPORTING
jobname = lv_jobname
jobclass = ‘B’ » Prioridad media
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE e208(00) WITH ‘Error al crear JOB’.
ENDIF.
SUBMIT zmm_crear_datos WITH p_fecini = ‘20130101’
WITH p_fecfin = ‘20131231
VIA JOB lv_jobname NUMBER lv_jobcount USER sy-uname AND RETURN.
IF sy-subrc <> 0.
MESSAGE e208(00) WITH ‘Error al programar JOB’.
ENDIF.
CALL FUNCTION ‘JOB_CLOSE’
EXPORTING
jobcount = lv_jobcount » Nro. interno del JOB
jobname = lv_jobname » Nombre del JOB
sdlstrtdt = lv_jobdate » Fecha inicio JOB
sdlstrttm = lv_jobtime » Hora inicio JOB
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 e208(00) WITH ‘Error al cerrar Job’.
ELSE.
MESSAGE i001(00) WITH ‘JOB creado:’ lv_jobname ‘->’ lv_jobcount.
ENDIF.
ENDIF.
ENDFORM. «crear_datos_job
Link útil:
http://www.mundosap.com/foro/showthread.php?t=27990&highlight=open_job