ABAP Background Jobs: JOB_OPEN, SUBMIT, Scheduling

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

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

FunktionBeschreibung
JOB_OPENJob anlegen und öffnen
SUBMIT ... VIA JOBReport zum Job hinzufügen
JOB_CLOSEJob schließen und planen
BP_JOB_DELETEJob löschen
BP_JOB_READJob-Status lesen

Job-Status

StatusBedeutung
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 öffnen
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 'Job konnte nicht angelegt werden' TYPE 'E'.
RETURN.
ENDIF.
" Report zum Job hinzufügen
SUBMIT zreport
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Job schließen und sofort starten
CALL 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 starten
lv_startdate = sy-datum + 1.
lv_starttime = '020000'.
" Job öffnen
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
RETURN.
ENDIF.
" Report hinzufügen
SUBMIT zreport_nightly
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Job mit Startzeit planen
CALL 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 aufbauen
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 mit Selektionsparametern
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 mit Variante

" Report mit gespeicherter Variante ausführen
SUBMIT 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 öffnen
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.
" Täglich um 23:00 Uhr
CALL 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.
" Verwendung
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
).
" 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 laden
SUBMIT zload_data
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Step 2: Daten verarbeiten
SUBMIT zprocess_data
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Step 3: Report erstellen
SUBMIT zcreate_report
VIA JOB lv_jobname NUMBER lv_jobcount
AND RETURN.
" Step 4: Email versenden
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. 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 starten
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.
" 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öschen
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 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 setzen
ls_print-pdest = 'LOCL'. " Drucker
ls_print-prnew = abap_true. " Neuer Spool
ls_print-prtxt = 'Job Output'.
ls_print-primm = abap_false. " Nicht sofort drucken
ls_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 starten
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = abap_true
targetsystem = 'server_name_001' " Zielserver
EXCEPTIONS
OTHERS = 1.
" Oder: Servergruppe verwenden
CALL 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 anlegen
DATA: 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 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. 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)

KlasseBeschreibung
AHöchste Priorität
BHohe Priorität
CNormale 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.