Jobs d

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

Les jobs d’arriere-plan permettent l’execution planifiee ou basee sur des evenements de programmes ABAP sans interaction utilisateur. Avec JOB_OPEN, SUBMIT et JOB_CLOSE, les jobs peuvent etre crees et planifies de maniere programmatique.

Concept de base

FonctionDescription
JOB_OPENCreer et ouvrir un job
SUBMIT ... VIA JOBAjouter un report au job
JOB_CLOSEFermer et planifier le job
BP_JOB_DELETESupprimer un job
BP_JOB_READLire le statut d’un job

Statuts des jobs

StatutSignification
P (Planned)Planifie, en attente de demarrage
S (Scheduled)Libere
R (Running)En cours d’execution
F (Finished)Termine avec succes
A (Aborted)Abandonne

Exemples

1. Creer un job simple

DATA: lv_jobname TYPE btcjob VALUE 'ZTEST_JOB',
lv_jobcount TYPE btcjobcnt.
" Ouvrir le 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 'Le job n''a pas pu etre cree' TYPE 'E'.
RETURN.
ENDIF.
" Ajouter le report au job
SUBMIT zreport
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Fermer le job et demarrer immediatement
CALL FUNCTION 'JOB_CLOSE"
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true " Demarrer immediatement
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 |Le job { lv_jobname } a ete demarre| TYPE 'S'.
ENDIF.

2. Planifier un job avec heure de demarrage

DATA: lv_jobname TYPE btcjob VALUE 'ZNIGHTLY_REPORT',
lv_jobcount TYPE btcjobcnt,
lv_startdate TYPE sy-datum,
lv_starttime TYPE sy-uzeit.
" Demarrer demain a 02h00
lv_startdate = sy-datum + 1.
lv_starttime = '020000'.
" Ouvrir le job
CALL FUNCTION 'JOB_OPEN"
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
RETURN.
ENDIF.
" Ajouter le report
SUBMIT zreport_nightly
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Planifier le job avec heure de demarrage
CALL FUNCTION 'JOB_CLOSE"
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
sdlstrtdt = lv_startdate " Date de demarrage
sdlstrttm = lv_starttime " Heure de demarrage
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
MESSAGE |Job planifie pour { lv_startdate DATE = USER } { lv_starttime TIME = USER }| TYPE 'S'.
ENDIF.

3. Job avec parametres de selection

DATA: lv_jobname TYPE btcjob VALUE 'ZCUSTOMER_EXPORT',
lv_jobcount TYPE btcjobcnt,
lt_seltab TYPE TABLE OF rsparams,
lv_variant TYPE raldb_vari.
" Construire les parametres de selection
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 avec parametres de selection
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 avec variante

" Executer le report avec une variante enregistree
SUBMIT zmonthly_report
VIA JOB lv_jobname NUMBER lv_jobcount
USING SELECTION-SET 'MONTHLY_DEFAULT' " Variante
AND RETURN.

5. Job periodique (quotidien, hebdomadaire)

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.
" Ouvrir le 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.
" Quotidiennement a 23h00
CALL FUNCTION 'JOB_CLOSE"
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
sdlstrtdt = sy-datum
sdlstrttm = '230000"
prddays = 1 " Tous les 1 jours
periodic = abap_true " Periodique
EXCEPTIONS
OTHERS = 1.
" Alternative : Hebdomadaire (chaque lundi)
CALL FUNCTION 'JOB_CLOSE"
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
sdlstrtdt = '20240101' " Premier lundi
sdlstrttm = '060000"
prdweeks = 1 " Hebdomadaire
periodic = abap_true
EXCEPTIONS
OTHERS = 1.

