Categorias

Tabela interna dinâmica no ABAP

Cria uma tabela interna dinâmica como exemplo, para podermos explorar os recursos da utilização destas tabelas criadas dinâmicamente.

*&---------------------------------------------------------------------*
*& Report  ZPEXEMP_TAB_DINAMICA
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZPEXEMP_TAB_DINAMICA NO STANDARD PAGE HEADING MESSAGE-ID 00
                                                     LINE-SIZE 120.
*----------------------------------------------------------------------*
* Tabelas Transparentes
*----------------------------------------------------------------------*
TABLES: MARA,
        MARC,
        MAKT,
        MVKE,
        TVKO,
        T001,
        TSPAT,
        T179T,
        TVM3T,
        MARM,
        MLGN,
        TVKWZ,
        T604N.

*----------------------------------------------------------------------*
* Constantes
*----------------------------------------------------------------------*
DATA: C_ON(1) VALUE 'X',
      C_OFF(1).

*----------------------------------------------------------------------*
* Field-symbols
*----------------------------------------------------------------------*
*  p/ser a tabela dinâmica onde constaram os dados de exibição
FIELD-SYMBOLS:  TYPE ANY TABLE,

*work-área p/ trabalhar os dados antes de inclui 
                 TYPE ANY,

*campo que recebera dados e apontara p/ os campos dinâmicos da wa.
                TYPE ANY.

*----------------------------------------------------------------------*
* Tabelas Interna
*----------------------------------------------------------------------*
*Tabela dinâmica de exibição do ALV
DATA: T_DATA TYPE REF TO DATA.

*Tabela Descrição do empresa
DATA:  BEGIN OF T_EMP OCCURS 0,
    BUKRS  LIKE TVKO-BUKRS,
    BUTXT  LIKE T001-BUTXT,
  END OF T_EMP,

*Tabela Descrição do material
  BEGIN OF T_MAKT OCCURS 0,
    MATNR  LIKE MAKT-MATNR,
    MAKTX  LIKE MAKT-MAKTX,
  END OF T_MAKT,

*Tabela descrição da divisão
  BEGIN OF T_DIV OCCURS 0,
    SPART  LIKE TSPAT-SPART,
    VTEXT  LIKE TSPAT-VTEXT,
   END OF T_DIV,

*Tabela de descrição Materiais: hierarquias de produtos: textos
  BEGIN OF T_HIERAR OCCURS 0,
    PRODH  LIKE T179T-PRODH,
    VTEX1  LIKE T179T-VTEXT,
  END OF T_HIERAR,

*Tabela descrição da família do produto
  BEGIN OF T_FP OCCURS 0,
    MVGR3  LIKE TVM3T-MVGR3,
    BEZEI  LIKE TVM3T-BEZEI,
  END OF T_FP,

*Tabela descrição CFOP
  BEGIN OF T_CFOP  OCCURS 0,
    STEUC  LIKE T604N-STEUC,
    TEXT1  LIKE T604N-TEXT1,
  END OF T_CFOP,

*Tabela de dados mestres de material
  BEGIN OF T_MARA  OCCURS 0,
    MATNR  LIKE MARA-MATNR,
    BISMT  LIKE MARA-BISMT,
    VOLUM  LIKE MARA-VOLUM,
    BRGEW  LIKE MARA-BRGEW,
    NTGEW  LIKE MARA-NTGEW,
    GEWEI  LIKE MARA-GEWEI,
    VOLEH  LIKE MARA-VOLEH,
    SPART  LIKE MARA-SPART,
    EAN11  LIKE MARA-EAN11,
    PRDHA  LIKE MARA-PRDHA,
  END OF T_MARA,

*Tabela de Dados de centro para material
  BEGIN OF T_MARC  OCCURS 0,
    MATNR  LIKE MARC-MATNR,
    WERKS  LIKE MARC-WERKS,
    DISMM  LIKE MARC-DISMM,
    BSTMI  LIKE MARC-BSTMI,
    STEUC  LIKE MARC-STEUC,
*    LGPRO  like marc-lgpro,
  END OF T_MARC,

*Tabela Unidade de organização: organização de vendas
  BEGIN OF T_TVKO  OCCURS 0,
    VKORG  LIKE TVKO-VKORG,
  END OF T_TVKO,

*Tabela Dados de venda para material
  BEGIN OF T_MVKE  OCCURS 0,
    MATNR  LIKE MVKE-MATNR,
    VKORG  LIKE MVKE-VKORG,
    VTWEG  LIKE MVKE-VTWEG,
    SCMNG  LIKE MVKE-SCMNG,
    MVGR3  LIKE MVKE-MVGR3,
  END OF T_MVKE,

