Пакетный ввод BDC – пример реализации

Вводная

Пакетный ввод – это симуляция работы пользователя в одной определённой транзакции.

Программный пакетный ввод может только то, что может пользователь.

Как правило BDC используют для проведения массовых и повторяющихся действий (создание или изменение объектов или документов).

 

Пример

Для примера возьмём изменение основного средства в транзакции AS02. Нам необходимо массово изменить в карточке ОС табельный номер материально-ответственного лица.

Действия такие:

Шаг первый

Просто отрабатываем транзакцию, что бы потом при реальной записи не было дополнительных телодвижений.

Шаг второй

Делаем запись. Заходим в SHDB и делаем в ней чистовой прогон транзакции AS02.

После это смотрим на получившуюся запись.

Просмотр записи в SHDB

Данную последовательность вполне успешно можно читать “с листа”.

Группы – это последовательный проход экранов. Внутри групп пользователь тыкает мышкой, изменяет поля и нажимает кнопки. После нажатия кнопки происходит переход к следующему экрану.

Можно конечно воспользоваться кнопкой “Создать программку”, но это не мой метод:

 

Шаг третий

Копируем запись по Ctrl+Y и грубо вставляем в нашу программу “как есть” и делаем зачистку ненужного:

Итого должны остаться:

 

Шаг четвёртый

Заворачиваем эти строки в ABAP – мы должны переложить эти строки в таблицу со структурой BDCDATA. Практически мы должны получить что-то вроде исходной таблицы записи.

Для этого лучше воспользоваться какими-то мелкими помогалками (инклюдами, макросами). Я пользуюсь вот этим.

Получится что-то вроде этого:

refresh gt_bdc_data.

perform bdc_dynpro using ‘SAPLAIST’ ‘0100’.
perform bdc_field  using ‘BDC_OKCODE’       ‘/00’.
perform bdc_field  using ‘ANLA-ANLN1’       gt_report-anln1_new.
perform bdc_field  using ‘ANLA-ANLN2’       gt_report-anln2_new.
perform bdc_field  using ‘ANLA-BUKRS’       gt_report-bukrs.

perform bdc_dynpro using ‘SAPLAIST’ ‘1000’.
perform bdc_field  using ‘BDC_OKCODE’       ‘=TAB02’.

 

perform bdc_dynpro using ‘SAPLAIST’ ‘1000’.
perform bdc_field  using ‘BDC_OKCODE’        ‘=BUCH’.
perform bdc_field  using ‘ANLZ-PERNR’        gt_report-pernr_new.

 

perform bdc_dynpro using ‘SAPLAIST’ ‘3020’.
perform bdc_field  using ‘BDC_OKCODE’        ‘=YES’.

 

perform bdc_dynpro using ‘SAPLAIST’ ‘1000’.

 

gs_bdc_params-dismode = ‘N’.
refresh gt_bdc_result.
call transaction ‘AS02’ using gt_bdc_data
options from gs_bdc_params
messages into gt_bdc_result.

 

Это уже с добавленной инициализацией сверху и непосредственным вызовом транзакции снизу.

Средняя часть – это всего лишь формирование таблицы gt_bdc_data.

Читается она блоками следующим образом:

 

Если у вас есть поле с числовыми значениями, то вам понадобятся дополнительные обработки, так как формат числа на экране и внутри ABAP может отличаться:

lv_wrbtr = bseg-wrbtr.
CONDENSE lv_wrbtr.
REPLACE ALL OCCURRENCES OF ‘.’ IN lv_wrbtr WITH ‘,’.

Ну и с датой история попроще.

[TODO] Собраться добавить эти штуки в инклюд

Конструкция “dismode = N” говорит о невидимом выполнении. В целях отладки пакетника меняете этот код на A (видимое выполнение) или E (только ошибки).

Ошибки будут находиться во внутренней таблице gt_bdc_result. Там только коды, но русский текст вы можете получить при помощи ФМ RPY_MESSAGE_COMPOSE.

Шаг пятый

Пробуем, отлаживаем, дорабатываем.

 

Постскриптум

Batch Input FAQ

Вставка пакетного ввода в SM35

Опубликовано 05.12.2012 в 15:01 · Автор ivan · Ссылка
Рубрики: ABAP

4 комментария

Подписаться на комментарии по RSS

  1. Написал(-а) Сергей Рязанов
    05.12.2012 в 16:03
    Ссылка

    если сеанс в shdb сохранить, то на первом экране есть две замечательные кнопки «Программа» и «Функциональный модуль», позволяющие стандартно «завернуть эти строки в ABAP»

  2. Написал(-а) ivan
    05.12.2012 в 22:57
    Ссылка

    Есть-то оно есть, просто:
    — я предпочитаю делать это осмысленно, чем доверяться какому-то генератору
    — программа как правило у меня уже есть, и не хватает только фрагмента с пакетником

  3. Написал(-а) Роман
    08.10.2014 в 16:35
    Ссылка

    Можно ли запускать транзакцию в обычном режиме, а не в пакетном. Столкнулся с проблемой, когда они работают по разному.

  4. Написал(-а) Роман
    08.10.2014 в 16:39
    Ссылка

    Собственно нашел возможность.
    gs_bdc_params-nobinpt = abap_true.

Подписаться на комментарии по RSS

Написать комментарий