Автор Тема: CALL TRANSACTION 'XXXX'  (Прочитано 9057 раз)

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
CALL TRANSACTION 'XXXX'
« : Март 23, 2008, 10:48:19 pm »
BAPI-вещь конечно хорошая, но пока еще к сожалению, часто приходится пользоваться и такой железо-бетонной вещью как CALL TRANSACTION. Опять же SAP все делает чтобы пользоваться этим способом было все сложнее и сложнее, но в замен пока не спешит предоставить интерфейсы BAPI для всех транзакций. В общем я при работе с пакетником пользуюсь  следующим образом (Пример самый простой фоновое подтверждение транспортного заказа через LT21):

1. Трассируем выполнение интересующей транзакции используя транзакцию SHDB и получаем в конце картинку как на рисунке SHDB.png
2. Далее в своей программе делаю следующее объявление полей и переменных:

Код: You are not allowed to view links. Register or Login
* Структура для CALL TRANSACTION.
DATA: call_mode(1) TYPE c.             "Режим выполения транзакции

DATA: BEGIN OF lt_bdcdata OCCURS 0.
        INCLUDE STRUCTURE bdcdata.
DATA: END OF lt_bdcdata.

DATA BEGIN OF lt_itab OCCURS 10.
        INCLUDE STRUCTURE bdcmsgcoll.
DATA END OF lt_itab.

И вот такая вот процедурка:

Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*&      Form  DYNPRO
*&---------------------------------------------------------------------*
*                   Генерация полей для BATCH-INPUT
*----------------------------------------------------------------------*
FORM dynpro USING dynbegin name value.
  IF dynbegin = 'X'.
    CLEAR lt_bdcdata.
    MOVE: name TO lt_bdcdata-program,
          value TO lt_bdcdata-dynpro,
          'X' TO lt_bdcdata-dynbegin.
    APPEND lt_bdcdata.
  ELSE.
    CLEAR lt_bdcdata.
    MOVE: name TO lt_bdcdata-fnam,
          value TO lt_bdcdata-fval.
    APPEND lt_bdcdata.
  ENDIF.
ENDFORM.                    "dynpro

3. Далее по сгенерированому логу SHDB перевожу все в вызов программы в таком виде:

Код: You are not allowed to view links. Register or Login
CLEAR: lt_itab[], lt_bdcdata[].

PERFORM dynpro USING:
   'X' 'SAPML03T' '0121',
   ' ' 'BDC_CURSOR' 'LTAK-TANUM',
   ' ' 'BDC_OKCODE' '/00',
   ' ' 'LTAK-TANUM' <Номер заказа>,
   ' ' 'LTAK-LGNUM' <Номер склада>,

   'X' 'SAPML03T' '0123',
   ' ' 'BDC_CURSOR' 'LTAK-LGNUM',
   ' ' 'BDC_OKCODE' '=QUD2',

   'X' 'SAPML03T' '0123',
   ' ' 'BDC_CURSOR' 'LTAK-LGNUM',
   ' ' 'BDC_OKCODE' '/EBACK'.

call_mode = 'N'.
CALL TRANSACTION 'LT21' USING lt_bdcdata MODE call_mode UPDATE 'S'
                                      MESSAGES INTO lt_itab.
LOOP AT lt_itab WHERE msgtyp = 'E' OR msgtyp = 'A'.
  "Обработка ошибок
ENDLOOP.

В общем в такой аннотации оно легко читается, отлаживается и поддерживается, чем если использовать стандартно сгенерированную программу от SHDB-транзакции. Кстати строки вывода отработки подэкранов, в примере это строка 10, могут не повторяться в программе, т.е. в большинстве своем строки с командами BDC_SUBSCR, могут быть пропущены.

По поводу переменной call_mode, заведена для удобства отладки программы, если вдруг что, то присваиваем значение "A" в отладчике и смотрим на проблемы...

Таблица lt_itab, содержит все сообщения выводимые запущенной транзакцией в ходе работы, как ошибки так и сообщения типа S. Если вызывается программа которая к примеру проводит документ, то номер проведенного документа можно и нужно найти в этой таблице, а не вытаскивать его из SET/GET параметров или попытками чтения из таблиц куда сохраняется проведенный документ.
« Последнее редактирование: Март 23, 2008, 10:51:27 pm от Uukrul »

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: CALL TRANSACTION 'XXXX' (Пакетный ввод)
« Ответ #1 : Июль 16, 2013, 03:01:25 pm »
Более лучшая реализация подпрограммы DYNPRO - для заполнения данных пакетного ввода. По крайней мере ориентируется на тип переменных и соответственно правильно заполняет вещи как переданный тип DATS или суммы с преобразованием в форматы пользователя.
Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*&      Form  DYNPRO
*&---------------------------------------------------------------------*
*                   Генерация полей для BATCH-INPUT
*----------------------------------------------------------------------*
FORM dynpro USING p_dynbegin
                  p_name
                  p_value.
  DATA: l_type(1) TYPE c,
        l_dcpfm(1) TYPE c.

  CLEAR gt_bdcdata.
  IF p_dynbegin = true.
*   Экран транзакции
    MOVE: p_name TO gt_bdcdata-program,
          p_value TO gt_bdcdata-dynpro,
          true TO gt_bdcdata-dynbegin.
  ELSE.
*   Поле на экране транзакции
    MOVE: p_name TO gt_bdcdata-fnam.
    IF NOT p_value IS INITIAL.
      DESCRIBE FIELD p_value TYPE l_type.
      CASE l_type.
        WHEN 'I' OR 'N' OR 'P'.
          WRITE p_value TO gt_bdcdata-fval LEFT-JUSTIFIED.
          SELECT SINGLE dcpfm INTO (l_dcpfm) FROM usr01 WHERE bname = sy-uname.
          CASE l_dcpfm.
            WHEN false. TRANSLATE gt_bdcdata-fval USING '. '.
            WHEN true.  TRANSLATE gt_bdcdata-fval USING ', '.
          ENDCASE.
          CONDENSE gt_bdcdata-fval NO-GAPS.
        WHEN 'D'.
          WRITE p_value TO gt_bdcdata-fval DD/MM/YYYY.
        WHEN OTHERS.
          MOVE p_value TO gt_bdcdata-fval.
      ENDCASE.
    ENDIF.
  ENDIF.
  APPEND gt_bdcdata.
ENDFORM.                    "dynpro