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 параметров или попытками чтения из таблиц куда сохраняется проведенный документ.