badi sap что это

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

badi sap что этоРис 1.

Если установлена «1» (Рис 1.) – возможно одновременно иметь несколько активных реализаций.

Если установлена «2» (Рис 1.) – срабатывание реализаций зависит от фильтра. Для случаев если фильтр отсутствует необходимо ставить проверки в начале каждого реализованного метода BADI т.к. реализации срабатывают для всех инфо-типов (например).

Работа с реализациями происходит в пункте меню «Внедрение» (Рис2.) При создании внедрения BADI создается класс методы которого необходимо переопределить согласно нашей задачи.

badi sap что этоРис 2.

При создании BADI с фильтром есть возможность указать информацию для фильтра. (Рис 3.)

badi sap что этоРис 3. badi sap что этоРис 4.

Активные реализации (то есть те которые срабатывают) помечены желтым цветом, деактивированные – синим. (Рис 4.)

badi sap что этоРис 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 — создание реализаций.

Источник

Badi sap что это

BAdI (или Business Add-Ins) появились уже в 4.7 версии, но я там не был, поэтому то, что я здесь написал, справедливо для версии ERP2005.

Запускаем SE24, указываем класс «cl_exithandler».
Тыкаем «Просмотр», в появившемся списке тыкаем в метод GET INSTANCE 2 (два) раза быстро (double click). Открывается исходный код. Переходим на строку CASE sy-subrc. (Это в начале, у меня это строка 28 ).
Ставим бряк на эту строку.

Запускаем нужную нам транзакцию, например, me21n. Вылезает окно отладчика, смотрим содержимое EXIT_NAME. Для перехода к следующему сработавшему BAdI нажимаем F8.

_________________
Eritis sicut Deus, scientes bonum et malum.

Последний раз редактировалось SAA Чт, авг 14 2008, 07:36, всего редактировалось 3 раз(а).

Гуру-эксперт
badi sap что это

Зарегистрирован:
Вт, авг 24 2004, 07:19
Сообщения: 3952
Откуда: ECC 6.0, South Kazakhstan

Вот прога, с помощью которой это ( найти Exit-ы и BADI ) сделать проще (к сожалению не помню откуда ее взял, так что прямой ссылки на источник-оригинал дать не могу):

REPORT ZPM_X_EXIT_BADI NO STANDARD PAGE HEADING
LINE-SIZE 80 LINE-COUNT 65 MESSAGE-ID ZM.

TABLES : TSTC,
TADIR,
MODSAPT,
MODACT,
TRDIR,
TFDIR,
ENLFDIR,
SXS_ATTRT,
TSTCT.

DATA : JTAB LIKE TADIR OCCURS 0 WITH HEADER LINE.
DATA : FIELD1(30).
DATA : V_DEVCLASS LIKE TADIR-DEVCLASS.
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.
TSTC-PGMNA = P_PGMNA.
ENDIF.

IF SY-SUBRC EQ 0.
SELECT SINGLE * FROM TADIR
WHERE PGMID = ‘R3TR’
AND OBJECT = ‘PROG’
AND OBJ_NAME = TSTC-PGMNA.

MOVE : TADIR-DEVCLASS TO V_DEVCLASS.

IF SY-SUBRC NE 0.
SELECT SINGLE * FROM TRDIR
WHERE NAME = TSTC-PGMNA.
IF TRDIR-SUBC EQ ‘F’.
SELECT SINGLE * FROM TFDIR
WHERE PNAME = TSTC-PGMNA.

SELECT SINGLE * FROM ENLFDIR
WHERE FUNCNAME = TFDIR-FUNCNAME.

SELECT SINGLE * FROM TADIR
WHERE PGMID = ‘R3TR’
AND OBJECT = ‘FUGR’
AND OBJ_NAME EQ ENLFDIR-AREA.

MOVE : TADIR-DEVCLASS TO V_DEVCLASS.
ENDIF.
ENDIF.

SELECT * FROM TADIR INTO TABLE JTAB
WHERE PGMID = ‘R3TR’
AND OBJECT in (‘SMOD’, ‘SXSD’)
AND DEVCLASS = V_DEVCLASS.

SELECT SINGLE * FROM TSTCT
WHERE SPRSL EQ SY-LANGU
AND TCODE EQ P_TCODE.

LOOP AT JTAB into wa_tadir.
at first.
FORMAT COLOR COL_HEADING INTENSIFIED ON.

endif.
FORMAT COLOR COL_GROUP INTENSIFIED ON.

2 wf_object2,
105 SY-VLINE.
endat.

case wa_tadir-object.
when ‘SMOD’.
wf_smod = wf_smod + 1.
SELECT SINGLE MODTEXT into wf_txt
FROM MODSAPT
WHERE SPRSL = SY-LANGU
AND NAME = wa_tadir-OBJ_NAME.
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.

ELSE.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE:/(105) ‘No userexits or BADis exist’.
ENDIF.
ELSE.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE:/(105) ‘Transaction does not exist’.
ENDIF.

data : wf_object type tadir-object.
clear wf_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.

case wf_object.
when ‘SMOD’.
SET PARAMETER ID ‘MON’ FIELD SY-LISEL+1(10).

CALL TRANSACTION ‘SMOD’ AND SKIP FIRST SCREEN.
when ‘SXSD’.
SET PARAMETER ID ‘EXN’ FIELD SY-LISEL+1(20).
CALL TRANSACTION ‘SE18’ AND SKIP FIRST SCREEN.
endcase.

Последний раз редактировалось OlegDm Ср, ноя 21 2007, 06:23, всего редактировалось 1 раз.

Директор
badi sap что это

Зарегистрирован:
Чт, авг 18 2005, 17:00
Сообщения: 1174
Откуда: РФ

Модератор
badi sap что это
badi sap что это

Зарегистрирован:
Чт, май 19 2005, 12:34
Сообщения: 1941
Откуда: НК
Пол: Мужской

_________________
Eritis sicut Deus, scientes bonum et malum.

Старший специалист
badi sap что это

Зарегистрирован:
Чт, авг 02 2007, 14:26
Сообщения: 442
Откуда: S/4 HANA
Пол: Мужской

Менеджер
badi sap что это

Зарегистрирован:
Вт, авг 17 2004, 10:25
Сообщения: 627

Начинающий
badi sap что это

Зарегистрирован:
Чт, ноя 22 2007, 18:33
Сообщения: 1

Гуру-эксперт
badi sap что это

Зарегистрирован:
Вт, авг 24 2004, 07:19
Сообщения: 3952
Откуда: ECC 6.0, South Kazakhstan

Почетный гуру
badi sap что это
badi sap что это

Зарегистрирован:
Чт, сен 29 2005, 07:34
Сообщения: 1127
Откуда: РОССИЯ
Пол: Мужской

_________________
мне бы такой «Журнал изменений» как в SAP да в жизнь. цены бы не было!

Почетный гуру
badi sap что это
badi sap что это

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402

Часовой пояс: UTC + 3 часа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Логотип © 2006 Андрей Горшков
Поддержка: Кирилл Андреев, 2011-…

Источник

BADI – Технология внедрения бизнес расширений / дополнений

badi sap что это

Точенюк Олег Виталиевич

По разному называли

BADI – Технология внедрения бизнес расширений / дополнений в код стандартных транзакций; данная техника доступна в любых модулях системы, фактически эта технология, использующая объектно-ориентированный подход к реализации расширений системы, вышла для замены техники Customerexits.

Продолжение цикла статей «Техники расширений стандартной системы SAP».

Все статьи цикла приведены внизу публикации.

1. Общее описание технологии BADI.

Сегодня существуют два варианта реализации технологии BADI: это так называемы старые и новые BADI расширения. Различие между ними состоит в способе реализации класса расширения. В старых реализациях BADI, использовалась техника интерфейсов, т.е. фактически пользователю предлагалось, реализовать наследника метода класса и таким образом выстраивалась цепочка независимых реализаций. Такая методика позволяла разнести разные реализации в свои расширения, однако проблемы в одной из наследуемых реализаций могли поломать работу всех пользовательских расширений. Так же не решалась проблема хранения глобальных переменных. Поэтому, через некоторое время компания перешла на новый тип BADI; теперь при реализации вы пишете класс, как наследник заранее предопределенного класса, реализующего расширение. В точке вызова система проверяет наличие всех созданных и активных инстанций – наследников от базового класса расширения и вызывает соответствующие методы всех зарегистрированных классов наследников. Перечень методов, которые будут вызваться и точки вызова, заранее определены в родительском классе. Для механизма реализации новых BADI в язык системы были введены две новые служебные команды GET BADI и CALL BADI.

