*---------------------------------------------------------------------*
*                  Z _ B J H _ J O B _ A N S T O S S                  *
*                                                                     *
*                  Autor: Bernd Haase (BJH Software)                  *
*---------------------------------------------------------------------*
* Programm zum Anstoß eines Jobs. Dadurch kann Zeit gespart werden,   *
* wenn der Job z.B. eine Stückliste auflösen soll, das Anstoßprogramm *
* aber x Stücklisten benötigt. In diesem Programm soll das rufende    *
* Programm nur x Sekunden warten. Das auslösende / jobrufende Programm*
* prüft jede Sekunde, ob der Job schon durch ist.Die Parameterübergabe*
* erfolgt über eine Zwischendatei und festverdrahteten Schlüsseln.    *
*---------------------------------------------------------------------*
* Abklatsch aus C14H_JOB_START, FB nicht direkt verwendbar, da die    *
* Jobcount nicht zurückübergeben wird.                                *
*---------------------------------------------------------------------*
* 07.04.2005 BHaa: Programm erstellt                                  *
*---------------------------------------------------------------------*
REPORT  z_bjh_job_anstoss .

TABLES:
* Testdatei für die Übergabe, beinhaltet nur 2 Felder
* schl (=Key-Feld) 1-einstellig, wert numc 3-stellig
 zzv_test.     "Datei zur Übergabe der Parameter

CONSTANTS:
 btc_stdt_immediate  LIKE  tbtcstrt-startdttyp VALUE 'I',
 btc_stdt_datetime   LIKE  tbtcstrt-startdttyp VALUE 'D',
 btc_stdt_event      LIKE  tbtcstrt-startdttyp VALUE 'E',
 btc_stdt_afterjob   LIKE  tbtcstrt-startdttyp VALUE 'A',
 btc_stdt_onworkday  LIKE  tbtcstrt-startdttyp VALUE 'W',
 btc_process_always  LIKE btch0000-char1       VALUE ' '.

DATA:
 wa_test LIKE zzv_test,
 anzahl(6) TYPE n.

*****************************
* Stati der Jobverarbeitung *
*****************************
DATA:
 BEGIN OF x,
   aborted(1)     TYPE c,  "Status 'abgebrochen'
   finished(1)    TYPE c,  "Status 'beendet'
   preliminary(1) TYPE c,  "Status 'vorläufig eingeplant'
   ready(1)       TYPE c,  "Status 'bereit zur Ausführung'
   running(1)     TYPE c,  "Status 'aktiv'
   scheduled(1)   TYPE c,  "Status 'Einplanung freigegeben'
 END OF x.

DATA:
 i_stdt    LIKE tbtcstrt.

*       Job number which was generated
DATA: l_jobcount         LIKE tbtco-jobcount.
*       jobname and jobtext
DATA: l_authcknam        LIKE tbtcjob-authcknam.
DATA: l_job_was_released LIKE btch0000-char1.
DATA: l_start_immediate  LIKE btch0000-char1.
*       starttime
DATA: l_stdt             LIKE tbtcstrt.
DATA: user_print_params  LIKE pri_params.
DATA: user_arch_params   LIKE arc_params.
DATA : v_valid TYPE c.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* wieviel Sekunden soll der Job laufen
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.
PARAMETERS:
* Jobname, abprüfbar dann im SM37
 pm_job  LIKE tbtco-jobname  DEFAULT 'BJH_TEST',
* welches Programm soll gestartet werden
 pm_prog  LIKE tbist-repname DEFAULT 'ZMDE_BJH_JOB_WARTEN',
* Variante im Programm
 pm_varia LIKE tbist-variant DEFAULT '',
* Laufdauer in Sekunden
 pm_sek(3) TYPE n            DEFAULT 10.
SELECTION-SCREEN: END OF BLOCK a1.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.

* geht nicht, werden nicht übergeben
*  EXPORT pm_sek TO MEMORY ID 'ZZ_TEST_JOB_SEK'.

* also so über Extra-Tabelle
 SELECT SINGLE * FROM zzv_test INTO wa_test
 WHERE schl = 'A'.
 IF sy-subrc = 0.
   UPDATE zzv_test
   SET   wert = pm_sek
   WHERE schl = 'A'.
 ELSE.
   MOVE 'A'    TO wa_test-schl.
   MOVE pm_sek TO wa_test-wert.
   INSERT INTO zzv_test VALUES wa_test.
 ENDIF.

