Вводная
Пакетный ввод – это симуляция работы пользователя в одной определённой транзакции.
Программный пакетный ввод может только то, что может пользователь.
Как правило BDC используют для проведения массовых и повторяющихся действий (создание или изменение объектов или документов).
Пример
Для примера возьмём изменение основного средства в транзакции AS02. Нам необходимо массово изменить в карточке ОС табельный номер материально-ответственного лица.
Действия такие:
- Зайти в AS02
- Ввести номер ОС и перейти на вкладку “Общее”
- Перейти на вкладку “В зависимости от времени” и изменить там поле “Табельный номер”
- Сохранить карточку ОС
- Ответить “Да” на запрос подтверждения
Шаг первый
Просто отрабатываем транзакцию, что бы потом при реальной записи не было дополнительных телодвижений.
Шаг второй
Делаем запись. Заходим в SHDB и делаем в ней чистовой прогон транзакции AS02.
После это смотрим на получившуюся запись.
Данную последовательность вполне успешно можно читать “с листа”.
Группы – это последовательный проход экранов. Внутри групп пользователь тыкает мышкой, изменяет поля и нажимает кнопки. После нажатия кнопки происходит переход к следующему экрану.
Можно конечно воспользоваться кнопкой “Создать программку”, но это не мой метод:
- По этой кнопке создаётся новая программа, а у меня уже есть программа
- Генератор не знает какие поля должны быть заполнены констанстами, а какие переменными, а какие лучше не трогать
- Переваривая строки пакетника, я прорабатываю последовательность экранов
Шаг третий
Копируем запись по 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.
Шаг пятый
Пробуем, отлаживаем, дорабатываем.
если сеанс в shdb сохранить, то на первом экране есть две замечательные кнопки «Программа» и «Функциональный модуль», позволяющие стандартно «завернуть эти строки в ABAP»
Есть-то оно есть, просто:
— я предпочитаю делать это осмысленно, чем доверяться какому-то генератору
— программа как правило у меня уже есть, и не хватает только фрагмента с пакетником
Можно ли запускать транзакцию в обычном режиме, а не в пакетном. Столкнулся с проблемой, когда они работают по разному.
Собственно нашел возможность.
gs_bdc_params-nobinpt = abap_true.
При подстановке нескольких значений в интервал система формирует двузначный номер строки, например,
perform bdc_field using ‘BDC_CURSOR’
‘RSCSEL_255-SLOW_I(04)’ .
Означает ли это, что в интервал значений можно подставить только 99 строк?
Добрый день. Подскажите, что делать с динамическими OK_CODE like ‘%_GC n1 n2’? Нашел код функции, подставил вместо динамического, но он не срабатывет.
Есть какой-то способ? Буду признателен за наводку.
Насчет двузначного номера строки всё не очень приятно:
Система в режиме пакетного ввода эмулирует только видимую часть таблицы, поэтому количество строк ограничено одним экраном.
А это всегда небольшое значение, например 20 строк.
Соответетвенно, чтобы ввести строку-21 надо прокрутить экран вниз на страницу, тогда будут показаны строки с 21 по 40. После такого хода (01) будет соответствовать строке-21.
И никаких строк с номером 100 получается никогда не будет.
При вводе строк можно даже всегда вводить строку номер один:
Ввели первую строку, прокрутили на одну строку. Вторая строка показывается как первая.
Вводим первую строку, снова крутим вниз на одну строку. Третья строка показывается как первая.
И так до бесконечности…
Насчет динамических команд не припоминаю случаев в своей практике.
Вполне возможно, что стоит просто копнуть глубже в альтернативные методы: BAPI или FM/классы внутреннего использования.
Ссылка на инклюд не доступна :(
Годы идут, всё меняется. Вот и гуглокод уже приказал долго жить.
Давно пора отказываться от инклюдов, можно и примерно так:
https://gist.github.com/anonymous/c1a79110db24fc6002b07f0ad04d4baf