Translate this blog

terça-feira, 28 de maio de 2013

Maneiras fáceis de montar o FieldCat / Easy ways to set the FieldCat


 Português  Os relatórios em ALV Grid são muito requisitados aos ABAPs. Existem algumas formas de fazê-lo, mas o que possibilita uma maior interação do ABAP para padronizá-lo é o Orientado a Objetos. Adicionar eventos, tratamentos com interação do usuário, etc. Normalmente, a maioria dos ABAPs já tem suas "receitas de bolos" para desenvolve-los mas... Porque não melhorá-los? Torná-los reutilizáveis talvez? Facilitar nossas vidas?
Para um primeiro post sobre ALV Grid, não vou me referir diretamente ao seu desenvolvimento. Demonstrarei algumas formas para montar o famoso Field Catalog (FieldCat), que é o responsável por montar a estrutura da tabela mostrada na tela do relatório. Ele que determina o comportamento do campo, se será editável ou não, seu comprimento, etc.
Dependendo da estrutura do seu relatório, você pode optar pela forma de montá-lo. Quando uso uma estrutura de uma tabela transparente ou mesmo de uma tabela com estrutura armazenada no SAP, eu utilizo a função LVC_FIELDCATALOG_MERGE. Sua utilização é bem simples:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
  DATA: lt_mara TYPE TABLE OF mara,
       lt_fldcat TYPE lvc_t_fcat.
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*    i_buffer_active =
     i_structure_name = 'MARA'
*    i_client_never_display = 'X' "Não mostra o mandante
*    i_bypassing_buffer =
     i_internal_tabname = 'LT_MARA'
    CHANGING
     ct_fieldcat = lt_fldcat
    EXCEPTIONS
     inconsistent_interface = 1
     program_error = 2
      OTHERS = 3.
*A informação de todos os campos existentes na MARA estarão
*contidas na tabela LT_FLDCAT e poderão ser passadas como
*parâmetro na hora de montar o ALV Grid.

No caso de um relatório mais personalizado, utilizando estruturas declaradas no programa que gera o relatório, desenvolvi um Form que busca as informações dos campos das tabelas DD02L, DD03L e DD03T com a ajuda da função DDIF_FIELDINFO_GET. Com esta função é possível extrair as informações Standards de cada campo da tabela interna declarada no report.
Vamos ao código:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
*Estrutura para armazenar a tabela e o campo Standard
  TYPES: BEGIN OF ty_tab_inf,
     tab TYPE dd02l-tabname,
     field TYPE dd03t-fieldname,
    END OF ty_tab_inf,
*Estrutura com os campos do relatório
    BEGIN OF ty_teste,
     matnr TYPE mara-matnr,
     belnr TYPE bseg-belnr,
    END OF ty_teste.
  DATA: lt_tab_inf TYPE TABLE OF ty_tab_inf,
   ls_tab_inf TYPE ty_tab_inf,
   lt_teste TYPE TABLE OF ty_teste,
   ls_teste TYPE ty_teste,
   lt_fldcat TYPE TABLE OF lvc_t_fcat.
*Adicionamos a tabela e campo de referência Standard,
*para montar o FieldCat conforme os campos do relatório
 ls_tab_inf-tab = 'MARA'. ls_tab_inf-field = 'MATNR'.
  APPEND ls_tab_inf TO lt_tab_inf.
 ls_tab_inf-tab = 'BSEG'. ls_tab_inf-field = 'BELNR'.
  APPEND ls_tab_inf TO lt_tab_inf.
  PERFORM zf_get_fieldcat USING 'LT_TESTE'
       lt_tab_inf
        CHANGING lt_fldcat.
*A informação de todos os campos existentes na LT_TESTE
*estarão contidas na tabela LT_FLDCAT e poderão ser passados
*como parâmetro na hora de montar o ALV Grid.
*&----------------------------------------------------------*
*& Form zf_get_fieldcat
*&----------------------------------------------------------*
* -->P_TABNAME text
* -->PT_TAB_INF text
* -->PT_FIELDCAT text
*&----------------------------------------------------------*
  FORM zf_get_fieldcat USING p_tabname TYPE lvc_tname
       pt_tab_inf TYPE ANY TABLE
        CHANGING pt_fieldcat TYPE lvc_t_fcat.
    FIELD-SYMBOLS: <fs_slin> TYPE ANY,
     <fs_tab> TYPE ANY,
     <fs_field> TYPE ANY.
    DATA: ls_fldcat TYPE lvc_s_fcat,
     lv_subrc TYPE sy-subrc.
   ls_fldcat-row_pos = 1.
    LOOP AT <fs_ttab> ASSIGNING <fs_slin>.
     ls_fldcat-col_pos = sy-tabix.
      ASSIGN( '<FS_SLIN>-TAB') TO <fs_tab>.
      ASSIGN( '<FS_SLIN>-FIELD') TO <fs_field>.
      IF <fs_tab> IS NOT ASSIGNED OR <fs_field> IS NOT ASSIGNED.
       lv_subrc = 4. EXIT.
      ENDIF.
      CALL FUNCTION 'DDIF_FIELDINFO_GET'
        EXPORTING
         tabname   = <fs_tab>
         fieldname = <fs_field>
         langu     = sy-langu
        TABLES
         dfies_tab = lt_dfies.
      IF sy-subrc IS INITIAL.
        READ TABLE lt_dfies INTO ls_dfies INDEX 1.
        MOVE-CORRESPONDING ls_dfies TO ls_fldcat.
       ls_fldcat-tabname = p_tabname.
        APPEND ls_fldcat TO pt_fieldcat.
      ENDIF.
    ENDLOOP.
   sy-subrc = lv_subrc.
  ENDFORM."zf_get_fieldcat

Nenhum comentário:

Postar um comentário