Sap user exit что такое
BADI. Поиск и использование
Business Add-Ins
User-Exits позволяют клиентам прикрепить дополнительный код для стандартных SAP исходный код без необходимости изменения исходного объекта. Business Add-Ins SAP методика расширений, основанная на ABAP Objects.
Служат для того, чтобы вносить модификацию в алгоритм обработки объекта и свести к минимуму работы при обновлении системы.
Основным преимуществом данной концепции является возможность повторного использования. BAdI может быть реализован несколько раз.
Как найти BADI которая срабатывает при конкретном действии :
В классе cl_exithandler в методе GET_INSTANCE ставим точку останова. В exit_name будет вызываемая в данный момент времени BADI.
Sxv_get_clif_by_name – ставим точку останова. В name будет имя BADI.
Работа с BADI
Рис 1.
Если установлена «1» (Рис 1.) – возможно одновременно иметь несколько активных реализаций.
Если установлена «2» (Рис 1.) – срабатывание реализаций зависит от фильтра. Для случаев если фильтр отсутствует необходимо ставить проверки в начале каждого реализованного метода BADI т.к. реализации срабатывают для всех инфо-типов (например).
Работа с реализациями происходит в пункте меню «Внедрение» (Рис2.) При создании внедрения BADI создается класс методы которого необходимо переопределить согласно нашей задачи.
Рис 2.
При создании BADI с фильтром есть возможность указать информацию для фильтра. (Рис 3.)
Рис 3. Рис 4.
Активные реализации (то есть те которые срабатывают) помечены желтым цветом, деактивированные – синим. (Рис 4.)
Рис 5.
1 – активировать реализацию
2 – деактивировать реализацию (в данном состоянии код выполнятся не будет).
Часто используемые BADI в HR
HRBAS00_RELAT – BADI для соединений.
HRPAD00INFTY – BADI для администрирования персонала
HRBAS00INFTY – BADI для инфо-типов организационного менеджмента.
Расширение SAP для начинающих. User-exit, BADi, Enhancement
Несмотря на то, что система многофункциональна и избыточна, все же достаточно часто требуется вносить изменения в ее логику работы. Начинающие консультанты часто спрашивают, как же можно расширить логику работы системы для требований бизнеса? Не все можно сделать галочками, это верно. Иногда мы влезаем в исходные коды вендора, чтобы сделать свое расширение SAP, свою логику работы. Для нас, с точки зрения HR, представляют интерес два вида расширений системы.
User-exit
Самая старая технология, но и наиболее простая и универсальная. Суть заключается в том, что SAP в своих программах делает вызов специальных Includes (программ), которые начинаются с букв ZX и поэтому разрешены для изменения консультантам. То есть, мы находим такой вызов, создаем Include (программу) и в ней пишем любую логику. При компиляции система видит, что появился в базе данных такой объект — Include, вставляет его содержимое на то место, где был вызов. Так получается, с точки зрения системы, что этот кусок кода как будто бы уже был в самой программе. Например, форма Т-2, программа HRULT2_2004, инклуд HRUIT2_PRC_2004. Смотрим событие get pernr:
* user-exit
include zx_hrult2_pernr.
pn-endda = p_datep.
if gf_fill_period_to = ‘X’.
pnpendda = p_datep.
endif.
Что мы видим? В программе есть user-exit с названием zx_hrult2_pernr. Можно два раза на него кликнуть и тем самым создать программу. Теперь мы в этом Include можем писать свой код, который будет подставлен вместо строчки include zx_hrult2_pernr.
Другой пример из того же отчета:
Насколько мне известно, нет какого-либо единого наглядного каталога, где можно было бы посмотреть все user-exits. Каждую программу нужно смотреть индивидуально. Часть user-exit можно посмотреть, создать и документировать через транзакцию CMOD — управление проектами расширений. Запускаем транзакцию CMOD, в меню «Утилиты» выбираем «SAP-расширения». И по ключевым словам ищем доступные расширения. Искать проще по маске по словам PY, PT, PA, HR, OM для поля «Прикладной компонент». К этому полю, почему-то, нет средства поиска.
Это уже новая технология. Расшифровывается как Business Add-Ins (бизнес-дополнения). BAdi состоит из двух сущностей: определение и реализация. Определение — это своего рода описание объекта с указанием, что он может хранить (какие есть атрибуты), что делать (какие есть методы). Это определенная модель, которая описывает, что обязательно должно быть на входе и на выходе, какие параметры могут быть, их типы и правила вызова. Своего рода абстракция: все мы понимаем, что велосипед состоит из колес, педалей, рамы, руля, цепи, которая соединяет педали с колесом через муфту. Но реализация может быть разной. Так и здесь. Концептуальный проект велосипеда — это определение BAdi, а его конкретная реализация в горный, шоссейный или дамский велосипед — это реализация BAdi. Чтобы определить модель велосипеда (какую именно реализацию нужно вызвать в программе) есть понятие фильтра. Фильтр — это элемент данных в определении BAdi. При вызове программа заполняет его каким-то значением (как решит программист). Система смотрит все реализации этого определения BAdi, у которых стоит такое же значение фильтра (или фильтр просто не используется как критерий), и вызывает подходящую реализацию. По этому принципу, например, сделана косвенная оценка видов оплаты. Посмотрите определение HR_INDVAL (тр. SE18) и реализации HR_IV_* (тр. SE19).
Пример вызова данного BAdi с косвенной оценкой можно посмотреть в процедуре indbw в функциональном модуле RP_EVALUATE_INDIRECTLY. В данном случае вызов не совсем очевиден, но понять принцип работы можно.
Транзакции для создания BAdi: SE18 — создание определений, SE19 — создание реализаций.
Практические рекомендации по поиску user-exit-ов (пользовательских расширений) в стандартном коде
Неловкин Александр Николаевич
Chief Software Engineer
Как консультантам, так и разработчикам системы SAP приходится сталкиваться с необходимостью расширить стандартную функциональность системы. Одним из путей расширения функциональности является использование пользовательских расширений (USER-EXIT). Вопросу поиска таких расширений в стандартных приложениях SAP посвящена данная статья.
Как показывает опыт внедрения и сопровождения систем SAP ERP, почти 30-50 % всех ABAP разработок составляют расширения стандартной функциональности при помощи пользовательских расширений (user-exit).
Итак, в рамках данной статьи рассматриваются приёмы поиска в исходном коде user-exit-ов, а именно: customer-exit и BAdi (BusinessAdd-Ins). Новомодные технологии, такие, как Enhancements Spots, рассматривать в данной статье не будем. Их я использую, как правило, в крайнем случае, т.к. не имея рамок, накладываемых интерфейсом во всех вышеупомянутых технологиях, Enhancements Spots провоцирует бесконтрольно вмешательство в логику обработки данных, что может привести к нарушению их целостности.
Применение данной методики является альтернативой применению различных программ, выдающих для заданной программы/транзакции список user-exit-ов. Применение таких программ имеет один существенный недостаток – не даются ответы на вопросы:
Предлагаемая методика (несмотря на её громоздкость) требует меньших трудозатрат за счёт того, что отсекает все «лишние» пользовательские расширения.
Рассмотрим предлагаемую методику на примере решения задачи: при создании в системе кредитора исключить появление двойника.
Для решения этой задачи необходимо поискать в системе дебитора с таким же Номером плательщика налога (т.е. выяснить, не заведена ли в систему информация об этом лице как о дебиторе). Если поиск оказался удачным, то следует заполнить поле «Дебитор» в транзакции ввода кредитора номером найденного дебитора. Для создания кредитора пользователи используют транзакцию XK01 (Ввод кредитора).
Технически, для реализации решения этой задачи нам нужно будет взять из данных создаваемого кредитора (табл. LFA1) значение поля «РегНалогНомер-1» (STCD1), сделать запрос к таблице данных существующих дебиторов (KNA1), попытаться найти в ней запись со значением поля STCD1 равным нашему значению и, если поиск успешен, скопировать из найденной записи поле KNA1-KUNNR в поле LFA1-KUNNR.
1) Запускаем транзакцию (в нашем случае XK01)
3) Непосредственно перед нажатием на кнопку «Сохранить», набираем в строке команд «/h» и нажимаем Enter. В строке состояния (внизу окна) должно появиться сообщение «Отладка включена»
4) Нажимаем «Сохранить» и попадаем в отладчик. (рис.1)
6) На закладке «ABAP команда» вписываем «call customer-function» (рис.3)
Справка: Вызов customer-exit осуществляется оператором CALL CUSTOMER-FUNCTION.
7) На закладке «Метод» заносим «CL_EXITHANDLER» и «GET_INSTANCE» соответственно в поля «Имя класса» и «Имя метода» и нажимаем «Дальше» (кнопка ). (рис.4)
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
Sap user exit что такое
Часовой пояс: UTC + 3 часа
Правила форума
User Exit
Специалист |
Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
Как «отловить» user exit? _________________ |
Почетный гуру |
Зарегистрирован:
Пт, авг 04 2006, 20:56
Сообщения: 1005
Откуда: 37 МИКРОРАЙОН
Пол: Мужской
Как «отловить» user exit? |
Специалист |
Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
У меня не оч. понятная мне синтаксическая ошибка возникает при попытке активировать данную программу. _________________ |
Почетный гуру |
Зарегистрирован:
Пт, авг 04 2006, 20:56
Сообщения: 1005
Откуда: 37 МИКРОРАЙОН
Пол: Мужской
У меня не оч. понятная мне синтаксическая ошибка возникает при попытке активировать данную программу. |
Специалист |
Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
_________________ |
Почетный гуру |
Зарегистрирован:
Пт, авг 04 2006, 20:56
Сообщения: 1005
Откуда: 37 МИКРОРАЙОН
Пол: Мужской
DATA : jtab LIKE tadir OCCURS 0 WITH HEADER LINE. DATA : v_devclass LIKE tadir-devclass. PARAMETERS : p_tcode LIKE tstc-tcode, DATA wa_tadir TYPE tadir. IF NOT p_tcode IS INITIAL. SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode. ELSEIF NOT p_pgmna IS INITIAL. SELECT SINGLE * FROM tadir AND obj_name = tstc-pgmna. MOVE : tadir-devclass TO v_devclass. SELECT SINGLE * FROM trdir WHERE name = tstc-pgmna. SELECT SINGLE * FROM tfdir WHERE pname = tstc-pgmna. SELECT SINGLE * FROM enlfdir WHERE funcname = tfdir-funcname. SELECT SINGLE * FROM tadir AND obj_name EQ enlfdir-area. MOVE : tadir-devclass TO v_devclass. SELECT * FROM tadir INTO TABLE jtab AND object IN (‘SMOD’, ‘SXSD’) AND devclass = v_devclass. SELECT SINGLE * FROM tstct WHERE sprsl EQ sy-langu AND tcode EQ p_tcode. FORMAT COLOR COL_POSITIVE INTENSIFIED OFF. IF NOT jtab[] IS INITIAL. FORMAT COLOR COL_HEADING INTENSIFIED ON. DATA : wf_txt(60) TYPE c, wf_object2(30) TYPE c. FORMAT COLOR COL_HEADING INTENSIFIED ON. 2 ‘Enhancement/ Business Add-in’, IF wa_tadir-object = ‘SMOD’. ELSEIF wa_tadir-object = ‘SXSD’. wf_object2 = ‘ Business Add-in’. FORMAT COLOR COL_GROUP INTENSIFIED ON. wf_smod = wf_smod + 1. SELECT SINGLE modtext INTO wf_txt WHERE sprsl = sy-langu AND name = wa_tadir-obj_name. FORMAT COLOR COL_NORMAL INTENSIFIED OFF. SELECT SINGLE text INTO wf_txt WHERE sprsl = sy-langu AND exit_name = wa_tadir-obj_name. FORMAT COLOR COL_NORMAL INTENSIFIED ON. 2 wa_tadir-obj_name HOTSPOT ON, WRITE : /(105) sy-uline. FORMAT COLOR COL_TOTAL INTENSIFIED ON. FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. WRITE:/(105) ‘No userexits or BADis exist’. FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. WRITE:/(105) ‘Transaction does not exist’. DATA : wf_object TYPE tadir-object. GET CURSOR FIELD field1. CHECK field1(8) EQ ‘WA_TADIR’. READ TABLE jtab WITH KEY obj_name = sy-lisel+1(20). MOVE jtab-object TO wf_object. SET PARAMETER ID ‘MON’ FIELD sy-lisel+1(10). CALL TRANSACTION ‘SMOD’ AND SKIP FIRST SCREEN. SET PARAMETER ID ‘EXN’ FIELD sy-lisel+1(20). CALL TRANSACTION ‘SE18’ AND SKIP FIRST SCREEN. |
Специалист |
Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
_________________ |
Президент |
Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
Специалист |
Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
_________________ |
Специалист |
Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
Опишу свои действия: На этом вот месте и возникает вопрос:) _________________ |
Гуру-эксперт |
Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Опишу свои действия: На этом вот месте и возникает вопрос:) А не знаю как Вы искали в SMOD по транзакции, но писк (F4) по имени компонента (exit_saplqaat_002) выдал расширение QAAT0001 |
Специалист |
Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
Второй вариант мне нравится намного больше, но вот вопрос: будет ли это работать? _________________ |
Гуру-эксперт |
Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
. Второй вариант мне нравится намного больше, но вот вопрос: будет ли это работать? |
Президент |
Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
Похоже, что QAAT0001 имеет какое-то отношение к Quality Assurance, inspection и т.п. У нас, например, это вообще не используется. А нельзя ли огласить, что вы, собственно, пытаетесь изобразить в user-exit? Какова конечная цель? |
Специалист |
Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
С одной стороный не передается номер ТЗ, что не есть хорошо в моем случае(хотя, наверное, можно как-нибуть уйти от этой проблемы). С другой стороны CF_EPSILON, он же epsilon на входе можно было бы использовать в качестве флага, чтоб include не выполнялся при втором и полседующих проходах. Подозреваю, что это ужасно тупо всилу своей примитивности, но другого способа я не не вижу, а точнее сказать не знаю. Если кто подсксажет умное решение, буду весьма признателен.Спасибо. _________________ Часовой пояс: UTC + 3 часа Кто сейчас на конференцииСейчас этот форум просматривают: нет зарегистрированных пользователей |
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |
Логотип © 2006 Андрей Горшков
Поддержка: Кирилл Андреев, 2011-…
User exits are used in an extraction if the standard SAP extractors do not provide the expected data or the required functionality, for instance in authorizations or time checks. User exits are commonly used in Sales and Distribution (SD) modules. There are many exits provided by SAP in the areas of sales, transportation, shipping and billing. A user exit is designed to make some changes when standard SAP is not capable of fulfilling all the requirements.
To be able to access what exits are available in each area of sales, go to IMG using this path: IMG → Sales and Distribution → System Modifications → User Exits. The documentation for each exit in the areas of SD is explained thoroughly.
For instance, if you want to find user exits in Sales Document Processing (contract, quotation or sales order), follow the path mentioned above and continue to expand the node User Exits in Sales → User Exits. Click on icon documentation to see all user exits available in Sales Document Processing.
S.No. | User Exit & Description |
---|---|
1 |