Автор Тема: Фоновое задание которое само себя перепланирует  (Прочитано 13010 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн r00xus

  • Newbie
  • *
  • Сообщений: 30
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
здравствуйте коллеги.

консультант поставил задачу создать фоновое задание которое после выполнения само себя перепланирует. я так понял что перепланировать фоновые задания нельзя. можно только удалить старое и создать такое же точно новое.
проблема в том, что новое планирует, а вот само себя удалять не хочет!

написал тестовую программу для того чтобы понять как это делается. программа фонового задания просто удаляет фоновое задание в котором она находится.

сама программа для фонового задания:
Код: You are not allowed to view links. Register or Login
REPORT zjob_job_prg.

START-OF-SELECTION.
  PERFORM start_of_selection.

*&---------------------------------------------------------------------*
*&      Form  start_of_selection
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM start_of_selection.
  DATA lv_jobname   TYPE tbtco-jobname.
  DATA lt_tbtco     TYPE STANDARD TABLE OF tbtco.
  DATA ls_tbtco     TYPE tbtco.
************************************************************************
  lv_jobname = 'ZJOB_TEST'.
*----------------------------------------------------------------------*

  SELECT * FROM tbtco INTO TABLE lt_tbtco
  WHERE
    jobname EQ lv_jobname.
  LOOP AT lt_tbtco INTO ls_tbtco.
    CALL FUNCTION 'BP_JOB_DELETE'
      EXPORTING
        jobname    = ls_tbtco-jobname
        jobcount   = ls_tbtco-jobcount
        forcedmode = 'X'
      EXCEPTIONS
        OTHERS     = 99.
  ENDLOOP.
  COMMIT WORK AND WAIT.
ENDFORM.                    " START_OF_SELECTION

программа которая его планирует:
Код: You are not allowed to view links. Register or Login
REPORT zjob_main.

INITIALIZATION.
  PERFORM init.

*&---------------------------------------------------------------------*
*&      Form  init
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM init.
  DATA lv_jobcount TYPE tbtcjob-jobcount.
  DATA lv_jobname  TYPE tbtcjob-jobname.

  lv_jobname = 'ZJOB_TEST'.
*----------------------------------------------------------------------*
* планируем фоновое задание
*----------------------------------------------------------------------*
  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.
*
  CHECK sy-subrc EQ 0.
*
  SUBMIT zjob_job_prg VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN.

  DATA lv_time TYPE t.
  lv_time = sy-uzeit + '000030'.

  CALL FUNCTION 'JOB_CLOSE'
    EXPORTING
      jobcount             = lv_jobcount
      jobname              = lv_jobname
      sdlstrtdt            = sy-datum
      sdlstrttm            = lv_time
    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.
    ...
  ENDIF.

ENDFORM.                    " INI

проблема в том что если запланировать задание то оно себя не удаляет. если выполнить его через SM36 режиме jdbg то все ОК. исчезает из списка.

Оффлайн ysichov

  • Newbie
  • *
  • Сообщений: 40
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Есть работающий пример. Делал первый раз.

Ниже часть программы ZBHR_AUTO_HIRE_JOB, которая планирует в фоновом режиме запуск программы ZBHR_AUTO_HIRE

Код: You are not allowed to view links. Register or Login
concatenate 'Z8_' p_refnr '_' p_count into lv_jobname.
call function 'JOB_OPEN'
       exporting
            delanfrep        = ' '
            jobgroup         = ' '
            jobname          = lv_jobname
            sdlstrtdt        = sy-datum
            sdlstrttm        = sy-uzeit
       importing
            jobcount         = lv_jobcount
       exceptions
            cant_create_job  = 01
            invalid_job_data = 02
            jobname_missing  = 03.
  if sy-subrc ne 0.
                                       "error processing
  endif.

  SUBMIT ZBHR_AUTO_HIRE
   WITH p_begda = p_begda
   WITH p_refnr = p_refnr
   WITH p_werks = p_werks
   WITH p_btrtl = ls_btrtl
   WITH p_persg = p_persg
   WITH p_persk = p_persk
   with p_reason = p_reason
   with p_count = p_count
   "WITH p_orgeh = PSPAR-orgeh
   "VIA SELECTION-SCREEN
   VIA JOB lv_jobname
   NUMBER lv_jobcount
   AND RETURN.

  starttime-sdlstrtdt = sy-datum .
  starttime-sdlstrttm = sy-UZEIT + 150.
  call function 'JOB_CLOSE'
       exporting
"            event_id             = starttime-eventid
"            event_param          = starttime-eventparm
"            event_periodic       = starttime-periodic
            jobcount             = lv_jobcount
            jobname              = lv_jobname
"            laststrtdt           = starttime-laststrtdt
"            laststrttm           = starttime-laststrttm
"            prddays              = 1
"            prdhours             = 0
"            prdmins              = 0
"            prdmonths            = 0
"            prdweeks             = 0
            sdlstrtdt            = starttime-sdlstrtdt
            sdlstrttm            = starttime-sdlstrttm
"            strtimmed            = starttimeimmediate
"            targetsystem         = host
       exceptions
            cant_start_immediate = 01
            invalid_startdate    = 02
            jobname_missing      = 03
            job_close_failed     = 04
            job_nosteps          = 05
            job_notex            = 06
            lock_failed          = 07
            others               = 99.

В самой программе ZBHR_AUTO_HIRE происходят проверки. В моем случае , если объект был заблокирован, программа в фоне опять "планирует" себя через 5 минут. На всякий случай сделал так, чтобы после 10 попыток программа успокоилась :)


