Jobs en background ABAP: JOB_OPEN, SUBMIT, Scheduling

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

Los Background Jobs permiten la ejecucion programada o basada en eventos de programas ABAP sin interaccion del usuario. Con JOB_OPEN, SUBMIT y JOB_CLOSE los jobs pueden crearse y programarse de forma programatica.

Concepto basico

FuncionDescripcion
JOB_OPENCrear y abrir job
SUBMIT ... VIA JOBAgregar report al job
JOB_CLOSECerrar y programar job
BP_JOB_DELETEEliminar job
BP_JOB_READLeer estado del job

Estados del job

EstadoSignificado
P (Planned)Planificado, esperando inicio
S (Scheduled)Liberado
R (Running)En ejecucion
F (Finished)Finalizado exitosamente
A (Aborted)Cancelado

Ejemplos

1. Crear job simple

DATA: lv_jobname TYPE btcjob VALUE 'ZTEST_JOB',
lv_jobcount TYPE btcjobcnt.
" Abrir job
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE 'No se pudo crear el job' TYPE 'E'.
RETURN.
ENDIF.
" Agregar report al job
SUBMIT zreport
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Cerrar job e iniciar inmediatamente
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true " Iniciar inmediatamente
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.
IF sy-subrc = 0.
MESSAGE |Job { lv_jobname } fue iniciado| TYPE 'S'.
ENDIF.

2. Programar job con hora de inicio

DATA: lv_jobname TYPE btcjob VALUE 'ZNIGHTLY_REPORT',
lv_jobcount TYPE btcjobcnt,
lv_startdate TYPE sy-datum,
lv_starttime TYPE sy-uzeit.
" Iniciar maniana a las 02:00
lv_startdate = sy-datum + 1.
lv_starttime = '020000'.
" Abrir job
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
RETURN.
ENDIF.
" Agregar report
SUBMIT zreport_nightly
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Programar job con hora de inicio
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
sdlstrtdt = lv_startdate " Fecha de inicio
sdlstrttm = lv_starttime " Hora de inicio
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
MESSAGE |Job programado para { lv_startdate DATE = USER } { lv_starttime TIME = USER }| TYPE 'S'.
ENDIF.

3. Job con parametros de seleccion

DATA: lv_jobname TYPE btcjob VALUE 'ZCUSTOMER_EXPORT',
lv_jobcount TYPE btcjobcnt,
lt_seltab TYPE TABLE OF rsparams,
lv_variant TYPE raldb_vari.
" Construir parametros de seleccion
lt_seltab = VALUE #(
( selname = 'P_BUKRS' kind = 'P' sign = 'I' option = 'EQ' low = '1000' )
( selname = 'P_DATE' kind = 'P' sign = 'I' option = 'EQ' low = sy-datum )
( selname = 'S_KUNNR' kind = 'S' sign = 'I' option = 'BT' low = '0000001000' high = '0000009999' )
).
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
" Report con parametros de seleccion
SUBMIT zcustomer_report
VIA JOB lv_jobname NUMBER lv_jobcount
WITH SELECTION-TABLE lt_seltab
AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true
EXCEPTIONS
OTHERS = 1.

4. Job con variante

" Ejecutar report con variante guardada
SUBMIT zmonthly_report
VIA JOB lv_jobname NUMBER lv_jobcount
USING SELECTION-SET 'MONTHLY_DEFAULT' " Variante
AND RETURN.

5. Job periodico (diario, semanal)

DATA: lv_jobname TYPE btcjob VALUE 'ZDAILY_CLEANUP',
lv_jobcount TYPE btcjobcnt,
ls_period TYPE tbtcjob-periodic,
lv_prdmonths TYPE tbtcjob-prdmonths,
lv_prdweeks TYPE tbtcjob-prdweeks,
lv_prddays TYPE tbtcjob-prddays,
lv_prdhours TYPE tbtcjob-prdhours,
lv_prdmins TYPE tbtcjob-prdmins.
" Abrir job
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
SUBMIT zcleanup_report
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Diariamente a las 23:00
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
sdlstrtdt = sy-datum
sdlstrttm = '230000'
prddays = 1 " Cada 1 dia
periodic = abap_true " Periodico
EXCEPTIONS
OTHERS = 1.
" Alternativa: Semanalmente (cada lunes)
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
sdlstrtdt = '20240101' " Primer lunes
sdlstrttm = '060000'
prdweeks = 1 " Semanalmente
periodic = abap_true
EXCEPTIONS
OTHERS = 1.

