Busca userexits en un programa o transacción
*======================================================================*
* PROGRAMADOR: FÁBIO ALESSANDRO COMASSETTO
*----------------------------------------------------------------------*
* PROGRAMA...: Z_VERIFICA_USER_EXIT
*----------------------------------------------------------------------*
* DATA.......: 15/02/2001
*----------------------------------------------------------------------*
* 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 'USEREXIT',
C_ENHANCE(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 AS CHECKBOX,
P_FUNC AS CHECKBOX,
P_SUBMIT 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.
*- ANALISA OS INCLUDES E PROCURA POR USER EXIT.
PERFORM PROCURA_ENHANCEMENTS.
*- 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 PROCURA_ENHANCEMENTS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM PROCURA_ENHANCEMENTS.
*- 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_ENHANCE.
*- 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_ENHANCEMENTS
*&---------------------------------------------------------------------*
*& 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
|