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
| Fonction | Description |
|---|---|
JOB_OPEN | Creer et ouvrir un job |
SUBMIT ... VIA JOB | Ajouter un report au job |
JOB_CLOSE | Fermer et planifier le job |
BP_JOB_DELETE | Supprimer un job |
BP_JOB_READ | Lire le statut d’un job |
Statuts des jobs
| Statut | Signification |
|---|---|
| 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 jobCALL 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 jobSUBMIT zreport VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Fermer le job et demarrer immediatementCALL 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 02h00lv_startdate = sy-datum + 1.lv_starttime = '020000'.
" Ouvrir le jobCALL FUNCTION 'JOB_OPEN" EXPORTING jobname = lv_jobname IMPORTING jobcount = lv_jobcount EXCEPTIONS OTHERS = 1.
IF sy-subrc <> 0. RETURN.ENDIF.
" Ajouter le reportSUBMIT zreport_nightly VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Planifier le job avec heure de demarrageCALL 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 selectionlt_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 selectionSUBMIT 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 enregistreeSUBMIT 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 jobCALL 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 23h00CALL 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.
" UtilisationDATA(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 donneesSUBMIT zload_data VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Etape 2 : Traiter les donneesSUBMIT zprocess_data VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Etape 3 : Creer le rapportSUBMIT zcreate_report VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Etape 4 : Envoyer la notificationSUBMIT 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'evenementCALL 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 individuelCALL 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'impressionls_print-pdest = 'LOCL'. " Imprimantels_print-prnew = abap_true. " Nouveau spoolls_print-prtxt = 'Job Output'.ls_print-primm = abap_false. " Ne pas imprimer immediatementls_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 specifiqueCALL 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 serveursCALL 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 parentDATA: 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 etapeCALL 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)
| Classe | Description |
|---|---|
| A | Priorite maximale |
| B | Haute priorite |
| C | Priorite 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.