Как найти badi sap

Вот прога, с помощью которой это (найти 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.

PARAMETERS : P_TCODE LIKE TSTC-TCODE,
             P_PGMNA LIKE TSTC-PGMNA .

START-OF-SELECTION.

  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.

    FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
    WRITE:/(19) ‘Transaction Code – ‘,
    20(20) P_TCODE,
    45(50) TSTCT-TTEXT.
    SKIP.
    IF NOT JTAB[] IS INITIAL.
      WRITE:/(105) SY-ULINE.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.

* Sorting the internal Table
      sort jtab by OBJECT.
      data : wf_txt(60) type c,
      wf_smod type i ,
      wf_badi type i ,
      wf_object2(30) type C.
      clear : wf_smod, wf_badi , wf_object2.
* Get the total SMOD.

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

          WRITE:/1 SY-VLINE,
          2 ‘Enhancement/ Business Add-in’,
          41 SY-VLINE ,
          42 ‘Description’,
          105 SY-VLINE.
          WRITE:/(105) SY-ULINE.
        endat.
        clear wf_txt.
        at new object.
          if wa_tadir-object = ‘SMOD’.
            wf_object2 = ‘Enhancement’ .
          elseif wa_tadir-object = ‘SXSD’.
            wf_object2 = ‘ Business Add-in’.

          endif.
          FORMAT COLOR COL_GROUP INTENSIFIED ON.

          WRITE:/1 SY-VLINE,

          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.

          when ‘SXSD’.
* For BADis
            wf_badi = wf_badi + 1 .
            select single TEXT into wf_txt
            from SXS_ATTRT
            where sprsl = sy-langu
            and EXIT_NAME = wa_tadir-OBJ_NAME.
            FORMAT COLOR COL_NORMAL INTENSIFIED ON.

        endcase.

        WRITE:/1 SY-VLINE,
        2 wa_tadir-OBJ_NAME hotspot on,
        41 SY-VLINE ,
        42 wf_txt,
        105 SY-VLINE.
        AT END OF object.
          write : /(105) sy-ULINE.
        ENDAT.

      ENDLOOP.

      WRITE:/(105) SY-ULINE.

      SKIP.
      FORMAT COLOR COL_TOTAL INTENSIFIED ON.
      WRITE:/ ‘No.of Exits:’ , wf_smod.
      WRITE:/ ‘No.of BADis:’ , wf_badi.

    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.

AT LINE-SELECTION.

  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.

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

Транзакция  se18.

Рис 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 для инфо-типов организационного менеджмента.

Badi – Business Add-ins.

Method used for enhancement for  standard SAP code. It is advisable not to change existing SAP code which is known as Modification. SAP provides an alternative to this modification which is known as Enhancement. Herein SAP provides points where the user may add his code to be reflected while a standard transaction is run.

Badi uses the concept of object oriented programming. In most of the standard transactions, SAP has provided  hooks to add own code via methods of classes.

How to search a Badi ?

1.       Goto and enter CL_EXITHANDLER and click on display.

2.       Double click on the method _INSTANCE. Set breakpoint on CL_=>GET_CLASS_NAME_ON_INTERFACE. This works for the classic BAdI. In case you want to find the positions where methods of the new BAdI are called, just set a breakpoint on CALL BADI in the program or class where you search for BAdI calls.

3.       Run the transaction for which you want to search the Badi’s.

4.       Now whenever the method is called, the program goes into debugging mode. Check the value of exit_name (changing parameter),this would give the name of the Badi’s.

5.       Run the entire transaction and note down all the Badi’s. 

Some other ways to find out BADI,

Buffer trace (ST05) as BADI database tables are buffered. Run transaction and observe the BADI found.

SPRO (SAP IMG Reference)

SE84 (Repository Information System) BADI definitions   Package (Development Class) BADI definition name

Implementing the Badi.

1.        Go to to check the definition of the Badi and

2.       to implement the Badi.

3.       Enter the name of the Badi in the create implementation section (if you are creating a new implementation – Radiobutton Classic Badi) and click on createImplementaion.

4.       Enter the name of the implementation.

5.       Double click on the method name and add the code for the implementation. 

Following is a Practical scenario.

Use of transaction PA40 to terminate an employee. The requirement is  that when we reach the screen where the personnel sub area and position have to be filled they should be auto populated with the respective values. Personnel sub area should be the same as it was when the employee was first hired and the position should be defaulted to 99999999.

Upon using the above procedure to find the Badi to be used, it was found that the Badi which will be used for this purpose would be “HRPAD00INFTY“. The method to be used is BEFORE_.

Upon further investigation it is found that the method is being called twice in the same transaction, so we will have to restrict the Badi to run only on the screen required else it will throw a dump. The screen number on which we need the Badi to be executed is  2010. Upon check the parameters of the method the available structures are all importing so no value can be assigned to change the value of the screen field at runtime. This makes us to use field symbols as the alternative.

The table PA0001 is where the personnel sub area for the hired employee is stored, so we will have to select the sub area from this table for the record who needs to be terminated. Issuing a select statement to find the personnel sub area for and employee id (field PERNR) on table PA0001 would be

select single btrtl into sub_area where pernr = innnn-pernr.

Here btrtl is the sub area, sub_area is a user defined variable to store the value of the retrieved data and pernr is the personnel number of the employee to be terminated. INNNN is a structure which has the field pernr. This structure is defined as importing in three parameters so it can be accessed directly.

We know that the value of the subarea and position cannot be assigned as they are not part of the exporting parameters in the defined Badi, so we will have to define two field symbols, which  will be used to change the value at runtime. Field symbols are similar to pointers in C. They store the address of the variable it is assigned to and when any change is made to the field symbol the value of the variable it is referencing is changed. Here we will have to know the program name, structure and field name on which the changes need to be reflected. We find that the program name (via system->status) and the structure and field name via pressing F1 and clicking on technical information. We found the following for the subarea and position. For subarea

Screen –

Structure – P0001

Field – BTRTL

For Position

Screen – MP000100

Structure – P0001

Field – PLANS

To access these fields in your program the format used is

Assign  (‘(screen name) structure name-fieldname’) to field symbol.    
So the following code would solve the purpose

data : sub_area type pa0001-btrtl.
field-.
select single btrtl from pa0001 into sub_area where pernr = innnn-pernr.
assign (‘() to <fs1>.
<fs1> = ‘999999’.
endif.

Самый быстрый способ поиска BADI в SAP

Технология Business Add-Ins основана на расширении ABAP объектов. Они могут использоваться для удовлетворения нужд пользователей, в случае если стандартная поставка системы не позволяет реализовать какой-либо функционал. Все коды програм на ABAP, экраны, GUI, таблицы и интерфейсы, созданы таким образом, что позволяют пользователям включать свои собсвтенные расширения в стандарт.
Каждая Business Add-Ins содержит все необходимые интерфейсы для реализации конкретной задачи.
· BADI могут использоваться несколько раз, в отличии от технологии USER-EXIT, которые вызываются только один раз
· BADI основаны на технологии объектно-ориентированного программирования -> SAP гарантирует последующую совместимость всех интерфейсов BADI
Итак, как же искать BADI в системе:
1. Запустите транзакцию SE37 и установите точку остановки (breakpoint) в функции SXV_GET_CLIF_BY_NAME
2. Установите точку остановки только длля вызываемых функций
3. В другом окне SAP запустите вашу транзакцию. Режим debug откроется с перечнем BADI. NAME = BADI, Clif = внедрение BADI

FUNCTION sxv_get_clif_by_name .
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(NAME)
*" VALUE(PREFIX) TYPE SEEX_CLIF_PREFIX
*" EXPORTING
*" VALUE(CLIF) TYPE SEOCLSNAME
*"----------------------------------------------------------------------
 
CALL FUNCTION 'SXV_ADD_PREFIX'
  EXPORTING
    name = name
    prefix = prefix
  IMPORTING
    new_name = clif.
ENDFUNCTION.

Популярные сообщения из этого блога

В предыдущей статье я рассказал, как подключить свой JavaScript файл к блогу BLOGSPOT . Но для того, что бы их подключить нужны прямые ссылки на файл, а Google диск при предоставлении общего доступа к файлу выдает ссылку на предварительный просмотр, которая никак напрямую не ссылается на файл. Для Google диска прямая ссылка на файл – это ссылка на скачивание. Ниже описаны два способа создания ссылки на скачивание на примере файла prism.js.

Как и всегда, в пылу проекта внезапно родилась Z табличка. Главный нюанс был в том, что она должна была хранить пароли для авторизации на стороннем сервере. Естественно, никто не хотел хранить пароли в открытом виде, а двустороннее шифрование SAP не умеет без сторонних пакетов и надстроек. Далее, все как обычно – придумали алгоритм, сделали табличку. Дело осталось за малым – нужно шифровать пароли, которые вводит пользователь. Делать отдельную программу нет смысла, поскольку ее функционал мало чем будет отличаться от сгенерированного. Вот здесь на помощь приходят события! С их помощью можно, наверное, все. По крайней мере, я не нашел чего-либо, что нельзя сделать с данными через события.

В этой статье хочу постараться подробно описать и привести пример, как можно создать ALV отчет с таблицей на весь экран и с HTML шапкой вверху. Я не буду описывать начальный этап, где пишется селекционный экран или делается выборка данных. Будем считать, что основа у нас есть и нам нужно просто вывести данные. Главной изюминкой является то, что нужно вывести ALV GRID на экран без использования каких-либо дополнительных элементов на экране. Step-By-Step Шаг 1. Создание окна Создаем самое простое окно с номером 100. На него не нужно кидать никаких контейнеров. Оно нам нужно только для модулей PAI и PBO и вывода на него ALV GRID.

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

В данном посте будут описано несколько способов по поиску BADI и User-Exits (UE) для нужного кода транзакции. Поскольку цель документа – объяснить способы поиска, я не буду тратить время на то, чтобы описывать функциональность того или иного метода.

Для того, чтобы объяснить вам я взял для примера транзакцию “MM01 – Создание основной записи материала”. Пожалуйста, выполните следующие шаги, чтобы знать различные способы поиска UE и BADI.

Метод №1

  • Введите в окно ввода транзакций код транзакции для которой вы ищете UE и нажмите на Enter для перехода к экрану ввода.
  • В системном меню перейдите по пути ‘Система‘ -> ‘Статус‘ как показано на рисунке ниже.
Рис. 1
  • После нажатия на кнопку ‘Статус‘ система выдаст новый экран. Дважды щелкните в поле с именем программы.
Рис. 2
  • Как только программа будет открыта, перейдите в системном меню к пункту ‘Перейти к‘ -> ‘Запись каталога объектов‘.
  • Во всплывающем окне скопируйте название пакета, как показано на рисунке ниже.
Рис. 3
  • После получения наименования пакета выполните транзакцию SE80 (вы также можете использовать транзакцию SE84) и кликните мышкой на ‘Инфо-система репозитария’.
  • Как только вы выполните предыдущий пункт система покажет вам список объектов, доступный для выбора. Выберите ‘Расширения’ и затем ‘Прогр. клиента’.
  • Теперь выполните двойной клик по пункту ‘Расширения’, внутри Прогр. клиента’, справа должен отобразиться экран выбора.
  • На экране выбора в поле ‘Пакет’ укажите название пакета, скопированное в одном из предыдущих шагов и далее выполните транзакцию, как показано на скриншоте ниже (Рис. 4).
Рис. 4
  • Как только вы выполните описанные выше действия, на экране справа будут отображены User-Exits для выбранного пакета.
Рис. 5

Для поиска BADI для соответствующей транзакции, следуйте приведенным выше шагам, но вместо ‘Прогр. клиента’ выберите ‘Бизнес-Add Ins’, как показано ниже (Рис. 6).

Рис. 6
  • Как только вы выполните описанные выше действия, на экране справа будет отображены BADI для выбранной вами транзакции/пакета.
Рис. 7

Метод №2.

  • Запустите транзакцию SE93. Введите нужный код транзакции в поле на экране выбора и затем нажмите кнопку ‘Display’, как показано на скриншоте ниже.
Рис. 8
  • На следующем экране, который откроется после выполнения предыдущего пункта, дважды кликните в поле с именем программы (Рис. 9).

Рис. 9
  • После того, как предыдущий шаг выполнен, нажмите на кнопку ‘Перейти к’ -> ‘Запись каталога объекта’.
  • Во всплывающем окне (Рис. 10) скопируйте имя пакета, оно нам потребуется в дальнейшем.
Рис. 10

  • Запустите транзакцию SMOD, переместите курсор в поле ввода имени расширения и нажмите кнопку F4.
  • В вызванном средстве поиска ‘Информационная система репозитария‘ в поле ‘Пакет‘ введите имя ранее скопированного пакета и нажмите кнопку ‘Enter’ (Рис. 11).
Рис. 11

  • После выполнения предыдущего шага на следующем экране вы получите список UE для релевантной транзакции/пакета.
Рис. 12

Метод №3

Наряду со способами описанными выше, можно найти UE и BADI в настройке конфигурации системы/SPRO.
Пример: если вы хотите узнать расширения существующие в разделе “Контроль счетов логистики“, то выполните следующие действия.

  • Выполните транзакцию SPRO и пройдите по следующему пути в настройке ‘Управление материальными потоками’ -> ‘Контроль счетов логистики’ -> ‘Ведение программ клиента и бизнес-Add-Ins’. Нажмите кнопку ‘Документация к IMG-операции’ в строке ‘Ведение программ клиента для контроля счетов’, так вы получите список UE для данной функциональности (Рис. 13).

Рис. 13

  • Для того, чтобы получить список BADI для выбранной функциональности, нажмите кнопку ‘Документация к IMG-операции’ в строке ‘Ведение бизнес-Add-Ins для контроля счетов’ (Рис. 14).

Рис. 14

Метод №4

Если вы затрудняетесь найти точный узел настройки, выполните следующие действия:

  • Зайдите в систему под английским языком.
  • Выполните транзакцию SPRO -> ‘SAP Reference IMG‘. Нажмите кнопку ‘Find…‘ на панели инструментов или нажмите сочетание клавиш Ctrl + F.
  • После того, как вы нажмете на кнопку поиска, появится окно ‘Search in the structure‘. Введите CUSTOMER EXITS в поле ‘Search Term‘ и нажмите кнопку Enter.

Рис. 15

  • После выполнения программа выдаст вам список всех результатов для поискового запроса, который вы ввели. Список, скорее всего, будет очень большим. Для более информативного поиска воспользуйтесь столбцом ‘In area’ (Рис. 16). 
Рис. 16

  • Как только найдете нужную строку с настройкой, дважды щелкните по ней и система перенаправит вас к нужному узлу конфигурации.

Рис. 17

  • Теперь вы можете нажать IMG Activity document для строки Maintain Customer Exits for Invoice Verification для того, чтобы посмотреть все соответствующие UE.

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

Ссылка на оригинал: Methods to find Customer/User Exit’s & BADi’s for a Transaction Code!

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