ZDOC_1424

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

Вводная

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

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

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

 

Пример

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

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

  • Зайти в AS02
  • Ввести номер ОС и перейти на вкладку “Общее”
  • Перейти на вкладку “В зависимости от времени” и изменить там поле “Табельный номер”
  • Сохранить карточку ОС
  • Ответить “Да” на запрос подтверждения

Шаг первый

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

Шаг второй

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

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

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

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

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

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

  • По этой кнопке создаётся новая программа, а у меня уже есть программа
  • Генератор не знает какие  поля должны быть заполнены констанстами, а какие переменными, а какие лучше не трогать
  • Переваривая строки пакетника, я прорабатываю последовательность экранов

 

Шаг третий

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

  • Убираем записи BDC_CURSOR (это куда вы мышкой тыкаете, нужны редко тогда, когда действия зависят от позиции курсора) – строки 3, 13
  • Убираем поля, которые мы не трогаем – строки 14-16.
  • Убираем записи BDC_SUBSC (обработка экранов) – строки 9-12

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

  • Строки группировки (это экраны, на которых мы находимся)
  • Строки BDC_OKCODE (кнопки, которые мы нажимаем)
  • Строки с вводимыми или изменяемыми полями (ANLA-ANLN1, ANLZ-PERNR)

 

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

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

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

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

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.

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

  • Смысловые экранные блоки начинаются с “perform bdc_dynpro”. Это программа и экран на который мы перешли
  • Вторая строка ‘BDC_OKCODE’ – это кнопка на экране, которая нажимается (/00 – это клавиша ENTER)
  • Следующими строками идут блоки с полями и заполняемыми значениями

 

Если у вас есть поле с числовыми значениями, то вам понадобятся дополнительные обработки, так как формат числа на экране и внутри 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