Меню

Практические рекомендации по поиску user-exit-ов (пользовательских расширений) в стандартном коде

Как консультантам, так и разработчикам системы SAP приходится сталкиваться с необходимостью расширить стандартную функциональность системы. Одним из путей расширения функциональности является использование пользовательских расширений (USER-EXIT). Вопросу поиска таких расширений в стандартных приложениях SAP посвящена данная статья.

 

Александр Неловкин - ведущий инженер-программист отдела разработки программного обеспечения центра компетенции SAP филиала «Управление «Укргазтехсвязь» ДК «Укртрансгаз». Опыт внедрения и сопровождения систем SAP – более 14 лет. Богатый опыт по консультированию и подготовке разработчиков для SAP систем. Более десятка проектов внедрения и модернизации системы SAP. Навыки и опыт работы со всем инструментарием SAP ABAP Workbench практически во всех модулях системы.

Как показывает опыт внедрения и сопровождения систем SAP ERP, почти 30-50 % всех ABAP разработок составляют расширения стандартной функциональности при помощи пользовательских расширений (user-exit).

Механизмов, позволяющих пользователю влиять на работу стандартных программ (транзакций), - несколько. В данной статье мы рассмотрим только те механизмы, с которыми приходится сталкиваться ABAP-разработчикам в целях расширения исходного кода. Настройки, персонализацию, расширение объектов ABAP-словаря и т.п. мы рассматривать не будем.

Итак, в рамках данной статьи рассматриваются приёмы поиска в исходном коде user-exit-ов, а именно: customer-exit и BAdi (BusinessAdd-Ins). Новомодные технологии, такие, как Enhancements Spots, рассматривать в данной статье не будем. Их я использую, как правило, в крайнем случае, т.к. не имея рамок, накладываемых интерфейсом во всех вышеупомянутых технологиях, Enhancements Spots провоцирует бесконтрольно вмешательство в логику обработки данных, что может привести к нарушению их целостности.

Применение данной методики является альтернативой применению различных программ, выдающих для заданной программы/транзакции список user-exit-ов. Применение таких программ имеет один существенный недостаток – не даются ответы на вопросы:

  1. Какие из перечисленных user-exit-ов вызываются, начиная с интересующего нас места в программе?
  2. В какой последовательности user-exit-ы вызываются?

Предлагаемая методика (несмотря на её громоздкость) требует меньших трудозатрат за счёт того, что отсекает все «лишние» пользовательские расширения.

Рассмотрим предлагаемую методику на примере решения задачи: при создании в системе кредитора исключить появление двойника.

Для решения этой задачи необходимо поискать в системе дебитора с таким же Номером плательщика налога (т.е. выяснить, не заведена ли в систему информация об этом лице как о дебиторе). Если поиск оказался удачным, то следует заполнить поле «Дебитор» в транзакции ввода кредитора номером найденного дебитора. Для создания кредитора пользователи используют транзакцию XK01 (Ввод кредитора).

Технически, для реализации решения этой задачи нам нужно будет взять из данных создаваемого кредитора (табл. LFA1) значение поля «РегНалогНомер-1» (STCD1), сделать запрос к таблице данных существующих дебиторов (KNA1), попытаться найти в ней запись со значением поля STCD1 равным нашему значению и, если поиск успешен, скопировать из найденной записи поле KNA1-KUNNR в поле LFA1-KUNNR.

Последовательность действий:

1) Запускаем транзакцию (в нашем случае XK01)

2) Выполняем все действия, которые совершают пользователи до «ключевого» действия (в нашем примере - это сохранение данных кредитора)

3) Непосредственно перед нажатием на кнопку «Сохранить», набираем в строке команд «/h» и нажимаем Enter. В строке состояния (внизу окна) должно появиться сообщение «Отладка включена»

4) Нажимаем «Сохранить» и попадаем в отладчик. (рис.1)

Рис. 1

5) В меню выбираем «Точки прерывания» -> «Создание точки прерывания» (или нажимаем F9). Откроется модальное окошко. (рис.2)

Рис. 2

6) На закладке «ABAP команда» вписываем «call customer-function» (рис.3)

Рис. 3

Справка: Вызов customer-exit осуществляется оператором CALL CUSTOMER-FUNCTION.

7) На закладке «Метод» заносим «CL_EXITHANDLER» и «GET_INSTANCE» соответственно в поля «Имя класса» и «Имя метода» и нажимаем «Дальше» (кнопка ). (рис.4)

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти