Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

User exit for transaction FB60

Former Member
0 Kudos
240

Hi all!

My requirement is that I need to insert data into a custom table when the users create manually fi-document with transaction FB60.

I'm looking for user-exit/badi but I don't find it.

Excuse me for grammal error.

Thanks,

Gianluca

9 REPLIES 9

nablan_umar
Active Contributor
0 Kudos
94

Hi Simeone,

I am not an FI person, but have you tried looking at SMOD and SE18? Also you can debug the program when you click the SAVE button. I did this at my client system and place a break point when statement CALL is executed. (BADI or user exit start with this statement). So far I found these BADIs=>BADI_FDCB*.

Good luck.

Former Member
0 Kudos
94

Hi Simeone!!!

I will send to you a program that look for exit in the program or transaction. You just need to inform the name of program or transaction where do you want to search the exit.

ok?

send me a email and write your address and then i will send to you the program.

Vinicius.

0 Kudos
94

Hi Vinicius,

I am interested to have this program. Can you post it here?

0 Kudos
94

Hi Vinicius!

My email address is "extgisi@tiscali.it"

Thank you very mutch,

Gianluca

0 Kudos
94

*----


*

  • PROGRAMA...: Z_VERIFICA_USER_EXIT

*----


*

  • OBJETIVO...: PESQUISAR USER-EXITS EM UMA DETERMINADA TRANSAÇÃO OU

  • PROGRAMA. *

*----


*

  • PARÂMETROS.: P_PROG = NOME DO PROGRAMA A SER PESQUISADO

  • P_TCODE = NOME DA TRANSAÇÃO A SER PESQUISADA

  • OBS.: UM DOS DOIS PARÂMETROS ACIMA DEVE SER ESPECIFICADO

*

  • P_INCL = DETERMINA SE A PESQUISA DEVE LEVAR EM

  • CONSIDERAÇÃO OS INCLUDES.

  • P_FUNC = DETERMINA SE A PESQUISA DEVE LEVAR EM

  • CONSIDERAÇÃO AS FUNÇÕES.

  • P_SUBMIT= DETERMINA SE A PESQUISA DEVE LEVAR EM

  • CONSIDERAÇÃO DEMAIS PROGRAMAS CHAMADOS POR

  • SUBMIT.

*

  • P_NIVEL = DETERMINA EM ATÉ QUAL NÍVEL A PESQUISA SERÁ

  • FEITA DENTRO DOS INCLUDES, FUNÇÕES E DEMAIS

  • PROGRAMAS. NO NÍVEL 1 SOMENTE SERÃO LEVADOS

  • EM CONSIDERAÇÃO O PROGRAMA RAIZ. NO NÍVEL 2

  • SERÁ FEITA UMA PESQUISA NOS INCLUDES, FUNÇÕES

  • OS QUAIS ESTÃO NOS INCLUDES, FUNÇÕES DO NÍVEL

  • 1 E ASSIM SUCESSIVAMENTE.

*

  • OBS.: NO PARÂMETRO P_NIVEL INFORMAR VALORES BAIXO, POIS

  • QUANTO MAIOR O NÚMERO, MAIOR A QUANTIDADE DE CÓDIGO

  • A SER ANALIZADA

*----


*

*

======================================================================

REPORT z_verifica_user_exit LINE-SIZE 140 NO STANDARD PAGE HEADING.

*----


*

  • CONSTANTS

*----


*

CONSTANTS: c_user_exit(22) TYPE c VALUE 'CALL CUSTOMER-FUNCTION',

c_funcao_1(13) TYPE c VALUE 'CALLFUNCTION''',

c_funcao_2(13) TYPE c VALUE 'CALL FUNCTION',

c_include(07) TYPE c VALUE 'INCLUDE',

c_submit(06) TYPE c VALUE 'SUBMIT',

c_comentario TYPE c VALUE '*',

c_ponto TYPE c VALUE '.',