*Tabela de Unidades de medida para material
  BEGIN OF T_MARM   OCCURS 0,
    MATNR  LIKE MARM-MATNR,
    MEINH  LIKE MARM-MEINH,
    UMREZ  LIKE MARM-UMREZ,
    UMREN  LIKE MARM-UMREN,
    EAN11  LIKE MARM-EAN11,
    HOEHE  LIKE MARM-HOEHE,
  END OF T_MARM,

*Tabela de Unidades de medida para material auxiliar
  BEGIN OF T_UNID  OCCURS 0,
    MEINH  LIKE MARM-MEINH,
    UNID(2),
    UMRE(11),
  END OF T_UNID,

*Tabela de descrição da unidade
  BEGIN OF T_T006A OCCURS 0,
    MSEHI  LIKE T006A-MSEHI,
    MSEHT  LIKE T006A-MSEHT,
  END OF T_T006A,

*Tabela de Atribuição depósito IM a sistema de depósito WM
  BEGIN OF T_T320 OCCURS 0,
    WERKS  LIKE T320-WERKS,
    LGORT  LIKE T320-LGORT,
    LGNUM  LIKE T320-LGNUM,
  END OF T_T320,

*Tabela de Dados de material por sistema de depósito
  BEGIN OF T_MLGN  OCCURS 0,
    MATNR  LIKE MLGN-MATNR,
    LGNUM  LIKE MLGN-LGNUM,
    LVSME  LIKE MLGN-LVSME,
  END OF T_MLGN,

*Tabela de Unidade organizaçional: centros permitidos por OrgV
  BEGIN OF T_TVKWZ OCCURS 0,
    VKORG  LIKE TVKWZ-VKORG,
    VTWEG  LIKE TVKWZ-VTWEG,
    WERKS  LIKE TVKWZ-WERKS,
  END OF T_TVKWZ,

*Tabela auxiliar organização de vendas
  BEGIN OF T_ORGV OCCURS 0,
    VKORG  LIKE TVKWZ-VKORG,
    VTWEG  LIKE TVKWZ-VTWEG,
  END OF T_ORGV.

*----------------------------------------------------------------------*
* Estrutura de dados
*----------------------------------------------------------------------*
* Work-Área p/ montar dados dos campos
DATA: WA_FCAT_LVC  TYPE LVC_S_FCAT,

* Tabela sem cabeçalho p/ receber dados da wa acima e passar informações
* de campos p/ gerar a tabela dinâmica
      LT_FCAT_LVC  TYPE LVC_T_FCAT.

*----------------------------------------------------------------------*
* Variáveis
*----------------------------------------------------------------------*
DATA:
       V_REPID            LIKE SY-REPID,
       VARIANT_SAVE(1)    TYPE C,
       VARIANT_EXIT(1)    TYPE C,
       V_CAMP(7),      " variável p/ montar campo dinâmico
       V_TEXT(100).    " variável p/ montar texto dinâmico

*----------------------------------------------------------------------*
* Definições ALV
*----------------------------------------------------------------------*
TYPE-POOLS SLIS.

DATA: REPID            LIKE SY-REPID.
DATA: S_FIELDCAT       TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE.
DATA: S_LAYOUT         TYPE SLIS_LAYOUT_ALV.
DATA: S_PRINT          TYPE SLIS_PRINT_ALV.
DATA: S_SORT           TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE.
DATA: VARIANTE         LIKE DISVARIANT.
DATA: DEF_VARIANTE     LIKE DISVARIANT.
DATA: S_SELFIELD       TYPE SLIS_SELFIELD.
DATA: LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER.


*----------------------------------------------------------------------*
* Tela de Seleção
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.

PARAMETERS: P_BUKRS LIKE T001-BUKRS OBLIGATORY.   " Empresa

SELECT-OPTIONS: S_MATNR FOR MARA-MATNR,          " Material (SAP)
                S_BISMT FOR MARA-BISMT,          " Material (SAC)
                S_MTART FOR MARA-MTART,          " Tipo de produto
                S_MATKL FOR MARA-MATKL,          " Grupo de Mercadorias
                S_SPART FOR MARA-SPART,          " Setor de Atividade
                S_PRDHA FOR MARA-PRDHA,          " Hierarquia de Prod.
                S_MVGR3 FOR MVKE-MVGR3,          " Família do produto
                S_STEUC FOR MARC-STEUC,          " Classificação Fiscal
                S_DISMM FOR MARC-DISMM,          " Tipo de MRP
                S_ERSDA FOR MARA-ERSDA,          " Data de criação
                S_LAEDA FOR MARA-LAEDA.          " Data de Manutenção
SELECTION-SCREEN END   OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME.

PARAMETERS: P_VARI LIKE DISVARIANT-VARIANT. "Layout

SELECTION-SCREEN END OF BLOCK B2.

*----------------------------------------------------------------------*
* Controle F4 para campo variante                                      *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_VARI.

  PERFORM F_F4_FOR_VARIANT USING P_VARI.

