AMDP BAdI

Начиная с ABAP 7.4 SP08 нам стал доступен специальный тип BAdI — AMDP BAdI, который позволяет заменить/расширить стандартную реализацию AMDP процедур реализованных SAP-ом или в Custom решениях. Основное предназначение AMDP BAdI — вызов процедур реализованных в реализации AMDP BAdI из других AMDP процедур в системе. Чтобы это стало возможным используется ключевое слово USING в определении AMDP процедуры:

Особенности AMDP BAdI:

  • Нет возможности использования BAdI фильтров
  • Fallback класс — обязателен для реализации BAdI (данный класс определяет поведение по умолчанию, если не определена иная реализация)
  • Каждый метод AMDP BAdI класса реализации должен быть AMDP процедурой
  • Вызов таких BAdI может осуществляться обычным образом через GET BADI и CALL BADI

Далее реализуем свой AMDP BAdI, реализацию к нему по умолчанию через Fallback класс, а так же дополнительную Custom реализацию.

Создание своего AMDP BAdI

Для создания своего AMDP BAdI необходимо перейти в транзакцию SE20 и создать новую точку расширения — Enhancement Spot:

Native диалог в Eclipse ADT не доступен на моей системе, так или иначе перенаправит в SE20, но в самых последних версиях систем мы можем править точку расширения прямо в ADT

Пускай её имя будет — ZES_CUSTOM_AMDP_BADI_SAMPLE.

В следующем диалоге мы можем указать композитную точку расширения, если хотим объединить несколько точек в одну, но в примере этого делать не будем, оставляем пустым:

Далее необходимо указать запрос в рамках которого мы хотим сохранить нашу точку расширения, либо отметить её как локальный объект. После чего мы попадём на экран определения BAdI в рамках точки расширения, где можем нажать на создание нового BAdI:

В нашем демо сценарии мы создадим BAdI для поиска пользователей по заданным критериям фильтрации. Назовём BAdI следующим образом — ZBD_AMDP_USER_SEARCH:

Отметим сразу галочкой что мы создаём именно AMDP BAdI:

Следующим шагом определим имя интерфейса — ZIF_AMDP_USER_SEARCH:

После чего система сразу предложит перейти к определению методов интерфейса — согласимся.

Добавим в интерфейс метод: SEARCH_USERS:

В качестве параметра у нас будет строка с фильтром и возвращать мы будем таблицу со структурой таблицы USR02:

Обратите внимание, так как мы создаём интерфейс для вызова AMDP процедуры, передача параметров должна быть по значению.

После определения метода, сохраним интерфейс и выйдем к экрану ведения BAdI и зададим Fallback класс с именем — ZCL_BI_FB_AMDP_USER_SEARCH:

Далее система вновь предложит выбрать запрос и перейти в редактирование класса — соглашаемся, сохраняем его и активируем. Добавить реализацию AMDP метода мы не сможем в GUI транзакции, далее мы должны пользоваться Eclipse и ADT.

Первым делом откроем наш BAdI интерфейс и добавим к нему маркер AMDP:

Сохраним и активируем.

Далее открываем наш Fallback класс в Eclipse и пишем реализацию поиска по умолчанию:

Сохраняем, активируем класс и переходим обратно в SE20 где активируем точку расширения.

На данном этапе мы создали новое Custom AMDP BAdI и Fallback класс с реализацией по умолчанию. Логика реализации по умолчанию заключается в поиске всех пользователей чьё техническое имя содержит переданный фильтр.

Вызов AMDP BAdI

Вызов AMDP BAdI возможен двумя способами:

  • Через стандартные GET BADI и CALL BADI
  • Вызов из AMDP процедуры.

Для первого варианта напишем демо отчёт следующего вида:

В качестве примера строка поиска:

Результат — все пользователи с именем DEV* или S*:

Несмотря на возможность прямого вызова из ABAP кода, в основном AMDP BAdI необходимы для их вызова из AMDP процедур.

Обычно в таких процедурах написана некая стандартная логика и вызывается дополнительно Custom реализация через BAdI, например чтобы обогатить массив выбираемых данных.

Создадим подобный AMDP класс со стандартной логикой и следующим именем — zcl_amdp_user_search:

В качестве демо сценария наш AMDP класс использует свою стандартную логику поиска пользователей, дополнительно обогащая результат выборки через вызов AMDP BAdI и объединяет оба массива данных. По умолчанию логика выборки et_default_users ничем не отличается от реализованной в Fallback классе. Про оптимальность подобной дублирующей логики говорить тут не будем, все таки демо сценарий 🙂

Ну и создадим демо отчёт по вызову нового AMDP класса:

Результат его работы будет аналогичен предыдущему отчёту.

Создание Custom реализации AMDP BAdI

Для того чтобы наши демо отчёты стали возвращать какой-то иной массив данных, создадим новую реализацию BAdI.

В SE20 в разделе реализации создадим новую реализацию точки расширения с именем — ZEI_CUS_AMDP_USER_SEARCH:

Реализацией — ZBI_CUSTOM_USER_SEARCH и классом реализации — ZCL_BI_CUSTOM_USER_SEARCH:

При создании система уведомит что уже есть реализация Fallback класса, скопируем его реализацию.

Далее откроем класс в Eclipse и напишем обновлённую логику:

В части реализации мы сделали поиск не по техническому имени пользователя, а по его фамилии и имени из адресных данных.

Активируем класс, в SE20 активируем нашу BAdI реализацию, теперь она отображается в точке расширения как активная:

Запустим любой из наших отчётов с новой строкой поиска:

Результат:

По новой логике мы сформировали массив пользователей у которых:

  • Техническое имя начинается на JANE* или DEV*
  • Имя и фамилия содержат JANE* или DEV*

Пользователь BWDEVELOPER имеет следующее имя:

Таким образом реализовав Custom реализацию AMDP BAdI мы расширили логику определяемую по умолчанию.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *