Пакетный ввод 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

10 комментариев

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

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

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

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

  5. При подстановке нескольких значений в интервал система формирует двузначный номер строки, например,
    perform bdc_field using ‘BDC_CURSOR’
    ‘RSCSEL_255-SLOW_I(04)’ .
    Означает ли это, что в интервал значений можно подставить только 99 строк?

  6. Добрый день. Подскажите, что делать с динамическими OK_CODE like ‘%_GC n1 n2’? Нашел код функции, подставил вместо динамического, но он не срабатывет.
    Есть какой-то способ? Буду признателен за наводку.

  7. Насчет двузначного номера строки всё не очень приятно:
    Система в режиме пакетного ввода эмулирует только видимую часть таблицы, поэтому количество строк ограничено одним экраном.
    А это всегда небольшое значение, например 20 строк.
    Соответетвенно, чтобы ввести строку-21 надо прокрутить экран вниз на страницу, тогда будут показаны строки с 21 по 40. После такого хода (01) будет соответствовать строке-21.
    И никаких строк с номером 100 получается никогда не будет.

    При вводе строк можно даже всегда вводить строку номер один:
    Ввели первую строку, прокрутили на одну строку. Вторая строка показывается как первая.
    Вводим первую строку, снова крутим вниз на одну строку. Третья строка показывается как первая.
    И так до бесконечности…

  8. Насчет динамических команд не припоминаю случаев в своей практике.
    Вполне возможно, что стоит просто копнуть глубже в альтернативные методы: BAPI или FM/классы внутреннего использования.

Добавить комментарий

Ваш e-mail не будет опубликован.