6. Clase Job para jobs reutilizables

CLASS zcl_job_scheduler DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF ty_job_info,
jobname TYPE btcjob,
jobcount TYPE btcjobcnt,
status TYPE btcstatus,
END OF ty_job_info.
METHODS: schedule_report
IMPORTING iv_report TYPE progname
iv_variant TYPE raldb_vari OPTIONAL
it_params TYPE rsparams_tt OPTIONAL
iv_start_date TYPE sy-datum DEFAULT sy-datum
iv_start_time TYPE sy-uzeit DEFAULT sy-uzeit
iv_immediate TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(rs_job) TYPE ty_job_info
RAISING zcx_job_error.
METHODS: get_job_status
IMPORTING iv_jobname TYPE btcjob
iv_jobcount TYPE btcjobcnt
RETURNING VALUE(rv_status) TYPE btcstatus.
METHODS: wait_for_job
IMPORTING iv_jobname TYPE btcjob
iv_jobcount TYPE btcjobcnt
iv_timeout TYPE i DEFAULT 300
RETURNING VALUE(rv_success) TYPE abap_bool.
PRIVATE SECTION.
METHODS: generate_jobname
IMPORTING iv_prefix TYPE string
RETURNING VALUE(rv_name) TYPE btcjob.
ENDCLASS.
CLASS zcl_job_scheduler IMPLEMENTATION.
METHOD schedule_report.
" Generar nombre del job
rs_job-jobname = generate_jobname( iv_report ).
" Abrir job
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = rs_job-jobname
IMPORTING
jobcount = rs_job-jobcount
EXCEPTIONS
cant_create_job = 1
OTHERS = 2.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_job_error
EXPORTING textid = zcx_job_error=>job_open_failed.
ENDIF.
" Programar report
IF iv_variant IS NOT INITIAL.
SUBMIT (iv_report)
VIA JOB rs_job-jobname NUMBER rs_job-jobcount
USING SELECTION-SET iv_variant
AND RETURN.
ELSEIF it_params IS NOT INITIAL.
SUBMIT (iv_report)
VIA JOB rs_job-jobname NUMBER rs_job-jobcount
WITH SELECTION-TABLE it_params
AND RETURN.
ELSE.
SUBMIT (iv_report)
VIA JOB rs_job-jobname NUMBER rs_job-jobcount
AND RETURN.
ENDIF.
" Cerrar job
IF iv_immediate = abap_true.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = rs_job-jobcount
jobname = rs_job-jobname
strtimmed = abap_true
EXCEPTIONS
OTHERS = 1.
ELSE.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = rs_job-jobcount
jobname = rs_job-jobname
sdlstrtdt = iv_start_date
sdlstrttm = iv_start_time
EXCEPTIONS
OTHERS = 1.
ENDIF.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_job_error
EXPORTING textid = zcx_job_error=>job_close_failed.
ENDIF.
rs_job-status = 'S'. " Scheduled
ENDMETHOD.
METHOD generate_jobname.
DATA(lv_timestamp) = |{ sy-datum }{ sy-uzeit }|.
rv_name = |{ iv_prefix(20) }_{ lv_timestamp }|.
ENDMETHOD.
METHOD get_job_status.
DATA: ls_job TYPE tbtcjob.
CALL FUNCTION 'BP_JOB_READ'
EXPORTING
job_read_jobcount = iv_jobcount
job_read_jobname = iv_jobname
job_read_opcode = '20'
IMPORTING
job_read_jobhead = ls_job
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
rv_status = ls_job-status.
ENDIF.
ENDMETHOD.
METHOD wait_for_job.
DATA: lv_start TYPE i,
lv_elapsed TYPE i,
lv_status TYPE btcstatus.
GET RUN TIME FIELD lv_start.
DO.
lv_status = get_job_status( iv_jobname = iv_jobname
iv_jobcount = iv_jobcount ).
CASE lv_status.
WHEN 'F'. " Finished
rv_success = abap_true.
RETURN.
WHEN 'A'. " Aborted
rv_success = abap_false.
RETURN.
ENDCASE.
" Verificar timeout
GET RUN TIME FIELD lv_elapsed.
IF ( lv_elapsed - lv_start ) / 1000000 > iv_timeout.
rv_success = abap_false.
RETURN.
ENDIF.
" Esperar
WAIT UP TO 5 SECONDS.
ENDDO.
ENDMETHOD.
ENDCLASS.
" Uso
DATA(lo_scheduler) = NEW zcl_job_scheduler( ).
TRY.
DATA(ls_job) = lo_scheduler->schedule_report(
iv_report = 'ZMONTHLY_REPORT'
iv_variant = 'DEFAULT'
iv_immediate = abap_true
).
" Esperar finalizacion
IF lo_scheduler->wait_for_job(
iv_jobname = ls_job-jobname
iv_jobcount = ls_job-jobcount
iv_timeout = 600
) = abap_true.
MESSAGE 'Job finalizado exitosamente' TYPE 'S'.
ELSE.
MESSAGE 'Job fallido o timeout' TYPE 'E'.
ENDIF.
CATCH zcx_job_error INTO DATA(lx_error).
MESSAGE lx_error->get_text( ) TYPE 'E'.
ENDTRY.

