Background Jobs ermöglichen die zeitgesteuerte oder ereignisbasierte Ausführung von ABAP-Programmen ohne Benutzerinteraktion. Mit JOB_OPEN, SUBMIT und JOB_CLOSE können Jobs programmatisch erstellt und geplant werden.
Grundkonzept
| Funktion | Beschreibung |
|---|---|
JOB_OPEN | Job anlegen und öffnen |
SUBMIT ... VIA JOB | Report zum Job hinzufügen |
JOB_CLOSE | Job schließen und planen |
BP_JOB_DELETE | Job löschen |
BP_JOB_READ | Job-Status lesen |
Job-Status
| Status | Bedeutung |
|---|---|
| P (Planned) | Geplant, wartet auf Start |
| S (Scheduled) | Freigegeben |
| R (Running) | Läuft gerade |
| F (Finished) | Erfolgreich beendet |
| A (Aborted) | Abgebrochen |
Beispiele
1. Einfachen Job anlegen
DATA: lv_jobname TYPE btcjob VALUE 'ZTEST_JOB', lv_jobcount TYPE btcjobcnt.
" Job öffnenCALL 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 'Job konnte nicht angelegt werden' TYPE 'E'. RETURN.ENDIF.
" Report zum Job hinzufügenSUBMIT zreport VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Job schließen und sofort startenCALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_jobcount jobname = lv_jobname strtimmed = abap_true " Sofort starten 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 } wurde gestartet| TYPE 'S'.ENDIF.2. Job mit Startzeit planen
DATA: lv_jobname TYPE btcjob VALUE 'ZNIGHTLY_REPORT', lv_jobcount TYPE btcjobcnt, lv_startdate TYPE sy-datum, lv_starttime TYPE sy-uzeit.
" Morgen um 02:00 Uhr startenlv_startdate = sy-datum + 1.lv_starttime = '020000'.
" Job öffnenCALL FUNCTION 'JOB_OPEN' EXPORTING jobname = lv_jobname IMPORTING jobcount = lv_jobcount EXCEPTIONS OTHERS = 1.
IF sy-subrc <> 0. RETURN.ENDIF.
" Report hinzufügenSUBMIT zreport_nightly VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Job mit Startzeit planenCALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_jobcount jobname = lv_jobname sdlstrtdt = lv_startdate " Startdatum sdlstrttm = lv_starttime " Startzeit EXCEPTIONS OTHERS = 1.
IF sy-subrc = 0. MESSAGE |Job geplant für { lv_startdate DATE = USER } { lv_starttime TIME = USER }| TYPE 'S'.ENDIF.3. Job mit Selektionsparametern
DATA: lv_jobname TYPE btcjob VALUE 'ZCUSTOMER_EXPORT', lv_jobcount TYPE btcjobcnt, lt_seltab TYPE TABLE OF rsparams, lv_variant TYPE raldb_vari.
" Selektionsparameter aufbauenlt_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 mit SelektionsparameternSUBMIT 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 mit Variante
" Report mit gespeicherter Variante ausführenSUBMIT zmonthly_report VIA JOB lv_jobname NUMBER lv_jobcount USING SELECTION-SET 'MONTHLY_DEFAULT' " Variante AND RETURN.5. Periodischer Job (täglich, wöchentlich)
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.
" Job öffnenCALL 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.
" Täglich um 23:00 UhrCALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_jobcount jobname = lv_jobname sdlstrtdt = sy-datum sdlstrttm = '230000' prddays = 1 " Alle 1 Tage periodic = abap_true " Periodisch EXCEPTIONS OTHERS = 1.
" Alternative: Wöchentlich (jeden Montag)CALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_jobcount jobname = lv_jobname sdlstrtdt = '20240101' " Erster Montag sdlstrttm = '060000' prdweeks = 1 " Wöchentlich periodic = abap_true EXCEPTIONS OTHERS = 1.6. Job-Klasse für wiederverwendbare Jobs
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. " Jobname generieren rs_job-jobname = generate_jobname( iv_report ).
" Job öffnen 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.
" Report einplanen 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.
" Job schließen 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.
" Timeout prüfen GET RUN TIME FIELD lv_elapsed. IF ( lv_elapsed - lv_start ) / 1000000 > iv_timeout. rv_success = abap_false. RETURN. ENDIF.
" Warten WAIT UP TO 5 SECONDS. ENDDO. ENDMETHOD.ENDCLASS.
" VerwendungDATA(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 ).
" Auf Fertigstellung warten IF lo_scheduler->wait_for_job( iv_jobname = ls_job-jobname iv_jobcount = ls_job-jobcount iv_timeout = 600 ) = abap_true. MESSAGE 'Job erfolgreich beendet' TYPE 'S'. ELSE. MESSAGE 'Job fehlgeschlagen oder Timeout' TYPE 'E'. ENDIF.
CATCH zcx_job_error INTO DATA(lx_error). MESSAGE lx_error->get_text( ) TYPE 'E'.ENDTRY.7. Job-Kette (mehrere 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: Daten ladenSUBMIT zload_data VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Step 2: Daten verarbeitenSUBMIT zprocess_data VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Step 3: Report erstellenSUBMIT zcreate_report VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.
" Step 4: Email versendenSUBMIT 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. Job nach Ereignis starten
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.
" Job bei Ereignis startenCALL 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.
" Ereignis auslösen (z.B. aus anderem Programm)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. Job-Status überwachen
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. Job löschen
" Einzelnen Job löschenCALL 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 gelöscht' TYPE 'S'.ELSEIF sy-subrc = 4. MESSAGE 'Job läuft noch - kann nicht gelöscht werden' TYPE 'W'.ENDIF.
" Alte Jobs bereinigen (älter als 30 Tage)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. Job-Log lesen
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. Spool-Ausgabe im Job
DATA: lv_jobname TYPE btcjob VALUE 'ZSPOOL_JOB', lv_jobcount TYPE btcjobcnt, ls_print TYPE pri_params.
" Druckparameter setzenls_print-pdest = 'LOCL'. " Druckerls_print-prnew = abap_true. " Neuer Spoolls_print-prtxt = 'Job Output'.ls_print-primm = abap_false. " Nicht sofort druckenls_print-plist = 'X'. " Spool behalten
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 auf bestimmtem Server
" Job auf spezifischem Applikationsserver startenCALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_jobcount jobname = lv_jobname strtimmed = abap_true targetsystem = 'server_name_001' " Zielserver EXCEPTIONS OTHERS = 1.
" Oder: Servergruppe verwendenCALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_jobcount jobname = lv_jobname strtimmed = abap_true jobclass = 'A' " Job-Klasse A (höchste Priorität) EXCEPTIONS OTHERS = 1.14. XBP-Interface für externe Steuerung
" Für externe Job-Schedulers (Control-M, etc.)" Parent-Job anlegenDATA: lv_extprog TYPE btcxpg VALUE 'EXTERNAL_SCRIPT.SH'.
CALL FUNCTION 'JOB_OPEN' EXPORTING jobname = 'ZEXTERNAL_JOB' IMPORTING jobcount = lv_jobcount EXCEPTIONS OTHERS = 1.
" Externes Programm als StepCALL 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. Praktisches Beispiel: Monatsabschluss-Jobs
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.
" Gemeinsame Parameter lt_params = VALUE #( ( selname = 'P_GJAHR' kind = 'P' low = iv_year ) ( selname = 'P_MONAT' kind = 'P' low = iv_period ) ).
" Job 1: Abstimmung 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: Abschluss (startet nach Job 1 via Event) 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 (startet nach 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.Job-Klassen (Prioritäten)
| Klasse | Beschreibung |
|---|---|
| A | Höchste Priorität |
| B | Hohe Priorität |
| C | Normale Priorität (Standard) |
Wichtige Hinweise / Best Practice
- Eindeutige Jobnamen mit Datum/Zeit für Nachverfolgbarkeit.
- Varianten für wiederholte Jobs mit gleichen Parametern.
- Ereignisse für Job-Ketten statt fester Zeiten.
- Job-Klasse entsprechend Dringlichkeit wählen.
- Fehlerbehandlung in Reports für aussagekräftige Logs.
- Spool-Ausgabe für Protokollierung konfigurieren.
- SM37 für manuelle Job-Überwachung.
- Alte Jobs regelmäßig bereinigen (Performance).
- Berechtigungen für Job-Scheduling prüfen (S_BTCH_ADM, S_BTCH_JOB).
- Kombinieren Sie mit Parallel Processing für Performance.