*----------------------------------------------------------------------*
* Evento at selection-screen                                           *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.

* Seleciona dados
  PERFORM F_DADOS.

*Trata Variante de Exibição
  PERFORM F_TRATAR_VARIANTE USING P_VARI.

* Incialização
INITIALIZATION.

* Verifica s e existe um variante de exibição default
  PERFORM F_INIT_ALV.

* mostra as variantes para este relatório
  PERFORM F_EXIBE_VARIANTE USING P_VARI.

START-OF-SELECTION.

* Busca dados complementares
  PERFORM F_DADOS_COMPL.

END-OF-SELECTION.

* Definindo Layout de Exibição
  PERFORM F_DEFINE_LAYOUT.

* Definindo Fieldcat
  PERFORM F_DEFINE_FIELDCAT.

* Monta dados
  PERFORM F_MONTA_DADOS.

* Impressão do ALV passando tabela dinâmica
  PERFORM F_IMPRIME_DADOS USING .


***********************************************************************
*Rotinas
***********************************************************************

*----------------------------------------------------------------------*
*       Form  f_f4_for_variant
*----------------------------------------------------------------------*
* Gerar matchcode com os layouts gravados
*----------------------------------------------------------------------*
*      -->P_P_VARI  Variante
*----------------------------------------------------------------------*
FORM F_F4_FOR_VARIANT USING  P_VARI.

* Função para selecionar o Layout gravado
  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
    EXPORTING
      IS_VARIANT = VARIANTE
      I_SAVE     = VARIANT_SAVE
    IMPORTING
      E_EXIT     = VARIANT_EXIT
      ES_VARIANT = DEF_VARIANTE
    EXCEPTIONS
      NOT_FOUND  = 2.

  IF SY-SUBRC = 2.
    MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.

    IF VARIANT_EXIT = SPACE.
      P_VARI = DEF_VARIANTE-VARIANT.
    ENDIF.

  ENDIF.
ENDFORM.                    " f_f4_for_variant
*----------------------------------------------------------------------*
*       Form  f_dados
*----------------------------------------------------------------------*
* Seleciona dados
*----------------------------------------------------------------------*
FORM F_DADOS.

* Seleção descrição da empresa:
  SELECT BUKRS BUTXT
        INTO TABLE T_EMP
        FROM T001
        WHERE  BUKRS  = P_BUKRS
        AND    SPRAS  = SY-LANGU.

  IF SY-SUBRC NE 0.
    MESSAGE E208(00) WITH 'Não há dados para esta seleção'(M01).
  ENDIF.

* Seleção das unidades de org. tabelas  TVKO:
  SELECT  VKORG
        INTO TABLE T_TVKO
        FROM TVKO
        WHERE BUKRS  = P_BUKRS.


  IF T_TVKO[] IS INITIAL.
    MESSAGE E208(00) WITH 'Não há dados para esta seleção'(M01).
  ENDIF.

* Seleção dados tabelas  TVKWZ:
  SELECT  VKORG VTWEG WERKS
       INTO TABLE T_TVKWZ
       FROM TVKWZ
       FOR ALL ENTRIES IN T_TVKO
       WHERE VKORG = T_TVKO-VKORG.

*Monta t_orgv com dados da T_TVKWZ
  LOOP AT T_TVKWZ.
    CLEAR T_ORGV.
    MOVE: T_TVKWZ-VKORG   TO T_ORGV-VKORG,
          T_TVKWZ-VTWEG   TO T_ORGV-VTWEG.
    COLLECT T_ORGV.
  ENDLOOP.

  IF T_ORGV[] IS INITIAL.
    MESSAGE E208(00) WITH 'Não há dados para esta seleção'(M01).
  ENDIF.



* Seleção dados da tabelas  MARA:
  SELECT MATNR BISMT VOLUM BRGEW NTGEW
        GEWEI VOLEH SPART EAN11 PRDHA
        INTO TABLE T_MARA
        FROM MARA
        WHERE MATNR IN S_MATNR
        AND   BISMT IN S_BISMT
        AND MTART IN S_MTART
        AND MATKL IN S_MATKL
        AND SPART IN S_SPART
        AND PRDHA IN S_PRDHA
        AND ERSDA IN S_ERSDA
        AND LAEDA IN S_LAEDA.

  IF T_MARA[] IS INITIAL.
    MESSAGE E208(00) WITH 'Não há dados para esta seleção'(M01).
  ENDIF.

* Seleção dados da tabelas  MARC:
  SELECT MATNR WERKS DISMM BSTMI STEUC
        INTO TABLE T_MARC
        FROM MARC
        FOR ALL ENTRIES IN T_MARA
        WHERE MATNR = T_MARA-MATNR
        AND   STEUC IN S_STEUC
        AND   DISMM IN S_DISMM.

