SAP BI-IP в BW/4HANA часть 5. User exit переменные.
Другие статьи цикла:
- SAP BI-IP в BW/4HANA часть 1. Hello World in SAP: ADSO + Aggregation Level + BEx Query
- SAP BI-IP в BW/4HANA часть 2. Отношение признаков на атрибутах инфо-объекта
- SAP BI-IP в BW/4HANA часть 3. Отношение признаков с деривацией
- SAP BI-IP в BW/4HANA часть 4. Функции планирования.
О чем эта статья
При работе с BEx запросами периодически возникает потребность фильтровать открываемые данные. Обычно это можно сделать через Input Ready переменные – когда пользователь самостоятельно выбирает значение фильтра. Однако в реальных бизнес задачах существует потребность автоматически с помощью ABAP кода рассчитывать значения фильтра (например, считывать значение фильтра из настроечной таблицы). Для этого SAP BW / BI-IP предлагает функционал User exit (иногда их называют Customer Exit) переменных.
В этой статье мы разработаем User exit переменную, которая будет фильтровать поле BRAND по MERCEDES (да это простой кейс, но его суть в том, что бы это сделаем ABAP кодом, а не простым ограничением признака).
Немного теории
Из интернета я могу порекомендовать следующие ресурсы:
Для обработки User Exit переменной необходимо создать в точке расширения RSROA_VARIABLES_EXIT реализацию расширения на классе, который должен использовать интерфейс IF_RSROA_VARIABLES_EXIT_BADI.
В классе необходимо переопределить метод PROCESS, в котором необходимо заполнить таблицу C_T_RANGE.
Это все мы сделаем в статье ниже.
Практика
Шаг 1. Создаем переменную ZZE0001_VAR01 для инфо-объекта BRAND
Для начала создадим переменную ZZP_CARS_BRAND, которую будем ограничивать. Нажимаем на признак BRAND правой кнопкой мыши и выбираем New -> Variable.

Вводим название и описание переменной, выбираем тип – Customer Exit,

Убираем Input-Ready и сохраняем переменную. Должно получиться как на рисунке ниже.

Шаг 2. Добавляем переменную в BEx запрос ZZLICAR01_QP01
Открываем вкладку Filter в BEx запросе, нажимаем правой кнопкой мыши и выбираем “Add Characteristics“, выбираем признак BRAND и добавляем его.


Нажимаем на признак BRAND правой кнопкой мыши и выбираем Restrict.

В открывшемся окне переходим на вкладку Variables и переносим переменную ZZE0001_VAR01 в правую часть окна, после чего нажимаем на ОК.

Шаг 3. Проверяем существует ли реализация расширения RSROA_VARIABLES_EXIT
На данном шаге важно проверить существует ли уже в системе реализация расширения RSROA_VARIABLES_EXIT. Это нужно, т.к. если вы сделаете несколько реализация одного раширения, то система будет искать обработку переменной в каждой реализации расширения, что приведет к путанице.
BEST PRACTISE иметь одну реализацию расширения.
Необходимо зайти в транзакцию SE18 и ввести в поле Enhancement Spot значение RSROA_VARIABLES_EXIT.

В появившемся окне проверим есть ли уже Z* реализация расширения (на скриншоте ниже есть).

В таком случае необходимо проанализировать существующую реализацию – скорее всего она определяет как должен называться ABAP класс что бы была обработка перменной. На скриншотах ниже видно, что данная реализация будет считывать все классы с названием “ZCL_VAR_” + название переменной, т.е. в нашем случае ZCL_VAR_ZZE0001_VAR01



Шаг 4. Создаем ABAP класс для обработки переменной.
Создадим свой класс (я специально называю его ZZCL_RSROA_BRAND_01, а не ZCL_VAR_ZZE0001_VAR01, что бы в следующем шаге создать свою реализацию расширения что бы показать как это делается. Но на боевых проектах надо использовать уже созданную реализацию расширения).
Открываем транзакцию SE24, вводим название класса и нажимаем “Создать”.

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


Указываем что сохринам в темповом пакете

В появившемся окне переходим на вкладку “Интерфейсы” и вводим IF_RSROA_VARIABLES_EXIT_BADI, нажимаем enter.

Система автоматически подтянет еще один интерфейс IF_BADI_INTERFACE, необходимый для работы с BADI.

Переходим на вкладу Методы и два раза кликаем на метод Process.

Вводим текст как на скриншоте ниже
method IF_RSROA_VARIABLES_EXIT_BADI~PROCESS. DATA l_s_range LIKE LINE OF c_t_range. IF I_STEP = 1. l_s_range-SIGN = 'I'. l_s_range-OPT = 'EQ'. l_s_range-LOW = 'MERCEDES'. APPEND l_s_range to c_t_range. ENDIF. endmethod.

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

Шаг 5. Создаем реализацию расширения точки расширения RSROA_VARIABLES_EXIT
Еще раз – крайне не рекомендуется создавать свою реализацию расширения, если она уже существует в системе. На данном шаге мы ее создаем исключительно в учебных целях.
Заходим в транзакцию SE19 и вводим RSROA_VARIABLES_EXIT и нажимаем Create.

Вводим описание реализации расширения.

Указываем пакет

Теперь нужно указать на каком классе мы реализуем расширение. Можем закрыть это окно не заполняя его. К нему мы вернемся позднее.

Нажимаем на создать

И заполняем

Должно получиться вот так


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

В моем случае в транзакции se18 мы видим 2 реализации расширения – это плохо, я потом удалю то, которое создали в этом шаге (для того, что бы показать как это делать).

Шаг 6. Проверяем результат
Открываем транзакцию RSRT, вводим наш BEx запрос и нажимаем Execute.

Проверяем, что теперь отображаются только значения MERCEDES