7. Cadena de jobs (multiples steps)

DATA: lv_jobname TYPE btcjob VALUE 'ZCHAIN_JOB',
lv_jobcount TYPE btcjobcnt.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
" Step 1: Cargar datos
SUBMIT zload_data
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Step 2: Procesar datos
SUBMIT zprocess_data
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Step 3: Crear reporte
SUBMIT zcreate_report
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Step 4: Enviar notificacion
SUBMIT zsend_notification
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true
EXCEPTIONS
OTHERS = 1.

8. Iniciar job por evento

DATA: lv_jobname TYPE btcjob VALUE 'ZEVENT_JOB',
lv_jobcount TYPE btcjobcnt,
lv_eventid TYPE btceventid VALUE 'SAP_END_OF_DAY',
lv_eventparm TYPE btcevtparm.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
SUBMIT zend_of_day_processing
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Iniciar job por evento
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
event_id = lv_eventid
event_param = lv_eventparm
event_periodic = abap_true
EXCEPTIONS
OTHERS = 1.
" Disparar evento (ej. desde otro programa)
CALL FUNCTION 'BP_EVENT_RAISE'
EXPORTING
eventid = 'SAP_END_OF_DAY'
EXCEPTIONS
bad_eventid = 1
eventid_does_not_exist = 2
eventid_missing = 3
raise_failed = 4
OTHERS = 5.

9. Monitorear estado del job

CLASS zcl_job_monitor DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF ty_job_status,
jobname TYPE btcjob,
jobcount TYPE btcjobcnt,
status TYPE btcstatus,
startdate TYPE sy-datum,
starttime TYPE sy-uzeit,
enddate TYPE sy-datum,
endtime TYPE sy-uzeit,
duration TYPE i,
END OF ty_job_status,
ty_job_statuses TYPE STANDARD TABLE OF ty_job_status WITH KEY jobname jobcount.
METHODS: get_jobs_by_name
IMPORTING iv_jobname_pattern TYPE btcjob
RETURNING VALUE(rt_jobs) TYPE ty_job_statuses.
METHODS: get_failed_jobs
IMPORTING iv_from_date TYPE sy-datum DEFAULT sy-datum
RETURNING VALUE(rt_jobs) TYPE ty_job_statuses.
ENDCLASS.
CLASS zcl_job_monitor IMPLEMENTATION.
METHOD get_jobs_by_name.
DATA: lt_joblist TYPE TABLE OF tbtcjob.
CALL FUNCTION 'BP_FIND_JOBS_WITH_PROGRAM'
EXPORTING
jobname = iv_jobname_pattern
TABLES
joblist = lt_joblist
EXCEPTIONS
OTHERS = 1.
LOOP AT lt_joblist INTO DATA(ls_job).
APPEND VALUE #(
jobname = ls_job-jobname
jobcount = ls_job-jobcount
status = ls_job-status
startdate = ls_job-strtdate
starttime = ls_job-strttime
enddate = ls_job-enddate
endtime = ls_job-endtime
) TO rt_jobs.
ENDLOOP.
ENDMETHOD.
METHOD get_failed_jobs.
DATA: lt_joblist TYPE TABLE OF tbtcjob,
ls_jobselect TYPE tbtcselect.
ls_jobselect-jobname = '*'.
ls_jobselect-username = '*'.
ls_jobselect-from_date = iv_from_date.
ls_jobselect-to_date = sy-datum.
ls_jobselect-aborted = abap_true.
CALL FUNCTION 'BP_JOB_SELECT'
EXPORTING
jobselect_dialog = abap_false
jobsel_param_in = ls_jobselect
TABLES
jobselect_joblist = lt_joblist
EXCEPTIONS
OTHERS = 1.
LOOP AT lt_joblist INTO DATA(ls_job).
APPEND VALUE #(
jobname = ls_job-jobname
jobcount = ls_job-jobcount
status = ls_job-status
startdate = ls_job-strtdate
starttime = ls_job-strttime
) TO rt_jobs.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

10. Eliminar job

" Eliminar job individual
CALL FUNCTION 'BP_JOB_DELETE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
EXCEPTIONS
cant_delete_job = 1
cant_delete_joblog = 2
doesnt_exist = 3
job_running = 4
OTHERS = 5.
IF sy-subrc = 0.
MESSAGE 'Job eliminado' TYPE 'S'.
ELSEIF sy-subrc = 4.
MESSAGE 'Job aun en ejecucion - no se puede eliminar' TYPE 'W'.
ENDIF.
" Limpiar jobs antiguos (mas de 30 dias)
DATA: lt_joblist TYPE TABLE OF tbtcjob,
lv_cutoff TYPE sy-datum.
lv_cutoff = sy-datum - 30.
CALL FUNCTION 'BP_JOB_SELECT'
EXPORTING
jobselect_dialog = abap_false
jobsel_param_in = VALUE tbtcselect(
jobname = 'ZTEST*'
username = '*'
to_date = lv_cutoff
finished = abap_true
)
TABLES
jobselect_joblist = lt_joblist
EXCEPTIONS
OTHERS = 1.
LOOP AT lt_joblist INTO DATA(ls_job).
CALL FUNCTION 'BP_JOB_DELETE'
EXPORTING
jobcount = ls_job-jobcount
jobname = ls_job-jobname
EXCEPTIONS
OTHERS = 1.
ENDLOOP.

11. Leer log del job

DATA: lt_joblog TYPE TABLE OF tbtc5.
CALL FUNCTION 'BP_JOBLOG_READ'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
TABLES
joblogtbl = lt_joblog
EXCEPTIONS
cant_read_joblog = 1
jobcount_missing = 2
jobname_missing = 3
job_doesnt_exist = 4
OTHERS = 5.
IF sy-subrc = 0.
LOOP AT lt_joblog INTO DATA(ls_log).
WRITE: / ls_log-enterdate, ls_log-entertime, ls_log-text.
ENDLOOP.
ENDIF.

12. Salida spool en job

DATA: lv_jobname TYPE btcjob VALUE 'ZSPOOL_JOB',
lv_jobcount TYPE btcjobcnt,
ls_print TYPE pri_params.
" Establecer parametros de impresion
ls_print-pdest = 'LOCL'. " Impresora
ls_print-prnew = abap_true. " Nuevo spool
ls_print-prtxt = 'Job Output'.
ls_print-primm = abap_false. " No imprimir inmediatamente
ls_print-plist = 'X'. " Mantener spool
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
SUBMIT zreport_with_output
VIA JOB lv_jobname NUMBER lv_jobcount
TO SAP-SPOOL
SPOOL PARAMETERS ls_print
WITHOUT SPOOL DYNPRO
AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true
EXCEPTIONS
OTHERS = 1.

13. Job en servidor especifico

" Iniciar job en servidor de aplicaciones especifico
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true
targetsystem = 'server_name_001' " Servidor destino
EXCEPTIONS
OTHERS = 1.
" O: Usar grupo de servidores
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true
jobclass = 'A' " Clase de job A (maxima prioridad)
EXCEPTIONS
OTHERS = 1.

14. Interfaz XBP para control externo