На первый взгляд, для пользователя особо ничего не изменяется при реализации как старых, так и новых BADI. Однако, на самом деле отличия существенные. Новая техника расширений решила проблему хранения глобальных переменных в рамках класса реализации, что было довольно проблематично осуществить, используя механизмы наследования методов. Классы реализации полностью стали независимыми и соответственно разработчики получили раздельные объекты, которые можно независимо обрабатывать. Именно новая технология BADI, предоставляет полную изоляцию каждой инстанции; непонимание этих различий, приводит к неправильному использованию новых BADI. Например, при переходе от старого типа реализации к новому набор методов остался старый, а вот параметры методов существенно изменились, что привело к полной дезориентации части разработчиков, особенно индусских. Простой пример, в системе существует BADI: MB_MIGO_BADI – Поля пользователя на экране MIGO. В старой реализации метода CHECK_ITEM, если правильно помню (к сожалению, старой системы у меня уже нет), вам передавалась позиция документа, которую вы могли проверить на ошибки и вернуть результат проверки в параметр ET_BAPIRET2. В новой реализации в этот метод передается только значение переменной I_LINE_ID – Unique Identification of Document Line, т.е. лишь номер позиции которую надо проверить, но данных самой позиции вам не передается. Это привело к тому, что на куче индусских форумов и части русскоязычных, скопированных из индусских, реализуется механизм сохранения вводимых позиций через IMPORT TO MEMORY в методе IF_EX_MB_MIGO_BADI

LINE_MODIFY, чтобы потом в методе проверки сделать EXPORT FROM MENORY и далее проверить значения. Я так понимаю, все реализующие этот механизм, считают себя профессионалами, а вот разработчиков компании SAP подозревают в том, что они забыли передать в метод проверки сам объект проверки – позицию документа. Они, видите ли, передали какую-то непонятную переменную I_LINE_ID, которая содержит просто число, причем. это число даже не является порядковым номером позиции документа. В общем, впечатление такое, что совсем непонятно, как теперь работать. и поэтому люди пишут какие-то кривые обходные методики получения доступа к позициям документа внутри BADI, но при этом не просто пишут, они еще и рекомендуют их как единственно верное решение. Лично я, когда впервые столкнулся с новым BADI и проанализировал предложенные механизмы, решил, что, чего-то недопонимаю, так как вряд ли разработчики SAP могли так вот ошибиться. Однако мне достаточно было просмотреть рекомендуемую реализацию шаблона BADI, чтобы понять, что я действительно заблуждался: в методе проверки CHECK_ITEM, при использовании нового механизма BADI, нет нужды передавать проверяемую строку документа.

Рекомендация: Если вы не понимаете механизма работы, не отталкивайтесь от предположения, что реализовавший данный механизм, был неполноценным, так как в 99% вы просто не разобрались в решении, а 1% я оставляю на пограничные случаи.

2. Пример расширения MB_MIGO_BADI для транзакции MIGO

Пример работы с BADI, предлагаю рассмотреть на основе работы с транзакцией MB_MIGO_BADI, раз уже начал этот раздел с ее упоминания. Так как система новая, то будем использовать механизм реализации нового BADI. Кстати, если вы попытаетесь использовать старый или так называемый классический BADI, то все равно на определенном этапе реализации система скажет вам, что уже существует новая реализация для данного BADI, поэтому будет выполнена конвертация данных для нового механизма. Отсюда следует, что в системе не может существовать одновременно поддержка реализации старого и нового механизмов BADI для одного и того же объекта, как например, для MB_MIGO_BADI.

Создание точки расширения выполняется в транзакции SE19 – BAdI-Builder – внедрения, Рис.1. Транзакция работает или в режиме создания, или в режиме изменения расширения. Если честно, не очень распространенный вариант первого экрана транзакции. Для создания точки расширения требуется ввести имя существующей в системе точки расширения, в данном случае это MB_MIGO_BADI. Выбираем режим создания расширения.

badi sap что это

Рис.1

Появится диалоговый экран с запросом создаваемой точки расширения, который будет реализовывать наше расширение. Так как основное имя MB_MIGO_BADI, то имя создаваемой точки пусть будет ZZ_MB_MIGO_BADI, имя может быть любое подходящее под соглашения по наименованию пользовательских объектов, Рис.2.

badi sap что это

Рис.2

Для группировки нескольких точек расширений, которые «обслуживают» один бизнес-процесс, можно создать групповое имя, которое будет объединять создаваемые расширения, для упрощения управления всеми реализациями. Если это просто локальная реализация расширения, то можно не создавать групповое имя. После подтверждения создания появляется запрос на ввод имени реализации, указания класса реализации и выбора определения BADI, Рис.3, это все организовано, так, потому как точка расширения может включать в себя несколько различных классов, в совокупности составляющих реализацию точки расширения. В нашем случае точка расширения совпадает по имени с классом реализации, при этом класс реализации для точки только один.

badi sap что это

Рис.3

После заполнения всех полей подтверждаем ввод. Система предложит нам вариант создания реализации (фактически наследуемого класса). Так как у нас есть пример реализации, и мы создаем расширение данного типа в первый раз, то лучшим выходом будет создание реализации на основе копирования класса-примера Если же вы уже знаете, как создавать расширение, то выбираете создание пустого класса, так как при копировании класса-примера создаваемый новый класс будет реализовывать все методы класса-паррента (шаблона), хотя вам, может быть, и не требуется реализация всех методов, Рис.4.

