user_exit

15
1 User-Exit для ВЕх-переменных При создании ВЕх-переменных есть возможность выбрать обработку через Программа клиента (User-Exit). Это означает, что значение такой переменной будет заполняться с помощью пользовательской программы, а результат может быть вычислен на основании других переменных. К примеру, бизнес-пользователю нужно анализировать данные по времени: за определенную дату и с начала месяца по эту дату. Пользователь логично считает, что нет смысла дважды вводить требуемую дату и еще вводить дату начала месяца – он хочет один раз ввести анализируемую дату, а начало месяца пусть система посчитает автоматически. Определение переменных и создание отчета Нужно создать 2 переменные: которая будет рассчитываться с помощью программы клиента, и вторая, на основании которой будет рассчитываться первая переменная. Создаем переменную, которую будет заполнять пользователь. Для этого нужно выбрать такие параметры: - Ввод вручную/Значение по умолчанию - Отдельное значение - Ввод обязателен - Готов к вводу

Upload: divo75

Post on 21-Apr-2015

127 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: User_exit

1

User-Exit для ВЕх-переменных При создании ВЕх-переменных есть возможность выбрать обработку через Программа клиента (User-Exit). Это означает, что значение такой переменной будет заполняться с помощью пользовательской программы, а результат может быть вычислен на основании других переменных. К примеру, бизнес-пользователю нужно анализировать данные по времени: за определенную дату и с начала месяца по эту дату. Пользователь логично считает, что нет смысла дважды вводить требуемую дату и еще вводить дату начала месяца – он хочет один раз ввести анализируемую дату, а начало месяца пусть система посчитает автоматически.

Определение переменных и создание отчета Нужно создать 2 переменные: которая будет рассчитываться с помощью программы клиента, и вторая, на основании которой будет рассчитываться первая переменная. Создаем переменную, которую будет заполнять пользователь. Для этого нужно выбрать такие параметры:

- Ввод вручную/Значение по умолчанию - Отдельное значение - Ввод обязателен - Готов к вводу

Page 2: User_exit

2

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

- Программа клиента - Интервал - Ввод обязателен - Снять галочку Готов к вводу

Page 3: User_exit

3

Чтобы пользователь в заголовках столбцов видел не постоянный текст, как «Начальная дата» и «Конечная дата», а реальные даты, за которые выполнен отчет. То создадим еще 2 текстовые переменные. Кроме имени и описания эти переменные отличаются только значением для интервала – первая переменная будет показывать конечное значение интервала, а вторая переменная – начальное значение.. Остальные параметры совпадают:

- обработка через Путь замены - признак Дата продажи - замена переменной на Название (текст)

Page 4: User_exit

4

Теперь создадим отчет в ВЕх Query Designer. Мы будем анализировать скидки по магазинам. Поэтому в области фильтра Тип транзакции ограничен значением Скидка. В произвольные признаки добавлен признак Дата продажи – мы используем его таким образом, чтобы была возможность в отчете сделать развертку по дате и проверить правильность выведенных данных. В строках у нас Магазин и показатель Продажная стоимость (который показывает значение скидки).

Этот шаг узко специфичен – в каждом конкретном случае будет своя структура отчета.

Page 5: User_exit

5

На следующем этапе в столбцах нужно создать структуру, а в ней определить два новых выбора.

Оба выбора делаются для признака Дата продажи, но выборы все же не одинаковые. В первом случае мы ограничиваем выбор вводимой пользователем переменной По дату (Z33_DAT1). А в описании выбираем текстовую переменную Кон. дата (Z33_DAT3).

Page 6: User_exit

6

Во втором случае мы ограничиваем выбор рассчитываемой переменной Интервал дат (Z33_DAT2). А в описании выбираем обе текстовые переменные: Нач. дата (Z33_DAT4) – Кон. дата (Z33_DAT3).

Page 7: User_exit

7

В результате должна получиться структура как на рисунке ниже.

Page 8: User_exit

8

Создание расширения

Переменные созданы. Теперь нужно написать АВАР-код для расчета переменной. Для описания пользовательских расширений нужно открыть транзакцию CMOD. Там нужно создать новый проект с расширением RSR00001.