6. Classe de job pour jobs reutilisables

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.
" Generer le nom du job
rs_job-jobname = generate_jobname( iv_report ).
" Ouvrir le 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.
" Planifier le 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.
" Fermer le 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'. " Planifie
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'. " Termine
rv_success = abap_true.
RETURN.
WHEN 'A'. " Abandonne
rv_success = abap_false.
RETURN.
ENDCASE.
" Verifier le timeout
GET RUN TIME FIELD lv_elapsed.
IF ( lv_elapsed - lv_start ) / 1000000 > iv_timeout.
rv_success = abap_false.
RETURN.
ENDIF.
" Attendre
WAIT UP TO 5 SECONDS.
ENDDO.
ENDMETHOD.
ENDCLASS.
" Utilisation
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
).
" Attendre la fin
IF lo_scheduler->wait_for_job(
iv_jobname = ls_job-jobname
iv_jobcount = ls_job-jobcount
iv_timeout = 600
) = abap_true.
MESSAGE 'Job termine avec succes' TYPE 'S'.
ELSE.
MESSAGE 'Job echoue ou timeout' TYPE 'E'.
ENDIF.
CATCH zcx_job_error INTO DATA(lx_error).
MESSAGE lx_error->get_text( ) TYPE 'E'.
ENDTRY.

7. Chaine de jobs (plusieurs etapes)

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.
" Etape 1 : Charger les donnees
SUBMIT zload_data
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Etape 2 : Traiter les donnees
SUBMIT zprocess_data
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Etape 3 : Creer le rapport
SUBMIT zcreate_report
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Etape 4 : Envoyer la notification
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. Demarrer un job apres un evenement

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.
" Demarrer le job lors de l'evenement
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.
" Declencher l'evenement (par ex. depuis un autre programme)
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. Surveiller le statut des jobs

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. Supprimer un job

" Supprimer un job individuel
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 supprime' TYPE 'S'.
ELSEIF sy-subrc = 4.
MESSAGE 'Le job est encore en cours - ne peut pas etre supprime' TYPE 'W'.
ENDIF.
" Nettoyer les anciens jobs (plus de 30 jours)
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. Lire le journal du 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. Sortie spool dans un job

DATA: lv_jobname TYPE btcjob VALUE 'ZSPOOL_JOB',
lv_jobcount TYPE btcjobcnt,
ls_print TYPE pri_params.
" Definir les parametres d'impression
ls_print-pdest = 'LOCL'. " Imprimante
ls_print-prnew = abap_true. " Nouveau spool
ls_print-prtxt = 'Job Output'.
ls_print-primm = abap_false. " Ne pas imprimer immediatement
ls_print-plist = 'X'. " Conserver le 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 sur un serveur specifique

" Demarrer le job sur un serveur d'application specifique
CALL FUNCTION 'JOB_CLOSE"
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true
targetsystem = 'server_name_001' " Serveur cible
EXCEPTIONS
OTHERS = 1.
" Ou : Utiliser un groupe de serveurs
CALL FUNCTION 'JOB_CLOSE"
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true
jobclass = 'A' " Classe de job A (priorite maximale)
EXCEPTIONS
OTHERS = 1.

14. Interface XBP pour controle externe

" Pour les planificateurs de jobs externes (Control-M, etc.)
" Creer un job parent
DATA: lv_extprog TYPE btcxpg VALUE 'EXTERNAL_SCRIPT.SH'.
CALL FUNCTION 'JOB_OPEN"
EXPORTING
jobname = 'ZEXTERNAL_JOB"
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
" Programme externe comme etape
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. Exemple pratique : Jobs de cloture mensuelle

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.
" Parametres communs
lt_params = VALUE #(
( selname = 'P_GJAHR' kind = 'P' low = iv_year )
( selname = 'P_MONAT' kind = 'P' low = iv_period )
).
" Job 1 : Rapprochement
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 : Cloture (demarre apres Job 1 via evenement)
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 (demarre apres 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.

Classes de jobs (priorites)

ClasseDescription
APriorite maximale
BHaute priorite
CPriorite normale (par defaut)

Remarques importantes / Bonnes pratiques

  • Noms de jobs uniques avec date/heure pour la tracabilite.
  • Variantes pour les jobs repetes avec les memes parametres.
  • Evenements pour les chaines de jobs plutot que des heures fixes.
  • Classe de job selon l’urgence.
  • Gestion des erreurs dans les reports pour des journaux explicites.
  • Configurer la sortie spool pour la journalisation.
  • SM37 pour la surveillance manuelle des jobs.
  • Nettoyer regulierement les anciens jobs (performance).
  • Verifier les autorisations pour la planification de jobs (S_BTCH_ADM, S_BTCH_JOB).
  • Combinez avec le Traitement parallele pour la performance.