*Elimina registros da t_marc com centro inválido
  LOOP AT T_MARC.
    READ TABLE T_TVKWZ WITH KEY WERKS = T_MARC-WERKS.
    IF SY-SUBRC NE 0.
      DELETE T_MARC.
    ENDIF.
  ENDLOOP.

*Elimina registros da t_mara sem dados na T_marc
  LOOP AT T_MARA.
    READ TABLE T_MARC WITH KEY MATNR = T_MARA-MATNR.
    IF SY-SUBRC NE 0.
      DELETE T_MARA.
    ENDIF.
  ENDLOOP.

  IF T_MARA[] IS INITIAL.
    MESSAGE E208(00) WITH 'Não há dados para esta seleção'(M01).
  ENDIF.

* Seleção dados da tabelas  MVKE:
  SELECT MATNR VKORG VTWEG SCMNG MVGR3
        INTO TABLE T_MVKE
        FROM MVKE
        FOR ALL ENTRIES IN  T_MARA
        WHERE MATNR = T_MARA-MATNR
        AND   MVGR3 IN S_MVGR3.

  LOOP AT T_MVKE.
    READ TABLE T_ORGV WITH KEY VKORG  = T_MVKE-VKORG
                               VTWEG  = T_MVKE-VTWEG.
    IF SY-SUBRC NE 0.
      DELETE T_MVKE.
    ENDIF.

  ENDLOOP.

* Seleção dados da tabelas  T320:
  SELECT WERKS LGORT LGNUM
      INTO TABLE T_T320
      FROM T320
      FOR ALL ENTRIES IN T_TVKWZ
      WHERE WERKS = T_TVKWZ-WERKS.


* Seleção dados da tabelas  MLGN:
  SELECT MATNR LGNUM LVSME
      INTO TABLE T_MLGN
      FROM MLGN
      FOR ALL ENTRIES IN  T_T320
      WHERE MATNR IN S_MATNR
      AND   LGNUM = T_T320-LGNUM.



ENDFORM.                    " f_dados

*----------------------------------------------------------------------*
*       Form  f_tratar_variante
*----------------------------------------------------------------------*
*       Tratar a variante informada.
*----------------------------------------------------------------------*
FORM F_TRATAR_VARIANTE USING    P_VARI.

  IF NOT P_VARI IS INITIAL.

    MOVE VARIANTE TO DEF_VARIANTE.
    MOVE P_VARI TO DEF_VARIANTE-VARIANT.

    CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
      EXPORTING
        I_SAVE     = VARIANT_SAVE
      CHANGING
        CS_VARIANT = DEF_VARIANTE.

    VARIANTE = DEF_VARIANTE.

  ELSE.

    CLEAR VARIANTE.
    VARIANTE-REPORT = V_REPID.

  ENDIF.
ENDFORM.                    " f_tratar_variante

*----------------------------------------------------------------------*
*       Form  f_init_alv
*----------------------------------------------------------------------*
FORM F_INIT_ALV.
  CLEAR: VARIANTE.

  REPID = SY-REPID.
  VARIANTE-REPORT = REPID.

  CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
    EXPORTING
      I_SAVE     = 'A'
    CHANGING
      CS_VARIANT = VARIANTE
    EXCEPTIONS
      NOT_FOUND  = 2.
  IF SY-SUBRC = 0.
    P_VARI = VARIANTE.
  ENDIF.
ENDFORM.                    " f_init_alv

*----------------------------------------------------------------------*
*       Form  f_exibe_variante
*----------------------------------------------------------------------*
*        Exibir variante
*----------------------------------------------------------------------*
FORM F_EXIBE_VARIANTE USING  P_VARI.

  CLEAR VARIANTE.

  MOVE: SY-REPID TO V_REPID,
        'A'      TO VARIANT_SAVE,
        V_REPID  TO VARIANTE-REPORT.

  S_PRINT-NO_PRINT_LISTINFOS = C_ON.

*Buscar variante DEFAULT, ou seja, se não for informado nenhuma
*variante, o programa executará com esta

  DEF_VARIANTE = VARIANTE.

  CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
    EXPORTING
      I_SAVE     = VARIANT_SAVE
    CHANGING
      CS_VARIANT = DEF_VARIANTE
    EXCEPTIONS
      NOT_FOUND  = 2.

  IF SY-SUBRC = 0.
    P_VARI = DEF_VARIANTE-VARIANT.

  ENDIF.
ENDFORM.                    " f_exibe_variante
*----------------------------------------------------------------------*
*       Form  f_define_layout
*----------------------------------------------------------------------*
*     Definindo Layout de Exibição
*----------------------------------------------------------------------*
FORM F_DEFINE_LAYOUT.
  S_LAYOUT-ZEBRA               =  C_ON.

