So verhinderst du Jobstarts zur falschen Zeit

Kennst du das? Du willst in SAP einen Job nur zu bestimmten Zeiten laufen lassen. Zum Beispiel nachts zwischen 22:00 und 6:00 Uhr oder nur an Werktagen. Klingt simpel, ist aber in der Praxis gar nicht so trivial.

Das ursprüngliche Problem

Wenn du in einem Report einfach eine Fehlermeldung wirfst, wenn der Job in einem „verbotenen“ Zeitraum läuft, dann zeigt dir die SM37 den Job rot an, also als abgebrochen.
Die Basis sieht das und denkt sofort: „Fehler, wir müssen eingreifen.“ Dabei war es ja eigentlich nur eine gewollte Sperre, damit der Job nicht zur falschen Zeit läuft.

Früher hatte ich es so gelöst, dass ich einen zweiten Job gestartet habe, den Status nachträglich auf „erfolgreich beendet“ gesetzt und damit den roten Eintrag wieder glattgebügelt habe. Funktioniert, ist aber unnötig komplex.

Die einfache Lösung

Der Trick: Du setzt den Job direkt im laufenden Programm auf Status „F“ (finished), bevor du die Fehlermeldung wirfst.
SAP macht dann folgendes:

  • es schreibt eine A-Meldung ins Joblog, die sauber erklärt, warum der Job nicht lief
  • versucht anschließend den Status auf „abgebrochen“ zu setzen – merkt aber: der Job steht schon auf „F“
  • Ergebnis: In der SM37 sieht der Job so aus, als wäre er erfolgreich beendet. Kein rotes Kreuz, kein Alarm bei der Basis.

Gleichzeitig steht im Joblog der Grund, warum er nicht ausgeführt wurde. Genau das, was du willst.

Proof of Concept – der ABAP Report

Hier der Report, der das Ganze zeigt. In der Variante unten prüft er nur auf Uhrzeiten, du kannst das aber easy erweitern (z. B. Wochentage, Feiertage, etc.):

REPORT zdemo_job_execution_control NO STANDARD PAGE HEADING.

SELECT-OPTIONS: s_uzeit FOR sy-uzeit.

GET TIME.
IF sy-uzeit NOT IN s_uzeit.

  DATA eventid                 TYPE tbtcm-eventid.
  DATA eventparm               TYPE tbtcm-eventparm.
  DATA external_program_active TYPE tbtcm-xpgactive.
  DATA jobcount                TYPE tbtcm-jobcount.
  DATA jobname                 TYPE tbtcm-jobname.
  DATA stepcount               TYPE tbtcm-stepcount.

  CALL FUNCTION 'GET_JOB_RUNTIME_INFO'
    IMPORTING
      eventid                 = eventid
      eventparm               = eventparm
      external_program_active = external_program_active
      jobcount                = jobcount
      jobname                 = jobname
      stepcount               = stepcount
    EXCEPTIONS
      no_runtime_info         = 1
      OTHERS                  = 2.

  IF jobname IS NOT INITIAL
     AND jobcount IS NOT INITIAL.
    UPDATE tbtco SET status = 'F' " Finished
      WHERE jobname  = @jobname
        AND jobcount = @jobcount.
    MESSAGE e398(00) WITH 'Jobausführung nicht in erlaubtem Zeitraum'.
  ENDIF.
ENDIF.

Fazit

Manchmal ist die beste Lösung die einfachste: Statt umständlich mit zusätzlichen Jobs herumzutricksen, kannst du das Problem direkt im Report selbst lösen.
So bleibt die Jobübersicht sauber, die Basis bleibt entspannt und du hast trotzdem volle Kontrolle über die Laufzeiten deiner Jobs.

Danke an Stefan!

Enno Wulff