* Prozedur für das Starten eines Jobs (FB C14H_JOB_START)
* der Funktionsbaustein eignet sich nicht, da in der dortigen Funk-
* tionsgruppe keine Möglichkeit zum Auslesen des Jobstatus besteht
 PERFORM upro-job_starten.

 CLEAR: anzahl, x.

* Schleife, die solange läuft wie auch der Job läuft, wobei die Anzahl
* wie die eingegebenen Sekunden +2 zu rechnen ist, da der 1. Durchlauf
* sofort ist und der letzte den Abbruch feststellt
 WHILE x-finished IS INITIAL
 AND   x-aborted  IS INITIAL.
   ADD 1 TO anzahl.

* schauen, ob der angestartete Prozeß noch aktiv ist. Die dort über-
* gebenen Flag beeinflussen die While-Schleife
   PERFORM upro-job_aktiv.

* 'ne Sekunde warten, bevor nächster Durchlauf
   WAIT UP TO 1 SECONDS.
 ENDWHILE.

 WRITE: / anzahl, 'Durchläufe'.

END-OF-SELECTION.
 EXIT.

*---------------------------------------------------------------------*
*                       J O B _ S T A R T E N                         *
*---------------------------------------------------------------------*
* Job initiieren und sofort starten. Keine Einplanung zu einem        *
* bestimmten Zeitpunkt, dieses wäre aber auch über die Parameter mög- *
* lich. Die Folge und Werte entsprechen auch der SM36.                *
*---------------------------------------------------------------------*
FORM upro-job_starten.

 i_stdt-startdttyp = 'I'.  "Sofortstart

 CALL FUNCTION 'GET_PRINT_PARAMETERS'
      EXPORTING
           mode                   = 'BATCH'
           report                 = pm_prog
           no_dialog              = 'X'
      IMPORTING
           out_archive_parameters = user_arch_params
           out_parameters         = user_print_params
           valid                  = v_valid
      EXCEPTIONS
           archive_info_not_found = 1
           invalid_print_params   = 2
           invalid_archive_params = 3
           OTHERS                 = 4.

* create job
 CALL FUNCTION 'JOB_OPEN'
      EXPORTING
*           DELANFREP        = ' '
*           JOBGROUP         = ' '
           jobname          = pm_job
*           SDLSTRTDT        = NO_DATE
*           SDLSTRTTM        = NO_TIME
      IMPORTING
           jobcount         = l_jobcount
      EXCEPTIONS
           cant_create_job  = 1
           invalid_job_data = 2
           jobname_missing  = 3
           OTHERS           = 4.
 IF NOT sy-subrc IS INITIAL.
   RAISE error_job_open.
 ENDIF.

* create the report as a step in the batch job
 l_authcknam = sy-uname.
 CALL FUNCTION 'JOB_SUBMIT'
      EXPORTING
*           ARCPARAMS                   = ' '
           authcknam                   = l_authcknam
*           EXTPGM_NAME                 = ' '
*           EXTPGM_PARAM                = ' '
*           EXTPGM_SET_TRACE_ON         = ' '
*           EXTPGM_STDERR_IN_JOBLOG     = 'X'
*           EXTPGM_STDOUT_IN_JOBLOG     = 'X'
*           EXTPGM_SYSTEM               = ' '
*           EXTPGM_WAIT_FOR_TERMINATION = 'X'
           jobcount                    = l_jobcount
           jobname                     = pm_job
*           LANGUAGE                    = SY-LANGU
           priparams                   = user_print_params
           arcparams                   = user_arch_params
           report                      = pm_prog
           variant                     = pm_varia
      EXCEPTIONS
           bad_priparams               = 1
           bad_xpgflags                = 2
           invalid_jobdata             = 3
           jobname_missing             = 4
           job_notex                   = 5
           job_submit_failed           = 6
           lock_failed                 = 7
           program_missing             = 8
           prog_abap_and_extpg_set     = 9
           OTHERS                      = 10.
 IF NOT sy-subrc IS INITIAL.
   RAISE error_job_submit.
 ENDIF.

* check if start job immediate and set flag
 l_stdt = i_stdt.
 CASE l_stdt-startdttyp.
   WHEN btc_stdt_immediate.
     l_start_immediate = 'X'.
     l_stdt-sdlstrtdt  = space.
     l_stdt-sdlstrttm  = space.
     l_stdt-laststrtdt = space.
     l_stdt-laststrttm = space.
   WHEN btc_stdt_datetime.
   WHEN btc_stdt_event.
   WHEN btc_stdt_afterjob.
 ENDCASE.