Код: You are not allowed to view links. Register or Login
IF ls_bret-type = 'E'.
    WRITE / 'Автоматический прием пенсионера не произошел'.
    WRITE: / ls_bret-ID, ls_bret-number,ls_bret-message,ls_bret-message_v1,ls_bret-message_v2,ls_bret-message_v3,ls_bret-message_v4.
  IF p_count <= 9.
   p_count = p_count + 1.
SUBMIT ZBHR_AUTO_HIRE_JOB
   WITH p_begda = p_begda
   WITH p_refnr = p_refnr
   WITH p_werks = p_werks
   "WITH p_btrtl = ls_btrtl
   WITH p_persg = p_persg
   WITH p_persk = p_persk
   WITH p_count = p_count
   "WITH p_plans = lv_plans
   WITH p_reason = p_reason
   "VIA SELECTION-SCREEN
   "VIA JOB 'z8'
   "NUMBER lv_jobcount
   AND RETURN.
ELSE.
  WRITE / 'Было выполнено 10 попыток приема. Попробуйте сделать вручную через транзакцию PA40'.
ENDIF.
EXIT.
ENDIF.

P.S. Прочитал внимательней вопрос, обнаружил, что на него не ответил :) А зачем удалять старое выполненное задание? Вдруг кто-то лог захочет почитать...

Скорее всего программа в фоне не может удалить задание, которое ее же и запустило. Оно должно выполнится, а потом уже удалять.
« Последнее редактирование: Октябрь 17, 2013, 01:43:58 pm от ysichov »

Оффлайн r00xus

  • Newbie
  • *
  • Сообщений: 30
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
дело в том, что имена заданий связаны с объектами в системе, которые обновляются. желательно чтобы на один объект жило только одно фоновое задание иначе они наплодятся кучей.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
дело в том, что имена заданий связаны с объектами в системе, которые обновляются. желательно чтобы на один объект жило только одно фоновое задание иначе они наплодятся кучей.
Вообще-то имя задания может повторяться хоть 100 раз, все равно у задания есть уникальный идентификатор... Далее скорее всего действительно у вас не правильные предпосылки на изменение задания. Опять же ну будет их много этих заданий, не вижу проблемы, если в целом.

Оффлайн Dmitriy

  • SAP ECC 6.0
  • Кухня
  • Newbie
  • *
  • Сообщений: 380
  • Репутация: +0/-0
  • Пол: Мужской
  • Embracive Fire
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Старое (выполненное) фоновое задание удалять не обязательно, даже нежелательно, как отмечено коллегой выше, ради лога. Чистка системных таблиц - задача базиса. Я бы сделал так: запланировал на однократное выполнение задание 1, запускающее целевую рабочую программу, содержащую код, отвечающий за перепланировку задания, только и всего. А дальше все автоматом по рельсам пойдет. Главное, корректно программно запланировать задачу по времени. Видел случаи, когда из-за неправильного программного планирования задания, выполнявшегося в фоне около 10-15 минут, запуск оного осуществлялся 1 раз в 5 минут, вместо 1 раз в сутки, из-за чего медленно, но верно, повисал сервер приложений, благо это на тесте выявилось.:)

Оффлайн r00xus

  • Newbie
  • *
  • Сообщений: 30
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
коллеги спасибо за ответы. понятно что не обязательно удалять старое задание.
вопрос заключается в том почему программа не может удалить задание в котором запланирована через ФМ BP_JOB_DELETE? В то время как если запустить через SM36 режиме отладки задания через ОК-CODE jdbg она его таки удаляет? может я упускаю какие-то нюансы?
« Последнее редактирование: Октябрь 17, 2013, 05:42:38 pm от r00xus »

Оффлайн Dmitriy

  • SAP ECC 6.0
  • Кухня
  • Newbie
  • *
  • Сообщений: 380
  • Репутация: +0/-0
  • Пол: Мужской
  • Embracive Fire
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
вопрос заключается в том почему программа не может удалить задание в котором запланирована через ФМ BP_JOB_DELETE? В то время как если запустить через SM36 режиме отладки задания через ОК-CODE jdbg она его таки удаляет? может я упускаю какие-то нюансы?
Скорее всего из-за того, что нельзя удалить из выполняющегося задания его самое, все происходит в рамках одной задачи (фон). При отладке создается еще и диалоговая задача (процесс).

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
коллеги спасибо за ответы. понятно что не обязательно удалять старое задание.
Ну Дмитрий вам ответил, а в целом, похоже надо идеологию работы приложения перепроектировать.

Оффлайн Dmitriy

  • SAP ECC 6.0
  • Кухня
  • Newbie
  • *
  • Сообщений: 380
  • Репутация: +0/-0
  • Пол: Мужской
  • Embracive Fire
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Для получения четкой и ясной картины по процессам используйте транзакцию SM50 "Work Process Overview" - обзор рабочих процессов. F1 в поле "Тип" покажет расшифровку используемых сокращений. Вот немного You are not allowed to view links. Register or Login по этой теме.

Sapforum.Biz