c_aspa TYPE c VALUE '''',

c_x TYPE c VALUE 'X'.

*----


*

  • TABELAS INTERNAS

*----


*

DATA: BEGIN OF ti_programa OCCURS 0,

codigo_fonte LIKE rssource-line,

END OF ti_programa.

DATA: BEGIN OF ti_includes OCCURS 0,

nome LIKE sy-repid,

nivel(2) TYPE n,

END OF ti_includes.

DATA: BEGIN OF ti_user_exit OCCURS 0,

programa LIKE sy-repid,

linha(10) TYPE n,

codigo_fonte LIKE rssource-line,

nivel(2) TYPE n,

END OF ti_user_exit.

*----


*

  • VARIÁVEIS GLOBAIS

*----


*

DATA: vg_caracter TYPE c,

vg_palavra(50) TYPE c,

vg_inicial LIKE sy-index,

vg_conta_aspa TYPE n,

vg_pname LIKE tfdir-pname,

vg_texto(50) TYPE c,

vg_contador LIKE sy-tfill,

vg_nivel(2) TYPE n,

vg_ini_contagem TYPE c, " INDICA QUE DEVE SER INICIADA A CONTAGEM

vg_conta_espaco TYPE n. " TOTAL DE ESPAÇOS ( MÁXIMO 2 )

*----


*

  • PARAMETERS

*----


*

*- DADOS OBRIGATÓRIOS.

SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE text-001 .

PARAMETERS: p_prog LIKE sy-repid,

p_tcode LIKE sy-tcode.

SELECTION-SCREEN END OF BLOCK bl01.

*- DADOS OPCIONAIS.

SELECTION-SCREEN BEGIN OF BLOCK bl02 WITH FRAME TITLE text-002.

PARAMETERS: p_incl TYPE c AS CHECKBOX,

p_func TYPE c AS CHECKBOX,

p_submit TYPE c AS CHECKBOX,

p_nivel(2) TYPE n.

SELECTION-SCREEN END OF BLOCK bl02.

*----


*

  • INÍCIO

*----


*

START-OF-SELECTION.

*- CONSISTÊNCIAS DOS PARÂMETROS.

PERFORM consisti_parametros.

*- INICIALIZA TABELA.

PERFORM inicializa_tabela.

*- VERIFICA SE NO PROGRAMA EXISTE ALGUM INCLUDE,FUNÇÃO OU SUBMIT.

PERFORM verifica_include_funcao_submit.

*- ANALISA OS INCLUDES E PROCURA POR USER EXIT.

PERFORM procura_user_exit.

*- EXIBE TODAS USER EXIT ENCONTRADAS.

PERFORM exibe_user_exit.

*----


*

  • FIM

*----


*

END-OF-SELECTION.

*&----


*

*& Form PROCURA_USER_EXIT

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM procura_user_exit.

*- VERIFICA SE NOS INCLUDES SELECIONADOS EXISTEM USER EXITS.

LOOP AT ti_includes.

*- ESVAZIA TABELA INTERNA.

REFRESH ti_programa.

*- REALIZA LEITURA DO INCLUDE ARMAZENANDO-O EM TABELA INTERNA

READ REPORT ti_includes-nome INTO ti_programa.

LOOP AT ti_programa.

*- VERIFICA SE NA LINHA DO PROGRAMA EXISTE ALGUM INCLUDE.

SEARCH ti_programa-codigo_fonte FOR c_user_exit.

*- SE ENCONTROU INCLUDE E SE A LINHA NÃO ESTÁ COMENTADA...

IF sy-subrc EQ 0

AND ti_programa-codigo_fonte+0(1) NE c_comentario.

CLEAR ti_user_exit.

*- REMOVE ESPAÇOS NO INÍCIO DA STRING.

SHIFT ti_programa-codigo_fonte LEFT DELETING LEADING space.

MOVE: ti_includes-nome TO ti_user_exit-programa,

sy-tabix TO ti_user_exit-linha,

ti_programa-codigo_fonte TO ti_user_exit-codigo_fonte,

ti_includes-nivel TO ti_user_exit-nivel.

APPEND ti_user_exit.

ENDIF.

ENDLOOP.

ENDLOOP.

ENDFORM. " PROCURA_USER_EXIT

*&----


*

*& Form EXIBE_USER_EXIT

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM exibe_user_exit.

PERFORM cabecalho.

PERFORM user_exit_nao_encontrada.

PERFORM lista_user_exit_encontrada.

PERFORM rodape.

ENDFORM. " EXIBE_USER_EXIT

*&----


*

*& Form PROCURA_INCLUDE

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM procura_include.

CLEAR vg_palavra.

*- VERIFICA SE NA LINHA DO PROGRAMA EXISTE ALGUM INCLUDE.

SEARCH ti_programa-codigo_fonte FOR c_include.

*- SE ENCONTROU INCLUDE E SE A LINHA NÃO ESTÁ COMENTADA...

IF sy-subrc EQ 0

AND ti_programa-codigo_fonte+0(1) NE c_comentario.

*- VERIFICA TODOS OS 72 CARACTERES DA LINHA PARA MONTAR NOME DO INCLUDE

DO 72 TIMES.

vg_inicial = sy-index - 1.

MOVE ti_programa-codigo_fonte+vg_inicial(1) TO vg_caracter.

IF NOT vg_caracter IS INITIAL.

*- VERIFICA SE NÃO É FIM DO COMANDO.

IF vg_caracter EQ c_ponto.

EXIT.

ENDIF.

*- MONTA PALAVRA.

CONCATENATE vg_palavra vg_caracter INTO vg_palavra.

*- CONVERTE PARA MAÍUSCULA PARA FUTURA COMPARAÇÃO.

TRANSLATE vg_palavra TO UPPER CASE.

*- SE ENCONTROU ALGUM INCLUDE

IF vg_palavra EQ c_include.

CLEAR vg_palavra.

ENDIF.

ENDIF.

ENDDO.

*- SALVA NOME DO INCLUDE PARA FUTURA PESQUISA POR USER EXIT.

READ TABLE ti_includes WITH KEY nome = vg_palavra.

IF NOT sy-subrc IS INITIAL.

IF vg_nivel LE p_nivel.

MOVE: vg_palavra TO ti_includes-nome,

vg_nivel TO ti_includes-nivel.

APPEND ti_includes.

ENDIF.

ENDIF.

ENDIF.

ENDFORM. " PROCURA_INCLUDE

*&----


*

*& Form PROCURA_FUNCAO

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM procura_funcao.

CLEAR: vg_conta_aspa,

vg_palavra.

*- VERIFICA SE NA LINHA DO PROGRAMA EXISTE ALGUM INCLUDE.

SEARCH ti_programa-codigo_fonte FOR c_funcao_2.

*- SE ENCONTROU INCLUDE E SE A LINHA NÃO ESTÁ COMENTADA...

IF sy-subrc EQ 0

AND ti_programa-codigo_fonte+0(1) NE c_comentario.

*- VERIFICA TODOS OS 72 CARACTERES DA LINHA PARA MONTAR NOME DO INCLUDE

DO 72 TIMES.

vg_inicial = sy-index - 1.

MOVE ti_programa-codigo_fonte+vg_inicial(1) TO vg_caracter.

IF NOT vg_caracter IS INITIAL.

*- VERIFICA SE NÃO É FIM DO COMANDO.

IF vg_caracter EQ c_aspa.

ADD 1 TO vg_conta_aspa.

IF vg_conta_aspa EQ 2.

EXIT.

ENDIF.

ENDIF.

*- MONTA PALAVRA.

CONCATENATE vg_palavra vg_caracter INTO vg_palavra.

*- CONVERTE PARA MAÍUSCULA PARA FUTURA COMPARAÇÃO.

TRANSLATE vg_palavra TO UPPER CASE.

*- SE ENCONTROU ALGUM INCLUDE

IF vg_palavra EQ c_funcao_1.

CLEAR vg_palavra.

ENDIF.

ENDIF.

ENDDO.

*- PESQUISA NOME DA FUNÇÃO PARA FUTURA PESQUISA POR USER EXIT.

CLEAR vg_pname.

SELECT SINGLE pname

INTO vg_pname

FROM tfdir

WHERE funcname EQ vg_palavra.

IF sy-subrc EQ 0.

READ TABLE ti_includes WITH KEY nome = vg_pname.

IF NOT sy-subrc IS INITIAL.

IF vg_nivel LE p_nivel.

MOVE: vg_pname TO ti_includes-nome,

vg_nivel TO ti_includes-nivel.

APPEND ti_includes.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDFORM. " PROCURA_FUNCAO

*&----


*

*& Form VERIFICA_INCLUDE_FUNCAO_SUBMIT

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM verifica_include_funcao_submit.

LOOP AT ti_includes.

ADD 1 TO vg_contador.

DESCRIBE TABLE ti_includes.

PERFORM evitar_time_out USING sy-tfill.

MOVE ti_includes-nivel TO vg_nivel.

ADD 1 TO vg_nivel.

*- ESVAZIA TABELA INTERNA.

REFRESH ti_programa.

*- REALIZA LEITURA DO INCLUDE/FUNÇÃO ARMAZENANDO EM TABELA INTERNA

READ REPORT ti_includes-nome INTO ti_programa.

LOOP AT ti_programa.

*- PROCURA POR INCLUDES.

IF p_incl EQ c_x.

PERFORM procura_include.

ENDIF.

*- PROCURA POR FUNÇÃO.

IF p_func EQ c_x.

PERFORM procura_funcao.

ENDIF.

*- PROCURA POR SUBMIT.

IF p_submit EQ c_x.

PERFORM procura_submit.

ENDIF.

ENDLOOP.

ENDLOOP.

ENDFORM. " VERIFICA_INCLUDE_FUNCAO_SUBMIT

*&----


*

*& Form EVITAR_TIME_OUT

*&----


*

  • text

*----


*

  • -->P_SY_TFILL text

  • -->P_SY_SUBRC text

*----


*

FORM evitar_time_out USING p_sy_tfill.

DATA: vl_total(10) TYPE n,

vl_atual(10) TYPE n.

MOVE: p_sy_tfill TO vl_total,

vg_contador TO vl_atual.

CONCATENATE 'Total:' vl_total '-' 'Atual:' vl_atual

INTO vg_texto

SEPARATED BY space.

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'

EXPORTING

text = vg_texto.

ENDFORM. " EVITAR_TIME_OUT

*&----


*

*& Form PROCURA_SUBMIT

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM procura_submit.

CLEAR: vg_conta_espaco, vg_palavra, vg_ini_contagem.

*- VERIFICA SE NA LINHA DO PROGRAMA EXISTE ALGUM INCLUDE.

SEARCH ti_programa-codigo_fonte FOR c_submit.

*- SE ENCONTROU INCLUDE E SE A LINHA NÃO ESTÁ COMENTADA...

IF sy-subrc EQ 0

AND ti_programa-codigo_fonte+0(1) NE c_comentario.

*- VERIFICA TODOS OS 72 CARACTERES DA LINHA PARA MONTAR NOME DO INCLUDE

DO 72 TIMES.

vg_inicial = sy-index - 1.

MOVE ti_programa-codigo_fonte+vg_inicial(1) TO vg_caracter.

IF vg_ini_contagem EQ c_x AND vg_caracter IS INITIAL.

ADD 1 TO vg_conta_espaco.

ENDIF.

IF NOT vg_caracter IS INITIAL.

MOVE c_x TO vg_ini_contagem.

IF vg_caracter EQ c_ponto.

EXIT.

ENDIF.

*- MONTA PALAVRA.

IF vg_conta_espaco LT 2.

CONCATENATE vg_palavra vg_caracter INTO vg_palavra.

*- CONVERTE PARA MAÍUSCULA PARA FUTURA COMPARAÇÃO.

TRANSLATE vg_palavra TO UPPER CASE.

*- SE ENCONTROU ALGUM INCLUDE

IF vg_palavra EQ c_submit.

CLEAR vg_palavra.

ENDIF.

ELSE.

EXIT.

ENDIF.

ENDIF.

ENDDO.

*- PESQUISA NOME DA FUNÇÃO PARA FUTURA PESQUISA POR USER EXIT.

READ TABLE ti_includes WITH KEY nome = vg_palavra.

IF NOT sy-subrc IS INITIAL.

IF vg_nivel LE p_nivel.

MOVE: vg_palavra TO ti_includes-nome,

vg_nivel TO ti_includes-nivel.

APPEND ti_includes.

ENDIF.

ENDIF.

ENDIF.

ENDFORM. " PROCURA_SUBMIT

*&----


*

*& Form CONSISTI_PARAMETROS

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM consisti_parametros.

IF p_nivel IS INITIAL.

MOVE 1 TO p_nivel.

ENDIF.

IF p_prog IS INITIAL AND p_tcode IS INITIAL.

*- NOME DO PROGRAMA E NOME DA TRANSAÇÃO NÃO PODEM SER NULOS. UM DELES

*- DEVE SER INFORMADO.

MESSAGE ID 'ZF' TYPE 'I' NUMBER '000' WITH text-003.

STOP.

ENDIF.

IF NOT p_prog IS INITIAL AND NOT p_tcode IS INITIAL.

*- SOLICITA AO USUÁRIO PARA INFORMAR O NOME DO PROGRAMA OU DA TRANSAÇÃO.

MESSAGE ID 'ZF' TYPE 'I' NUMBER '000' WITH text-004.

STOP.

ENDIF.

ENDFORM. " CONSISTI_PARAMETROS

*&----


*

*& Form INICIALIZA_TABELA

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM inicializa_tabela.

DATA vl_pgmna LIKE tstc-pgmna.

REFRESH ti_includes.

IF NOT p_prog IS INITIAL.

MOVE: p_prog TO ti_includes-nome,

'0' TO ti_includes-nivel.

APPEND ti_includes.

ELSEIF NOT p_tcode IS INITIAL.

SELECT SINGLE pgmna

FROM tstc

INTO vl_pgmna

WHERE tcode EQ p_tcode.

IF sy-subrc EQ 0.

MOVE: vl_pgmna TO ti_includes-nome,

'0' TO ti_includes-nivel.

APPEND ti_includes.

ENDIF.

ENDIF.

ENDFORM. " INICIALIZA_TABELA

*&----


*

*& Form CABECALHO

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM cabecalho.

DATA vl_complemento(50) TYPE c.

IF p_tcode IS INITIAL.

CONCATENATE 'NO PROGRAMA' p_prog

INTO vl_complemento

SEPARATED BY space.

ELSE.

CONCATENATE 'NA TRANSAÇAO' p_tcode

INTO vl_complemento

SEPARATED BY space.

ENDIF.

FORMAT COLOR COL_KEY.

WRITE: /001 sy-uline,

/001 sy-vline,

040 'RELAÇÃO DAS USER-EXITS ENCONTRADAS', vl_complemento,

140 sy-vline,

/001 sy-uline.

WRITE: /001 sy-vline,

003 'NOME DO PROGRAMA',

044 sy-vline,

046 'NÍVEL',

052 sy-vline,

054 'LINHA',

065 sy-vline,

067 'TEXTO',

140 sy-vline,

/001 sy-uline.

ENDFORM. " CABECALHO

*&----


*

*& Form USER_EXIT_NAO_ENCONTRADA

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM user_exit_nao_encontrada.

DESCRIBE TABLE ti_user_exit.

CHECK sy-tfill IS INITIAL.

FORMAT COLOR COL_NORMAL INTENSIFIED ON.

WRITE: /003 'NENHUMA USER-EXIT FOI LOCALIZADA!',

139 ' '.

FORMAT RESET.

ENDFORM. " USER_EXIT_NAO_ENCONTRADA

*&----


*

*& Form LISTA_USER_EXIT_ENCONTRADA

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM lista_user_exit_encontrada.

DATA vl_cor TYPE c.

LOOP AT ti_user_exit.

IF vl_cor EQ c_x.

CLEAR vl_cor.

ELSE.

MOVE c_x TO vl_cor.

ENDIF.

*- AJUSTA COR NA TELA.

IF vl_cor EQ c_x.

FORMAT COLOR COL_NORMAL INTENSIFIED ON.

ELSE.

FORMAT COLOR COL_NORMAL INTENSIFIED OFF.

ENDIF.

*- INÍCIO DA IMPRESSÃO.

WRITE: /003 ti_user_exit-programa,

046 ti_user_exit-nivel,

054 ti_user_exit-linha,

067 ti_user_exit-codigo_fonte,

139 ' '.

ENDLOOP.

ENDFORM. " LISTA_USER_EXIT_ENCONTRADA

*&----


*

*& Form RODAPE

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM rodape.

DESCRIBE TABLE ti_includes.

FORMAT COLOR COL_TOTAL.

WRITE: /001 sy-uline,

/001 sy-vline,

003 'TOTAL DE PROGRAMAS ANALIZADOS:', sy-tfill,

' - NÍVEL:', p_nivel,

140 sy-vline,

/001 sy-uline.

ENDFORM. " RODAPE

0 Kudos
94

Hi

I have tried the code posted by vinicius braga, but I can't get any result :o(

If I insert tcode FB60 and execute the program with or without x in the selection screen, I don't get any user-exits in my output.

Do I anything wrong?

Br

0 Kudos
94

Lars,

I have tried this program and it works. You have to click on all checkboxes, then enter level with higher number let say 5 to get the search depth deeper. This program will search SUBMIT, FUNCTION, or INCLUDE (depending your checkboxes) with the level depth you specified.

Former Member
0 Kudos
94

List of Userexits for FB60

F050S001 FIDCMT, FIDCC1, FIDCC2: Edit user-defined IDoc segment

F050S002 FIDCC1: Change IDoc/do not send

F050S003 FIDCC2: Change IDoc/do not send

F050S004 FIDCMT, FIDCC1, FIDCC2: Change outbound IDoc/do not send

F050S005 FIDCMT, FIDCC1, FIDCC2 Inbound IDoc: Change FI document

F050S006 FI Outgoing IDoc: Reset Clearing in FI Document

F050S007 FIDCCH Outbound: Influence on IDoc for Document Change

F180A001 Balance Sheet Adjustment

FARC0002 Additional Checks for Archiving MM Vendor Master Data

RFAVIS01 Customer Exit for Changing Payment Advice Segment Text

RFEPOS00 Line item display: Checking of selection conditions

RFKORIEX Automatic Correspondence

SAPLF051 Workflow for FI (Pre-Capture, Release for Payment)

FEDI0001 Function exits for EDI in FI

Hope this helps !!!

Rajiv

Former Member
0 Kudos
94

Hi Simeone,

Did you like the answer, but did you forget to give points?

See: </people/mark.finnern/blog/2004/08/10/spread-the-love for directions.

Click on the Yellow Star icon in each reply.

You can give:

1 - 10 pointer (solves problem, marks as answered)

2 - 6 pointers (very helpful)

Lots of 2 pointers (helpful)

This time I did it for you, but if it isn't correct, please modify!

Spread the love, Cheers,

Joan (and Mark Finnern)