+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средства » SE38 - ABAP Редактор » Программы на ABAP (Модератор: Dmitriy)Тема:
|- RAIMCOPY - Запуск сведения инвестиционной программы из своей программы (Тр:IM34)




Автор Тема: RAIMCOPY - Запуск сведения инвестиционной программы из своей программы (Тр:IM34)  (Прочитано 3614 раз)

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 636
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
RAIMCOPY - Данная программа фактически выполняется при запуске транзакции IM34, но как оказалось, все не так просто, запустить сведение инвестиционной программы из своей программы задача не тривиальная, всякие CALL TRANSACTION или SUBMIT не работают, причина очень простая, пацаны из гнезда так написали, что нам на местах или ломать их код или искать обходные пути. В общем такой вот обходной пусть и был реализован. Фактически задача решалась следующим образом, формируется фоновое задание, сведение запускается в фоне, потом ждем пока задание завершиться или пока не превысим время ожидания выполнения задания по сведению (мало ли вдруг что-то сломалось). Так что пример можно использовать для запуска разных программ из своей в фоне с ожиданием результатов выполнения. Программа состоит из основной части в виде ФМ модуля и пары подпрограмм. Из заголовка интерфейса понятно какие параметры у ФМ.

Используемые константы:
Код: You are not allowed to view links. Register or Login
CONSTANTS: true(1) TYPE c VALUE 'X',
           false(1) TYPE c VALUE space,

           con_minus(1) TYPE c VALUE '-'.

Основной функциональный модуль:
Код: You are not allowed to view links. Register or Login
FUNCTION z_im_reduction_program.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(PI_PROG) TYPE  IM_PRNAM
*"     REFERENCE(PI_YEAR) TYPE  GJAHR
*"     REFERENCE(PT_VERSN) TYPE  ZIM_VERSN_TBL
*"     REFERENCE(PI_WAIT) TYPE  C DEFAULT 'X'
*"     REFERENCE(PI_MAX_WAIT_TIME) TYPE  I DEFAULT 600
*"  EXPORTING
*"     REFERENCE(PO_JOBNUMBER) TYPE  BTCJOBCNT
*"     REFERENCE(PO_NAME) TYPE  BTCJOB
*"     REFERENCE(PO_STATUS) TYPE  BTCSTATUS
*"  EXCEPTIONS
*"      CANT_CREATE_JOB
*"      INVALID_JOB_DATA
*"      JOBNAME_MISSING
*"      UNKNOWN_ERROR
*"      ERROR_CREATE_VARIANT
*"      JOB_SUBMIT_FAILED
*"      JOB_CLOSE_FAILED
*"----------------------------------------------------------------------
  DATA: l_released         TYPE btcchar1,
        l_ret              TYPE i,
        l_variant          TYPE raldb_vari.

* Сформувати завдання
  CONCATENATE 'ZIMARQ' con_minus pi_prog con_minus pi_year con_minus
              sy-datum con_minus sy-uzeit INTO po_name.
  CALL FUNCTION 'JOB_OPEN'
    EXPORTING
      jobname          = po_name
      check_jobclass   = 'X'
    IMPORTING
      jobcount         = po_jobnumber
    EXCEPTIONS
      cant_create_job  = 1
      invalid_job_data = 2
      jobname_missing  = 3
      OTHERS           = 4.
  CASE sy-subrc.
    WHEN 0.
*     Ім"я варианту для виконання програми
      CONCATENATE pi_prog con_minus pi_year INTO l_variant.
*     Створити вариант для разрахунку інвестиціїной програми
      PERFORM create_raimcopy USING   'RAIMCOPY' l_variant
                                       pi_prog
                                       pi_year
                                       pt_versn
                              CHANGING l_ret.
      IF l_ret = 0.
*       Запланувати виконання програми зведення даних
        CALL FUNCTION 'JOB_SUBMIT'
          EXPORTING
            authcknam               = sy-uname
            jobcount                = po_jobnumber
            jobname                 = po_name
            report                  = 'RAIMCOPY'
            variant                 = l_variant
          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 sy-subrc = 0.