Учтите, что нельзя дважды создать это расширение, если оно уже создано, то нужно использовать существующее. Если неизвестно в каком проекте необходимое расширение, то можно воспользоваться транзакцией SMOD – это транзакция расширений. Нужно ввести название расширения RSR00001, выбрать подобъект Компоненты и достаточно открыть на просмотр.

Page 9: User_exit

9

В новом окне нас интересует только один функциональный модуль EXIT_SAPLRRS0_001. Двойным кликом входим в него.

Page 10: User_exit

10

Тело функционального модуля состоит из одной строки – вся логика вынесена в INCLUDE.

Наиболее важные переменные функционального модуля: I_VNAM – имя ВЕх-переменной I_STEP – для переменной с программой клиента это расширение вызывается до 4 раз. На каждом

этапе значение переменной I_STEP соответствует одному из значений: 1, 2, 3, 0. E_T_RANGE – таблица возвращающая значения результатов выполнения пользовательского

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

Page 11: User_exit

11

I_T_VAR_RANGE – это таблица, которая имеет такую структуру:

Соответствие полей структуры показано на рисунке ниже:

VNAM – имя переменной IOBJNM – имя инфо-объекта SIGN – если переменная типа «Опции выбора», то здесь указывается выбрать значения

переменной, или исключить из выбора значения переменной. OPT – оператор сравнения (равно, не равно, больше, меньше) LOW – если переменная интервала, то с какого значения (нижняя граница) HIGH – для переменной интервала, по какое значение (верхняя граница)

Page 12: User_exit

12

После рассмотрения ключевых переменных функционального модуля можно перейти к описанию INCLUDE. Двойным кликом можно его открыть. Документация SAP предлагает такой пример простейшего расширения

Определено только две переменные: L_S_RANGE – это рабочая область, значения которой добавляются в выходную таблицу LOC_VAR_RANGE – это рабочая область, куда считываются строки из внутренней таблицы переменных (таблица содержит все переменные запроса). Это расширение будет выполняться для всех переменных, определенных как Программа клиента. Поэтому нужно сделать ограничение, чтобы код не срабатывал для других переменных. С этой целью используется оператор CASE – с его помощью задают разную логику работы для разных переменных. На примере выше видно, что код сработает для переменной CUMMONTH – она будет рассчитана на основании другой переменной (MONTH). Оператор LOOP AT считывает данные о переменной MONTH в рабочую область LOC_VAR_RANGE. На основании значений этой области рассчитываются новые значения и сохраняются в рабочей области L_S_RANGE. После этого новые значения вставляются в выходную таблицу E_T_RANGE. На этом выполнение пользовательской программы заканчивается.

Page 13: User_exit

13

Тестовый пример готовился на сервере BI5. Там уже существовало расширение, и кто-то его использовал. Поэтому можно увидеть, что часть кода уже существует для нужд других задач (этот код выделен желтой рамкой). intern_range – это рабочая область, куда считываются строки из внутренней таблицы. На предыдущем рисунке для этой цели использовалась рабочая область LOC_VAR_RANGE.

Page 14: User_exit

14

Ниже, под кодом других пользователей, можно вставить свой код. Начинается он с оператора WHEN – чтобы код срабатывал только для определенной переменной. Рассчитывать новое значение рассчитываемой переменной нужно на втором шаге, когда I_STEP = 2. Оператор LOOP AT считывает данные переменной (Z33_DAT1), на основании которой будет рассчитываться значение переменной Z33_DAT2. Результат вычислений записывается в строку L_S_RANGE, а по окончании вычислений эта строка вставляется в таблицу E_T_RANGE

Page 15: User_exit

15

После выполнения всех действий, если запустить отчет на выполнение, то окно ввода переменных будет выглядеть таким образом:

Для ввода доступно только одна переменная, куда нужно ввести только одно значение – анализируемый день. Вторая переменная будет заполнятся автоматически. А отчет будет показывать две колонки результатов: на дату и с начала месяца. Благодаря тестовым переменным заголовки столбцов отображают актуальное значение анализируемого периода.

Для дополнительной информации по этой теме:

1. “How to Derive a Variable value from another variable” http://sapbwneelam.blogspot.com/2008/09/how-to-derive-variable-value-from.html

2. В случае возникновения проблем с переменной готовой к вводу можно посмотреть ноту Note 492504 - Dependent customer exit-type variables