ENDFORM.                    " f_define_layout
*----------------------------------------------------------------------*
*       Form  f_define_fieldcat
*----------------------------------------------------------------------*
FORM F_DEFINE_FIELDCAT.

* Monta informações dos campos fixos
  PERFORM MONTA_FIELDCAT USING:
        'BUKRS'  'TVKO'  TEXT-F01              '10' 'BUKRS',
        'BUTXT'  'T001'  TEXT-F02              '15' 'BUTXT',
        'MATNR'  'MARA'  TEXT-F03              '15' 'MATNR',
        'BISMT'  'MARA'  TEXT-F04              '15' 'BISMT',
        'MAKTX'  'MAKT'  TEXT-F05              '15' 'MAKTX',
        'SPART'  'MARA'  TEXT-F06              '5'  'SPART',
        'VTEXT'  'TSPAT' TEXT-F07              '40' 'VTEXT',
        'PRDHA'  'MARA'  TEXT-F08              '18' 'PRDHA',
        'VTEX1'  'T179T' TEXT-F09              '40' 'VTEXT',
        'NTGEW'  'MARA'  TEXT-F10              '10' 'NTGEW',
        'BRGEW'  'MARA'  TEXT-F11              '10' 'BRGEW',
        'GEWEI'  'MARA'  TEXT-F12              '5'  'GEWEI',
        'VOLUM'  'MARA'  TEXT-F13              '10' 'VOLUM',
        'VOLEH'  'MARA'  TEXT-F14              '5'  'VOLEH',
        'MVGR3'  'MVKE'  TEXT-F15              '5'  'MVGR3',
        'BEZEI'  'TVM3T' TEXT-F16              '10' 'BEZEI',
        'STEUC'  'MARC'  TEXT-F17              '10' 'STEUC',
        'TEXT1'  'T604N' TEXT-F18              '15' 'TEXT1',
        'DISMM'  'MARC'  TEXT-F19              '5'  'DISMM',
        'BSTMI'  'MARC'  TEXT-F20              '5'  'BSTMI',
        'SCMNG'  'MVKE'  TEXT-F21              '5'  'SCMNG',
        'EAN11'  'MARA'  TEXT-F22              '10' 'EAN11',
        'MEINH'  'MARM'  TEXT-F23              '5'  'MEINH',
        'LVSME'  'MLGN'  TEXT-F24              '5'  'LVSME'.


* Monta informações dos campos dinâmicos
* Monta unidades dinâmicas
  LOOP AT T_UNID.

* Cod unidade alternativa
    CLEAR: V_CAMP,
           V_TEXT.
    CONCATENATE  'MEINH'
                 T_UNID-UNID
                 INTO V_CAMP.
    CONCATENATE  TEXT-F25
                 T_UNID-UNID
                 INTO V_TEXT.
    PERFORM MONTA_FIELDCAT USING
         V_CAMP   'MARM' V_TEXT            '5' 'MEINH'.

* Descrição
    CLEAR: V_CAMP,
           V_TEXT.
    CONCATENATE  'MSEHT'
                 T_UNID-UNID
                 INTO V_CAMP.
    CONCATENATE  TEXT-F26
                 T_UNID-UNID
                 INTO V_TEXT.
    PERFORM MONTA_FIELDCAT USING
         V_CAMP  'T006A' V_TEXT            '10' 'MSEHT'.

* DUN
    CLEAR: V_CAMP,
           V_TEXT.
    CONCATENATE  'EAN11'
                 T_UNID-UNID
                 INTO V_CAMP.
    CONCATENATE  TEXT-F27
                 T_UNID-UNID
                 INTO V_TEXT.
    PERFORM MONTA_FIELDCAT USING
         V_CAMP  'MARM' V_TEXT            '10' 'EAN11'.

* Quantidade de Unidades
    CLEAR: V_CAMP,
           V_TEXT.
    CONCATENATE  'UMRE'
                 T_UNID-UNID
                 INTO V_CAMP.
    CONCATENATE  TEXT-F28
                 T_UNID-UNID
                 INTO V_TEXT.
    PERFORM MONTA_FIELDCAT USING
         V_CAMP  ' ' V_TEXT            '11' ' '.

    IF T_UNID-MEINH(1) = 'P'.
* Lastro
      CLEAR: V_CAMP,
             V_TEXT.
      CONCATENATE  'HOEHE'
                   T_UNID-UNID
                   INTO V_CAMP.
      CONCATENATE  TEXT-F29
                   T_UNID-UNID
                   INTO V_TEXT.
      PERFORM MONTA_FIELDCAT USING
           V_CAMP   'MARM' V_TEXT            '5' 'HOEHE'.
    ENDIF.

  ENDLOOP.