*       Виконати зведення
          CALL FUNCTION 'JOB_CLOSE'
            EXPORTING
              jobcount             = po_jobnumber
              jobname              = po_name
              strtimmed            = true
            IMPORTING
              job_was_released     = l_released
            CHANGING
              ret                  = l_ret
            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 AND l_ret = 0.
            po_status = 'U'.
            IF pi_wait = true.
              PERFORM wait_run_reduction_program USING    po_jobnumber po_name
                                                          pi_max_wait_time
                                                 CHANGING po_status.
            ENDIF.
          ELSE.
            RAISE job_close_failed.
          ENDIF.
        ELSE.
          RAISE job_submit_failed.
        ENDIF.
      ELSE.
        RAISE error_create_variant.
      ENDIF.
    WHEN 1. RAISE cant_create_job.
    WHEN 2. RAISE invalid_job_data.
    WHEN 3. RAISE jobname_missing.
    WHEN OTHERS. RAISE unknown_error.
  ENDCASE.
ENDFUNCTION.
Подпрограммы:
Код: You are not allowed to view links. Register or Login
*----------------------------------------------------------------------*
***INCLUDE LZIIM_APPR_REQF11 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  CREATE_RAIMCOPY
*&---------------------------------------------------------------------*
*       Створення варианту програми зведення інвестиційхної програми
*----------------------------------------------------------------------*
*      -->P_PROGRAM - Ім"я програми
*      -->P_VARIANT - Ім"я варианту програми
*      -->P_IM_PROG - Інветстиційна програма
*      -->P_IM_YEAR - Рік інвестиційної програми
*      -->PT_VERSN  - Версії по яким виконувати зведення
*      <--P_RET     - Результат обробки створення варианту
*----------------------------------------------------------------------*
FORM create_raimcopy  USING    p_program
                               p_variant
                               p_im_prog
                               p_im_year
                               pt_versn TYPE zim_versn_tbl
                      CHANGING p_ret.
  DATA: ls_vari_desc TYPE varid,
        ls_versn     TYPE zim_versn,
        lt_contens   LIKE rsparams OCCURS 1 WITH HEADER LINE,
        lt_vari_text LIKE varit OCCURS 1 WITH HEADER LINE.

  CLEAR: p_ret, ls_vari_desc, lt_contens[], lt_vari_text[].

  CALL FUNCTION 'RS_VARIANT_EXISTS'
    EXPORTING
      report              = p_program
      variant             = p_variant
    IMPORTING
      r_c                 = p_ret
    EXCEPTIONS
      not_authorized      = 1
      no_report           = 2
      report_not_existent = 3
      report_not_supplied = 4
      OTHERS              = 5.
* Як що вариант с таким ім"ям існує, тоді видалити ойго
  IF sy-subrc = 0 AND p_ret = 0.
    CALL FUNCTION 'RS_VARIANT_DELETE'
      EXPORTING
        report                     = p_program
        variant                    = p_variant
        flag_confirmscreen         = true
        flag_delallclient          = true
*     IMPORTING
*       VARIANT                    =
     EXCEPTIONS
       not_authorized             = 1
       not_executed               = 2
       no_report                  = 3
       report_not_existent        = 4
       report_not_supplied        = 5
       variant_locked             = 6
       variant_not_existent       = 7
       no_corr_insert             = 8
       variant_protected          = 9
       OTHERS                     = 10.
    IF sy-subrc <> 0.
      p_ret = sy-subrc.
    ENDIF.
  ELSE.
    p_ret = sy-subrc.
  ENDIF.
  CHECK p_ret = 0.

  lt_vari_text-report  = p_program.
  lt_vari_text-variant = p_variant.
  lt_vari_text-langu   = sy-langu.
  lt_vari_text-vtext   = p_variant.
  CONCATENATE 'Зведення програми'(002) con_minus lt_vari_text-vtext
  INTO lt_vari_text-vtext SEPARATED BY space.
  APPEND lt_vari_text.

* Параметри варианту
  ls_vari_desc-report = p_program.
  ls_vari_desc-variant = p_variant.
  ls_vari_desc-protected = true.

* Програма
  lt_contens-selname = 'PA_PRNAM'.
  lt_contens-kind = 'P'.
  lt_contens-sign = 'I'.
  lt_contens-option = 'EQ'.
  lt_contens-low = p_im_prog.
  APPEND lt_contens.

* Рік програми
  lt_contens-selname = 'PA_GJAHR'.
  lt_contens-kind = 'P'.
  lt_contens-sign = 'I'.
  lt_contens-option = 'EQ'.
  lt_contens-low = p_im_year.
  APPEND lt_contens.

* Версії зведення для програми
  LOOP AT pt_versn INTO ls_versn.
    lt_contens-selname = 'SO_VERSN'.
    lt_contens-kind = 'S'.
    lt_contens-sign = 'I'.
    lt_contens-option = 'EQ'.
    lt_contens-low = ls_versn-versn.
    APPEND lt_contens.
  ENDLOOP.