" Para schedulers de jobs externos (Control-M, etc.)
" Crear job padre
DATA: lv_extprog TYPE btcxpg VALUE 'EXTERNAL_SCRIPT.SH'.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = 'ZEXTERNAL_JOB'
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
" Programa externo como step
CALL FUNCTION 'JOB_SUBMIT'
EXPORTING
jobcount = lv_jobcount
jobname = 'ZEXTERNAL_JOB'
extpgm_name = lv_extprog
extpgm_param = '-p parameter1'
extpgm_system = 'UNIX'
EXCEPTIONS
OTHERS = 1.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = 'ZEXTERNAL_JOB'
strtimmed = abap_true
EXCEPTIONS
OTHERS = 1.

15. Ejemplo practico: Jobs de cierre mensual

CLASS zcl_month_end_jobs DEFINITION.
PUBLIC SECTION.
METHODS: schedule_month_end
IMPORTING iv_period TYPE monat
iv_year TYPE gjahr
RETURNING VALUE(rt_jobs) TYPE zcl_job_scheduler=>ty_job_info_tab.
ENDCLASS.
CLASS zcl_month_end_jobs IMPLEMENTATION.
METHOD schedule_month_end.
DATA: lv_jobname TYPE btcjob,
lv_jobcount TYPE btcjobcnt,
lt_params TYPE rsparams_tt.
" Parametros comunes
lt_params = VALUE #(
( selname = 'P_GJAHR' kind = 'P' low = iv_year )
( selname = 'P_MONAT' kind = 'P' low = iv_period )
).
" Job 1: Conciliacion
lv_jobname = |ZMONTH_END_RECON_{ iv_year }{ iv_period }|.
CALL FUNCTION 'JOB_OPEN'
EXPORTING jobname = lv_jobname
IMPORTING jobcount = lv_jobcount
EXCEPTIONS OTHERS = 1.
SUBMIT zreconciliation
VIA JOB lv_jobname NUMBER lv_jobcount
WITH SELECTION-TABLE lt_params
AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true
EXCEPTIONS OTHERS = 1.
APPEND VALUE #( jobname = lv_jobname jobcount = lv_jobcount ) TO rt_jobs.
" Job 2: Cierre (inicia despues de Job 1 via evento)
lv_jobname = |ZMONTH_END_CLOSE_{ iv_year }{ iv_period }|.
CALL FUNCTION 'JOB_OPEN'
EXPORTING jobname = lv_jobname
IMPORTING jobcount = lv_jobcount
EXCEPTIONS OTHERS = 1.
SUBMIT zperiod_close
VIA JOB lv_jobname NUMBER lv_jobcount
WITH SELECTION-TABLE lt_params
AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
event_id = 'ZRECON_COMPLETE'
event_param = |{ iv_year }{ iv_period }|
EXCEPTIONS OTHERS = 1.
APPEND VALUE #( jobname = lv_jobname jobcount = lv_jobcount ) TO rt_jobs.
" Job 3: Reporting (inicia despues de Job 2)
lv_jobname = |ZMONTH_END_REPORT_{ iv_year }{ iv_period }|.
CALL FUNCTION 'JOB_OPEN'
EXPORTING jobname = lv_jobname
IMPORTING jobcount = lv_jobcount
EXCEPTIONS OTHERS = 1.
SUBMIT zmonth_report
VIA JOB lv_jobname NUMBER lv_jobcount
WITH SELECTION-TABLE lt_params
AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
event_id = 'ZCLOSE_COMPLETE'
event_param = |{ iv_year }{ iv_period }|
EXCEPTIONS OTHERS = 1.
APPEND VALUE #( jobname = lv_jobname jobcount = lv_jobcount ) TO rt_jobs.
ENDMETHOD.
ENDCLASS.

Clases de job (Prioridades)

ClaseDescripcion
AMaxima prioridad
BAlta prioridad
CPrioridad normal (estandar)

Notas importantes / Mejores practicas

  • Nombres de job unicos con fecha/hora para trazabilidad.
  • Variantes para jobs repetitivos con los mismos parametros.
  • Eventos para cadenas de jobs en lugar de horarios fijos.
  • Clase de job segun urgencia.
  • Manejo de errores en reports para logs descriptivos.
  • Salida spool configurar para protocolo.
  • SM37 para monitoreo manual de jobs.
  • Limpiar jobs antiguos regularmente (rendimiento).
  • Autorizaciones para scheduling de jobs verificar (S_BTCH_ADM, S_BTCH_JOB).
  • Combinar con Procesamiento paralelo para rendimiento.