ENDFORM.                    " f_define_fieldcat
*&---------------------------------------------------------------------*
*&      Form  f_imprime_dados
*&---------------------------------------------------------------------*
FORM F_IMPRIME_DADOS USING P_ITAB_OUTPUT TYPE TABLE.
  PERFORM F_MONTA_TOP_OF_PAGE USING LIST_TOP_OF_PAGE[].

  S_PRINT-NO_PRINT_LISTINFOS = C_ON.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM     = V_REPID
      I_CALLBACK_TOP_OF_PAGE = 'TOP_OF_PAGE'
      IS_LAYOUT              = S_LAYOUT
      IT_FIELDCAT            = S_FIELDCAT[]
      IT_SORT                = S_SORT[]
      I_DEFAULT              = 'X'
      I_SAVE                 = 'A'
      IS_VARIANT             = VARIANTE
      IS_PRINT               = S_PRINT
    TABLES
      T_OUTTAB               = P_ITAB_OUTPUT
    EXCEPTIONS
      PROGRAM_ERROR          = 1
      OTHERS                 = 2.
  IF NOT SY-SUBRC IS INITIAL.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.
ENDFORM.                    " f_imprime_dados

*&---------------------------------------------------------------------*
*&      Form  monta_fieldcat
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*      -->p_field      campo
*  comentado    -->p_tab        tabela
*      -->p_tabref     tabela de referencia
*      -->p_text       texto da coluna
*      -->p_out.       tamanho da saida
*      --> p_ref_field campo de referencia
*----------------------------------------------------------------------*
FORM MONTA_FIELDCAT USING P_FIELD
*                          p_tab
                          P_TABREF
                          P_TEXT
                          P_OUT
                          P_REF_FIELD.
**** Se o programa for um ALV, pode aproveitar p/ carregar fieldcat com
* os atributos necessários, caso não se trate de um ALV basta informar o
* campo de referencia, a tabela de referência, o campo  e a tabela.

  CLEAR: S_FIELDCAT, WA_FCAT_LVC.
  WA_FCAT_LVC-FIELDNAME   = S_FIELDCAT-FIELDNAME   = P_FIELD.
  WA_FCAT_LVC-TABNAME     = S_FIELDCAT-TABNAME     = ''.
  WA_FCAT_LVC-REF_TABLE   = S_FIELDCAT-REF_TABNAME = P_TABREF.
  WA_FCAT_LVC-SELTEXT     = S_FIELDCAT-SELTEXT_L   = P_TEXT.
  WA_FCAT_LVC-OUTPUTLEN   = S_FIELDCAT-OUTPUTLEN   = P_OUT.
  WA_FCAT_LVC-REF_FIELD   = S_FIELDCAT-REF_FIELDNAME   = P_REF_FIELD.

* carrega fieldcat do alv
  APPEND S_FIELDCAT.

*inclui dados da work-área p/ tabela sem cab.
  APPEND WA_FCAT_LVC TO LT_FCAT_LVC.

ENDFORM.                    " monta_fieldcat
*----------------------------------------------------------------------*
*       Form  f_monta_dados
*----------------------------------------------------------------------*
FORM F_MONTA_DADOS.

  DATA: T_ALVDATA TYPE REF TO DATA.

* Monta tabela dinâmica
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      I_STYLE_TABLE   = ' '
*                     tab com as informações de campo
      IT_FIELDCATALOG = LT_FCAT_LVC
    IMPORTING
*                     retorna tab dinâmica com campos informados
      EP_TABLE       = T_DATA.

* Carrega  com a estrutura dos campos passados para o metodo
  ASSIGN T_DATA->* TO .
  CREATE DATA T_ALVDATA LIKE LINE OF .
  ASSIGN T_ALVDATA->* TO .

  REFRESH .

* Percorre Dados Mestres de Material
  LOOP AT T_MARA.
    CLEAR:
           T_MAKT,
           T_DIV,
           T_HIERAR,
           T_MVKE,
           T_FP,
           T_TVKWZ,
           T_MARC,
           T_MLGN,
           T_CFOP,
           T_T320,
           .

* Busca dados empresa
    READ TABLE T_EMP INDEX 1.

* Busca descrição do material
    READ TABLE T_MAKT WITH KEY MATNR = T_MARA-MATNR.

* Busca descrição da divisão
    READ TABLE T_DIV WITH KEY SPART = T_MARA-SPART.

* Busca descrição da hierarquia
    READ TABLE T_HIERAR WITH KEY PRODH = T_MARA-PRDHA.

* Busca dados de venda do material - mvke
    READ TABLE T_MVKE WITH KEY MATNR = T_MARA-MATNR.

* Busca descrição da família do produto
    READ TABLE T_FP WITH KEY MVGR3 = T_MVKE-MVGR3.

* Acessa unidade organizacional - centros permitidos p/ Org. de Vendas
    READ TABLE T_TVKWZ WITH KEY VKORG = T_MVKE-VKORG
                                VTWEG = T_MVKE-VTWEG.