badi sap что это

Рис.4

Таким образом, мы получаем класс, реализующий расширение с перечнем все доступных методов, которые уже изначально содержат пример правильного кода, который позволит вам написать свою реализацию по аналогии с примером. Сохраняем созданный класс и теперь можно перейти к просмотру/редактированию созданного класса расширения, Рис.5. После сохранения расширения его нужно активировать. Если расширение активно, то результат его работы можно увидеть в транзакции MIGO.

badi sap что это

Рис.5

Работать с точкой расширения можно или используя и дальше транзакцию SE19 или же можно работать уже с классом, реализующим расширение, используя транзакцию SE24 / SE80.

Сейчас транзакция MIGO не содержит закладки пользователя, Рис.6, так как класс еще не активирован, но если выполнить активацию, то при просмотре документов будет доступна закладка с полями пользователя.

badi sap что это

Рис.6

Так как, класс был создан на основе шаблона, то количество объектов, подлежащих активации будет большим. Вы должны просто выделить все позиции и провести активацию всех объектов, Рис.7.

badi sap что это

Рис.7

После активации данных в транзакции MIGO появятся закладки полей пользователя, Рис.8.

badi sap что это

Рис.8

Если закладка не появилась или же при выполнении стандартной транзакции, которую вы расширили, вы не попадаете в текст реализации расширения, то убедитесь, что внедрение активировано и оно вызывается. Для этого в транзакции SE19 перейдите на закладку «Расширенные элементы внедрения» и просмотрите статус расширения. Курсор должен стоять на имени BADI-внедрения, а не на реализующем его классе, Рис.9.

badi sap что это

Рис.9

3. Как это все работает?

Система «видит», что существует реализация расширения и «оформлен» наследник класса, поэтому в момент запуска транзакции она создает класс, отвечающий за реализацию. В вашем классе вам доступен метод INIT, который вызывается в конструкторе. Для каждого BADI-расширения возможны различные правила создания реализующего класса, именно поэтому, общая рекомендация при создании BADI, в первый раз, выполнять создание путем копирования из образца, если конечно это возможно. В методе INIT система должна вернуть имя вашей реализации. В данном случае имя реализации предлагается задать константой в рамках вашего класса и далее инкорпорировать эту константу в возвращаемые параметры метода инициализации класса, Рис.10.

badi sap что это

Рис.10

Далее следует собственно реализация метода инициализации класса, Рис.11. В принципе это демонстрация правильного стиля программирования, когда имя класса реализации, по которому система будет в дальнейшем проводить идентификацию вашего класса, определяется через внутреннюю константу в рамках класса.

badi sap что это

Рис.11

Далее при каждом добавлении строки в документ движения материала в транзакции MIGO, система будет вызвать метод LINE_MODIFY – Add / Change a Line (GOITEM), т.е. при каждом добавлении или изменении строки документа вы будете получать уведомление. Как образом предлагается реализовать данный метод? Так как фактически вы создали класс, то все необходимы для работы поля из позиции документа, предлагается хранить во внутренней приватной таблице класса. Структура, описывающая таблицу, создается в словаре данных и затем вы оформляете внутреннюю переменную в рамках класса, Рис.12.

badi sap что это

Рис.12

В коде реализации, вы просто читаете необходимую строку позиции документа из этой таблицы по ключу I_LINE_ID, который обязательно должен быть включен в вашу внутреннюю структуру, так как это уникальный номер строки позиции документа. Если строка найдена, тогда вы модифицируете ее в своей таблице, так как пришли новые изменения, если же строки нет, тогда вы добавляете эту строку в свою внутреннюю таблицу. Таким образом, в рамках класса, реализующего расширение, вы всегда имеете таблицу строк документа. Именно поэтому в метод CHECK_ITEM – Check Item Data of Goods Movement система передает вам только уникальный номер строки, которую следует проверить, так как саму строку вы должны извлечь из внутренней таблицы строк своего класса реализации. Само собой, в этой таблице нужно сохранить не только поля, которые вы добавили на собственный экран, но и поля которые вам будут нужны для проверки введенных данных, Рис.13, поэтому вам не нужно выполнять какие-то телодвижения по сохранению позиций документа через память системы. Вы уже имеете класс, который может хранить все необходимые данные, вплоть до копии всех полей позиции документа, если это вам необходимо.

Примечание: Обратите внимание, что при реализации метода LINE_MODIFY, вы должны учесть также и ситуацию, когда документ уже сохранен в базу данных системы, поэтому транзакция MIGO вызвана в

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

Источник

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

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