* Виконати зведення програми
  lt_contens-selname = 'P_XVOVR'.
  lt_contens-kind = 'P'.
  lt_contens-sign = 'I'.
  lt_contens-option = 'EQ'.
  lt_contens-low = true.
  APPEND lt_contens.

* Включеня планових заявок
  lt_contens-selname = 'PA_XIQ'.
  lt_contens-kind = 'P'.
  lt_contens-sign = 'I'.
  lt_contens-option = 'EQ'.
  lt_contens-low = true.
  APPEND lt_contens.

  lt_contens-selname = 'PA_XPR'.
  lt_contens-kind = 'P'.
  lt_contens-sign = 'I'.
  lt_contens-option = 'EQ'.
  lt_contens-low = false.
  APPEND lt_contens.

  lt_contens-selname = 'PA_XOR'.
  lt_contens-kind = 'P'.
  lt_contens-sign = 'I'.
  lt_contens-option = 'EQ'.
  lt_contens-low = false.
  APPEND lt_contens.

* Код транзакциї яка виконується
  lt_contens-selname = 'PA_TCODE'.
  lt_contens-kind = 'P'.
  lt_contens-sign = 'I'.
  lt_contens-option = 'EQ'.
  lt_contens-low = 'IM34'.
  APPEND lt_contens.

  CALL FUNCTION 'RS_CREATE_VARIANT'
    EXPORTING
      curr_report               = p_program
      curr_variant              = p_variant
      vari_desc                 = ls_vari_desc
    TABLES
      vari_contents             = lt_contens
      vari_text                 = lt_vari_text
    EXCEPTIONS
      illegal_report_or_variant = 1
      illegal_variantname       = 2
      not_authorized            = 3
      not_executed              = 4
      report_not_existent       = 5
      report_not_supplied       = 6
      variant_exists            = 7
      variant_locked            = 8
      OTHERS                    = 9.
  IF sy-subrc <> 0. p_ret = sy-subrc. ENDIF.
ENDFORM.                    " CREATE_RAIMCOPY
*&---------------------------------------------------------------------*
*&      Form  WAIT_RUN_REDUCTION_PROGRAM
*&---------------------------------------------------------------------*
*       Процесс очікування завершення завдання
*----------------------------------------------------------------------*
*  -->  P_NUMBER        - Номер завдання
*  -->  P_NAME_JOB      - Ім"я завдання
*  <--  P_MAX_WAIT_TIME - Максимальний час виконання завдання
*  -->  P_STATUS        - Статус обробки:
*----------------------------------------------------------------------*
FORM wait_run_reduction_program USING p_number
                                      p_name_job
                                      p_max_wait_time
                                CHANGING p_status.
  DATA: time2 TYPE i,
        time1 TYPE i,
        time_diff TYPE i,
        ls_status LIKE tbtcv,
        l_suspended TYPE btcstatus,
        l_other TYPE btcstatus.

  GET RUN TIME FIELD time1.
  WHILE time_diff < p_max_wait_time.
*   Затримка 5 секунд перед перевіркой статусу завдання
    WAIT UP TO 3 SECONDS.

    CALL FUNCTION 'SHOW_JOBSTATE'
      EXPORTING
        jobcount         = p_number
        jobname          = p_name_job
      IMPORTING
        aborted          = ls_status-abort
        finished         = ls_status-fin
        preliminary      = ls_status-prelim
        ready            = ls_status-ready
        running          = ls_status-run
        scheduled        = ls_status-sched
        suspended        = l_suspended
        other            = l_other
      EXCEPTIONS
        jobcount_missing = 1
        jobname_missing  = 2
        job_notex        = 3
        OTHERS           = 4.

    IF sy-subrc <> 0. EXIT. ENDIF.
    IF ls_status-abort = true. p_status = 'A'. EXIT. ENDIF.
    IF ls_status-fin = true. p_status = 'S'. EXIT. ENDIF.

*   Загальний час виконання процесу первірки
    GET RUN TIME FIELD time2.
    time_diff = ( time2 - time1 ) / 1000000.
  ENDWHILE.
ENDFORM.                    " WAIT_RUN_REDUCTION_PROGRAM
PS: Где-то так.. надеюсь ничего не забыл. Да в ходе работы создается динамически вариант запуска программы, с которым она и стартует.