* Busca dados de centro para material
    READ TABLE T_MARC WITH KEY MATNR = T_MARA-MATNR
                               WERKS = T_TVKWZ-WERKS.
* Busca descrição do CFOP
    READ TABLE T_CFOP WITH KEY STEUC = T_MARC-STEUC.

* Acessa tabela de atribuição depósito IM a sist. deposito WM
    READ TABLE T_T320 WITH KEY WERKS = T_TVKWZ-WERKS.

* Busca unidade de medida da caixa de entrada
    READ TABLE T_MLGN WITH KEY MATNR = T_MARA-MATNR
                               LGNUM = T_T320-LGNUM.

* Carreda dados para work-área dinâmica

* Campos fixos
    PERFORM F_CARREGA_DADOS USING:
    T_EMP-BUKRS     'BUKRS',
    T_EMP-BUTXT     'BUTXT',
    T_MARA-MATNR    'MATNR',
    T_MARA-BISMT    'BISMT',
    T_MAKT-MAKTX    'MAKTX',
    T_MARA-SPART    'SPART',
    T_DIV-VTEXT     'VTEXT',
    T_MARA-PRDHA    'PRDHA',
    T_HIERAR-VTEX1  'VTEX1',
    T_MARA-NTGEW    'NTGEW',
    T_MARA-BRGEW    'BRGEW',
    T_MARA-GEWEI    'GEWEI',
    T_MARA-VOLUM    'VOLUM',
    T_MARA-VOLEH    'VOLEH',
    T_MVKE-MVGR3    'MVGR3',
    T_MVKE-SCMNG    'SCMNG',
    T_MARA-EAN11    'EAN11',
    T_FP-BEZEI      'BEZEI',
    T_MARC-STEUC    'STEUC',
    T_MARC-DISMM    'DISMM',
    T_MARC-BSTMI    'BSTMI',
    T_CFOP-TEXT1    'TEXT1',
    T_MLGN-LVSME    'LVSME'.

* Campos dinâmicos

* Unidades Alternativa
    LOOP AT T_MARM WHERE MATNR = T_MARA-MATNR.
* Carrega unidade base
      IF T_MARM-MEINH = 'ST'.
        PERFORM F_CARREGA_DADOS USING:
         T_MARM-MEINH     'MEINH'.

      ELSE.
        LOOP AT T_UNID WHERE MEINH = T_MARM-MEINH.
*   Carrega unidades alternativas

*     Código da unidade
          CLEAR V_CAMP.
          CONCATENATE 'MEINH'
                       T_UNID-UNID
                       INTO V_CAMP.
          PERFORM F_CARREGA_DADOS USING:
              T_MARM-MEINH     V_CAMP.

*     Descrição da unidade
          CLEAR V_CAMP.
          CONCATENATE 'MSEHT'
                       T_UNID-UNID
                       INTO V_CAMP.
          READ TABLE T_T006A WITH KEY MSEHI = T_MARM-MEINH.
          PERFORM F_CARREGA_DADOS USING:
              T_T006A-MSEHT     V_CAMP.

*     DUN
          CLEAR V_CAMP.
          CONCATENATE 'EAN11'
                       T_UNID-UNID
                       INTO V_CAMP.
          PERFORM F_CARREGA_DADOS USING:
              T_MARM-EAN11     V_CAMP.

*     Quantidade da unidades
          CLEAR V_CAMP.
          CONCATENATE 'UMRE'
                       T_UNID-UNID
                       INTO V_CAMP.
          DATA:  V_UMREZ(5),
                 V_UMREN(5),
                 V_VALOR(11).

          V_UMREZ = T_MARM-UMREZ.
          V_UMREN = T_MARM-UMREN.
          CONCATENATE V_UMREZ
                     '/'
                     V_UMREN
                     INTO V_VALOR.
          PERFORM F_CARREGA_DADOS USING:
              V_VALOR     V_CAMP.

          IF T_MARM-MEINH(1) = 'P'.
*         Lastro
            CLEAR V_CAMP.
            CONCATENATE  'HOEHE'
                     T_UNID-UNID
                     INTO V_CAMP.
            PERFORM F_CARREGA_DADOS USING:
            T_MARM-HOEHE     V_CAMP.

          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDLOOP.

*  Inclui dados da work-área dinâmica na tabela dinâmica
    PERFORM F_CARREGA_ALV USING 
                                .

  ENDLOOP.
