Вводная
Пакетный ввод – это симуляция работы пользователя в одной определённой транзакции.
Программный пакетный ввод может только то, что может пользователь.
Как правило 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.
Шаг пятый
Пробуем, отлаживаем, дорабатываем.