* close the job definition and start the job
 CALL FUNCTION 'JOB_CLOSE'
      EXPORTING
*           at_opmode                   = l_stdt-baname
*           AT_OPMODE_PERIODIC          = ' '
           calendar_id                 = l_stdt-calendarid
           event_id                    = l_stdt-eventid
           event_param                 = l_stdt-eventparm
           event_periodic              = l_stdt-periodic
           jobcount                    = l_jobcount
           jobname                     = pm_job
           laststrtdt                  = l_stdt-laststrtdt
           laststrttm                  = l_stdt-laststrttm
           prddays                     = l_stdt-prddays
           prdhours                    = l_stdt-prdhours
           prdmins                     = l_stdt-prdmins
           prdmonths                   = l_stdt-prdmonths
           prdweeks                    = l_stdt-prdweeks
           predjob_checkstat           = l_stdt-checkstat
           pred_jobcount               = l_stdt-predjobcnt
           pred_jobname                = l_stdt-predjob
           sdlstrtdt                   = l_stdt-sdlstrtdt
           sdlstrttm                   = l_stdt-sdlstrttm
           startdate_restriction       = btc_process_always
           strtimmed                   = l_start_immediate
           targetsystem                = l_stdt-instname
           start_on_workday_not_before = l_stdt-notbefore
           start_on_workday_nr         = l_stdt-wdayno
           workday_count_direction     = l_stdt-wdaycdir
      IMPORTING
           job_was_released            = l_job_was_released
      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 NOT sy-subrc IS INITIAL.
   RAISE error_job_close.
 ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*                          J O B _ A K T I V                          *
*---------------------------------------------------------------------*
* prüfen, ob der angestossene Job noch läuft oder schon beendet ist   *
* oder eventuell sogar abgebrochen wurde. Das Ergebnis wird in Form   *
* der Form aus dem Baustein zurückübergeben und kann hier für die     *
* weitere Verarbeitung genutzt werden.                                *
*---------------------------------------------------------------------*
FORM upro-job_aktiv.

 CALL FUNCTION 'SHOW_JOBSTATE'
      EXPORTING
           jobcount         = l_jobcount
           jobname          = pm_job
      IMPORTING
           aborted          = x-aborted
           finished         = x-finished
           preliminary      = x-preliminary
           ready            = x-ready
           running          = x-running
           scheduled        = x-scheduled
      EXCEPTIONS
           jobcount_missing = 1
           jobname_missing  = 2
           job_notex        = 3
           OTHERS           = 4.

 IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
 ENDIF.


ENDFORM.

***** Ende *****
*---------------------------------------------------------------------*
*                   Z _ B J H _ J O B _ W A R T E N                   *
*                                                                     *
*                  Autor: Bernd Haase (BJH Software)                  *
*---------------------------------------------------------------------*
* Testprogramm für z_bjh_job_anstoss                                  *
* Die hier vorhandene Tabelle zzv_test dient zur Übergabe der Para-   *
* meter, hier ist es zwar nur die Sekunden, die dieser Job warten soll*
* es könnten aber auch Stücklistendaten oder Rechnungsnummer sein.    *
*---------------------------------------------------------------------*
* 07.04.2005 BHaa: Programm erstellt                                  *
*---------------------------------------------------------------------*
*REPORT  z_bjh_job_warten           .
*
*TABLES:
*  zzv_test.     "Datei zur Übergabe der Parameter
*
*DATA:
*  wa_test LIKE zzv_test.
*
*START-OF-SELECTION.
*
** geht nicht über Import, also über Tabelle
** IMPORT wa_sekunden FROM MEMORY ID 'ZZ_TEST_JOB_SEK'.
*
*  SELECT SINGLE * FROM zzv_test INTO wa_test
*  WHERE schl = 'A'.
*  IF sy-subrc = 0.
*    WRITE: / sy-datum, sy-uzeit, wa_test-wert, 'Sekunden Wartezeit'.
*
*    WAIT UP TO wa_test-wert SECONDS.
*
*    WRITE: / sy-datum, sy-uzeit.
*  ENDIF.
*
*END-OF-SELECTION.
*  EXIT.
*
***** Ende *****
* Copyright BJH Software, Datei überarbeitet am: 26.5.2005