ENDFORM.                    " f_monta_dados
*----------------------------------------------------------------------*
*       Form  f_monta_top_of_page
*----------------------------------------------------------------------*
FORM F_MONTA_TOP_OF_PAGE USING P_LIST_TOP_OF_PAGE TYPE
                               SLIS_T_LISTHEADER.

  DATA: T_HEADER TYPE SLIS_LISTHEADER,
        V_DATA(10) TYPE C.

  T_HEADER-TYP  = 'H'.
  T_HEADER-INFO = 'Relatório de Materiais (Pesos e Medidas)'(T01).
  APPEND T_HEADER TO P_LIST_TOP_OF_PAGE.
  CLEAR T_HEADER.
  WRITE SY-DATUM USING EDIT  MASK '__.__.____' TO V_DATA.
  CONCATENATE 'Data : '(023)  V_DATA INTO T_HEADER-KEY SEPARATED BY
  SPACE.
  T_HEADER-TYP  = 'S'.
  APPEND T_HEADER TO P_LIST_TOP_OF_PAGE.

ENDFORM.                    " f_monta_top_of_page

*----------------------------------------------------------------------*
*       Form  f_monta_top_of_page
*----------------------------------------------------------------------*
FORM TOP_OF_PAGE.

* Cabeçalho Logo
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = LIST_TOP_OF_PAGE[]
      I_LOGO             = 'WELLA_LOGO'.

ENDFORM.        " top_of_page.
*----------------------------------------------------------------------*
*       Form  f_dados_compl
*----------------------------------------------------------------------*
* Busca dados complementares
*----------------------------------------------------------------------*
FORM F_DADOS_COMPL.

* Seleção dados da tabelas  MARM:
  SELECT MATNR MEINH UMREZ UMREN EAN11 HOEHE
        INTO TABLE T_MARM
        FROM MARM
        FOR ALL ENTRIES IN T_MARA
        WHERE MATNR = T_MARA-MATNR.


*Monta auxiliar de unidade t_unid
  LOOP AT T_MARM WHERE MEINH <> 'ST'.
    CLEAR T_UNID.
    T_UNID-MEINH  = T_MARM-MEINH.
    COLLECT T_UNID.
  ENDLOOP.

  LOOP AT T_UNID.
    MOVE SY-TABIX TO T_UNID-UNID.
    MODIFY T_UNID.
  ENDLOOP.

* Seleção dados de descrição da tabelas  makt:
  SELECT MATNR MAKTX
     INTO TABLE T_MAKT
     FROM MAKT
     FOR ALL ENTRIES IN T_MARA
     WHERE MATNR = T_MARA-MATNR
     AND SPRAS = SY-LANGU.


* Seleção dados de descrição da divisão da tabelas TSPAT:
  SELECT SPART VTEXT
     INTO TABLE T_DIV
     FROM TSPAT
     WHERE SPART IN S_SPART
     AND   SPRAS = SY-LANGU.

* Seleção dados de descrição hierarquias de produtos da tabelas T179T:
  SELECT PRODH VTEXT
     INTO TABLE T_HIERAR
     FROM T179T
     WHERE PRODH IN S_PRDHA
     AND SPRAS = SY-LANGU.

* Seleção dados de descrição família do produto da tabelas TVM3T:
  SELECT MVGR3 BEZEI
     INTO TABLE T_FP
     FROM TVM3T
     WHERE MVGR3 IN S_MVGR3
     AND SPRAS = SY-LANGU.

* Seleção dados de descrição CFOP da tabelas J_1BT604FV:
  SELECT STEUC TEXT1
     INTO TABLE T_CFOP
     FROM T604N
     WHERE SPRAS = SY-LANGU
     AND   LAND1 = 'BR'
     AND   STEUC IN S_STEUC.

* Seleção dados de descrição unidade da tabelas T006A:
  SELECT MSEHI MSEHT
     INTO TABLE T_T006A
     FROM T006A
     FOR ALL ENTRIES IN T_UNID
     WHERE SPRAS = SY-LANGU
     AND   MSEHI = T_UNID-MEINH.

ENDFORM.                    " f_dados_compl
*&---------------------------------------------------------------------*
*&      Form  f_carrega_alv
*&---------------------------------------------------------------------*
*      -->P_TAB  tabela
*      -->P_WA   work-área
*----------------------------------------------------------------------*
FORM F_CARREGA_ALV USING    P_TAB TYPE TABLE
                            P_WA.
*  Inclui dados da work-área dinâmica na tabela dinâmica
  APPEND P_WA TO P_TAB.

ENDFORM.                    " f_carrega_alv

*----------------------------------------------------------------------*
*       Form  f_carrega_dados
*----------------------------------------------------------------------*
*   Carrega dados para work-área dinâmica
*----------------------------------------------------------------------*
*      -->P_valor   valor
*      -->P_campo   campo
*----------------------------------------------------------------------*
FORM F_CARREGA_DADOS USING    P_VALOR
                              P_CAMPO.

*Aponta  para -campo montado
  ASSIGN COMPONENT P_CAMPO  OF STRUCTURE  TO .

*Move valor para  que esta apontando p/-campo montado
  MOVE P_VALOR TO .

ENDFORM.                    " f_carrega_dados