January 23, 2020
Não, isso não é uma user-exit...

BADI’s, User-exits, Enhancements… como encontrá-los?

Faaaala Zumbizada! Estou de volta no modo “zombie = ON” por causa do projeto, testes integrados que estão acabando com a minha vida (e que nunca acabam!) 🙁
Bom, mas chega de mimimi e vamos lá!!! Neste post vou falar sobre alguns métodos para encontrar Enhancements, User-exits, BADI’s e etc. Aposto que isso pode ajudar muito, principalmente para os zumbis mais novinhos. 🙂

Não, isso não é uma user-exit…

 

CALL CUSTOMER FUNCTION

Você pode colocar um BREAK-POINT nesse comando, que é usado para chamar as User-exits . Já falamos dele aqui no blog e se quiser saber mais, clique aqui.

 

BADI’S

Método 1: V_EXT_ACT e V_EXT_IMP

A BADI faz uma seleção nas tabelas de visões V_EXT_ACT e V_EXT_IMP. Então podemos ir na transação ST05 -> Selecionar “SQL Trace” e “Table Buffer Trace” -> Activate Trace -> Executar a transação -> Deactivate Trace -> Display Trace.

Irá aparecer a tela abaixo:

 

Vamos selecionar os seguintes objetos:

 

No resultado final irá mostrar todas as BADI’s na ordem em que elas foram executadas:

 

Método 2: CL_EXITHANDLER=>GET_CLASS_NAME_BY_INTERFACE

Na transação SE24, vamos selecionar a classe CL_EXITHANDLER, ir para o método GET_INSTANCE e colocar um BREAK-POINT.

Através do parâmetro de exportação EXIT_NAME é possível saber o nome da BADI que será chamada.

 

Método 3: FM SXV_GET_CLIF_BY_NAME.

Um outro método é colocando um BREAK-POINT na função SXV_GET_CLIF_BY_NAME, que é chamada toda vez que alguma BADI é executada.

O parâmetro de exportação NAME irá mostrar o nome da BADI.

 

E aí, achou difícil, chato, deprimente? Não se assuste, vou mostrar algumas ferramentas que podem facilitar a sua vida! 🙂

Há algum tempo atrás precisei encontrar uma user-exit de uma transação X, e no meio de um fórum no SCN encontrei um programa bastante útil! Ele lista todas as user-exits e BADI’s de uma transação ou programa.

 

Abaixo está o código-fonte. Não sei quem é o autor e não será coincidência encontrar esse mesmo programa em outros fóruns (é bem manjado).

REPORT z_enhancement_finder NO STANDARD PAGE HEADING LINE-SIZE 201.

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.

PARAMETERS : p_tcode LIKE tstc-tcode,
p_pgmna LIKE tstc-pgmna .

DATA wa_tadir TYPE tadir.

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.

 

Encontrei também esse outro relatório abaixo. O código-fonte está aqui. Basicamente, tem a mesma funcionalidade, mas eu particularmente prefiro o anterior.

 

Outras ferramentas

SNIF

E você pode estar se perguntando: “não existe nenhum relatório standard?”. Sim, existe! A SAP disponibiliza o SNIF (esse é o nome do programa, não da transação) que lista todos os Costumer Enhancements ativos:

 

 

ABAP X-RAY EYE

Pesquisando um pouco mais encontrei um “SNIF melhorado”, que inclui algumas opções, como por exemplo, exits para Validação e Substituição, fórmulas (VOFM), Screen-exits e Field-exits. Esse projeto está disponível neste link: http://code.google.com/p/abapexitrayeye/ e para implementá-lo você precisará usar o SAP Link.

 

 

Links Úteis:

WIKI: Enhancements and Modifications – BADI, Enhancement Framework, User Exits, BTE

WIKI: Ways to find a userexit

Daiane Medeiros

Abapeira desde 2008, curte som underground, arte urbana, bobeiras geek, luta krav maga, fala gírias idosas e jura que é uma pessoa normal.

View all posts by Daiane Medeiros →

10 thoughts on “BADI’s, User-exits, Enhancements… como encontrá-los?

  1. Só um pitaco para achar BADIs, standards…
    Por “padrão” as Classes Standard da SAP para BADIs tem a nomenclatura “CL_EX_xxxxxxxx”. Desta forma, acessando a transação SE24 e buscar por “CL_EX_*”, no campo nome da classe. Vai listar quase todas as BADIs… e caso você não consiga chegar na BADI em si pela SE24. Use o complemento do nome da classe na SE18 ou SE19, exemplo:

    classe: CL_EX_AC_DOCUMENT => BADI: AC_DOCUMENT

    []s

  2. Animal o post Daiane, eu não manjava desses relatórios não… eu sou meio old-school, sempre tento acha exits c/ os break-points em funções e etcs! haha. Mas talvez eu tenha que mudar um pouco, esses relatórios que você postou me parecem muito úteis!

    Viva o Open Source, e valeu pelo post!

  3. Fala galera!
    Esse post ficou muito loko Daiane!

    Eu tbm não manjava esses relatórios não. Curto muito aprender essas paradas, obrigado pelas dicas.

    Estava em conversa com a nossa amiga do coração, Priscila Silva. Falávamos justamente sobre como encontrar BAdIs no sistema e eu escrevi um e-mail para ela detalhando dois métodos. Mas não postarei o e-mail aqui, pois, além de ser uma informação redundante, eu escrevi em inglês (só de brincaiderinha..rs) e utilizei muitas gírias do Bronx … algumas pessoas podem achar meio nocivo (mas a Pri riu pra caramba .. rs).

    Abraços.

    1. SERIOUSLY, ARE YOU KIDDING ME ?!? PUT THAT MOTHERFUCKING BREAK POINT IN THE MOTHERFUCKING CALL-CUSTOMER FUNCTION INSTRUCTION OR I’LL SHOOT YOU IN YOUR GODDAMN FACE!

      (foi also assim? heoauheoahe)

  4. Meu método favorito é buscando no SDN! :p

    Outra forma tambem é usando a boa e velha SE84 -> Enhancements -> Business Add-ins -> Definitions -> e ai busco pelo pacote da transação (ME, por exemplo). O mesmo serve pra customer-exits 🙂

  5. Aii que orgulho, DAIII!

    Nunca tinha lido um post da sua autoria, mujer! Congrats!
    Adorei 🙂

    E me ajudou muito a relembrar… Ai ai, dá uma saudade e um aperto no meu coração ver código ABAP.. Mais do que eu sinto saudade da minha familia. E eu gostaria de estar brincando hahahaha 😛

  6. Bom dia, Daiane!

    Parabéns pela iníciativa, seu site é demais, e uma ótima ferramenta.

    Gostaria de saber se você poderia me indicar dois ABAPs, eu preciso de Trainee/Jr para região do Morumbi e Pleno para região da Av. Paulista. Meu email é [email protected]

    Muito Obrigado!

  7. Vlw Daiane, vou trabalhar com BADI’s pela primeira vez hoje, e não tenho nenhuma ideia de qual BADI devo usar para transferência de material, como descubro uma BADI que servirá para mim, sem saber onde ela já foi usada ? oh god!

Leave a Reply

Your email address will not be published. Required fields are marked *