Loading



+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средстваТема:
|- CALL TRANSACTION 'XXXX'



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

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

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.311
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
CALL TRANSACTION 'XXXX'
« : Март 23, 2008, 10:48:19 pm »
BAPI-вещь конечно хорошая, но пока еще к сожалению, часто приходится пользоваться и такой железо-бетонной вещью как CALL TRANSACTION. Опять же SAP все делает чтобы пользоваться этим способом было все сложнее и сложнее, но в замен пока не спешит предоставить интерфейсы BAPI для всех транзакций. В общем я при работе с пакетником пользуюсь  следующим образом (Пример самый простой фоновое подтверждение транспортного заказа через LT21):

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

* Структура для 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.

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

*&---------------------------------------------------------------------*
*&      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 перевожу все в вызов программы в таком виде:

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 »


 


Facebook Comments