segunda-feira, 16 de abril de 2012

Função - REUSE_ALV_FIELDCATALOG_MERGE

  "  Eae, pessoal eu não sei como ainda não tinha passado isso no Blog
" portanto pra tira o atraso, hoje vou mostrar uma função que é muito
" útil na criação de ALV, a famosa transação reuse_alv_fieldcatalog_merge
" que serve pra retornar todas as informações de todos os campos de uma
" tabela, e muito usado para criação de ALV dinâmico, ( que o usuário
" decide qual tabela ele quer ver ), puxando por este exemplo, eu fiz um
" programinha abaixo, onde o usuário informa a tabela e o programa retorna
" os campos desta tabela e suas características, semana que vem estarei
" fazendo um ALV um pouco mais complexo e utilizarei esta função, portanto
" debbugem.

REPORT z_reuse_alv_fieldcatalog_merge.

" Grupo de tipos
TYPE-POOLS : slis.
" Estrutura e tabela interna
DATA :
  it_fieldcat TYPE TABLE OF slis_fieldcat_alv,
  st_fieldcat TYPE slis_fieldcat_alv.

" Tela de seleção
SELECTION-SCREEN BEGIN OF block b1 WITH FRAME.
  PARAMETERS:
    p_tabela TYPE dd02l-tabname OBLIGATORY. " Tabela
SELECTION-SCREEN end of BLOCK   b1.

" Início do processo
START-OF-SELECTION.
" Execução da função que traz todos as informações do campos da tabela informada
  PERFORM : f_verifica_campos,
" Mostra a posição e o nome dos campos da tabela informada
            f_show.

END-OF-SELECTION.




*&---------------------------------------------------------------------*
*&      Form  F_VERIFICA_CAMPOS
*&---------------------------------------------------------------------*
form F_VERIFICA_CAMPOS.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
   EXPORTING
*     I_PROGRAM_NAME               =
*     I_INTERNAL_TABNAME           =
" Eu informei direto o parameters que o usuário alimentou.
     I_STRUCTURE_NAME             = p_tabela
*     I_CLIENT_NEVER_DISPLAY       = 'X'
*     I_INCLNAME                   =
*     I_BYPASSING_BUFFER           =
*     I_BUFFER_ACTIVE              =
    CHANGING
      ct_fieldcat                  = it_fieldcat
   EXCEPTIONS
     INCONSISTENT_INTERFACE       = 1
     PROGRAM_ERROR                = 2
     OTHERS                       = 3
            .

"  Essa função retorna uma tabela do mesmo tipo que a tabela de exportação
" da função 'REUSE_ALV_GRID_DISPLAY' portanto facilitando a criação da tabela
" de catalogo de campos, não precisando fazer aquele perform louco alimentando
" a mesma.

  IF sy-subrc <> 0.
 MESSAGE ID SY-MSGID TYPE 'I' NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  BREAK-POINT.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  F_SHOW
*&---------------------------------------------------------------------*
form F_SHOW .

LOOP AT it_fieldcat INTO st_fieldcat.
  write : st_fieldcat-col_pos,
          st_fieldcat-fieldname, /.
ENDLOOP.

endform.                    " F_SHOW

4 comentários:

  1. Muito bom Mauro, bem detalhado... obrigado cara !!!

    ResponderExcluir
  2. Só uma perguntinha Mauro... o END-OF-SELECTION não é um comando para colocar os gets (no Logical DataBase) em looping?? não entendi a utilidade dele nesse programa...

    ResponderExcluir
  3. Rafa, teve uma vez que me pediram para deixar o código mais claro porque a maioria tá começando agora no ABAP, portanto eu comecei a colocar Start-of-selection para verem aonde começa o processo, coloco os performs com nomes mais claros do que estão fazendo e end-of-selection para mostrar onde termina. Mas conforme você falou esse comando e usado mesmo em reports com 'Logical database'. Espero ter respondido.... Valeu.

    ResponderExcluir