Categorias

Aprenda a criar classes no ABAP

O código fonte é uma classe (CLASS) para ser utilizado por programadores, há vários métodos (METHOD) que ajudam o desenvolvedor, principalmente para não ter que ficar reescrevendo ou copiando o código.

*&---------------------------------------------------------------------*
*&  Include           ZCL_ABAP
*&---------------------------------------------------------------------*

*----------------------------------------------------------------------*
*       CLASS CL_ABAP DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_abap DEFINITION.

  PUBLIC SECTION.
*______________________________________________________________________*
*   Declaração global de variaveis, tabelas internas e outros objetos
*   da CLASS
*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
    TYPE-POOLS:
      slis ,
      sydes ,
      ole2 .

    CONSTANTS:
      c_x       TYPE c           VALUE 'X',                 "#EC NOTEXT
      c_blank   TYPE c           VALUE ' ',                 "#EC NOTEXT
      c_true    TYPE boolean     VALUE 'X',                 "#EC NOTEXT
      c_false   TYPE boolean     VALUE ' ',                 "#EC NOTEXT
      c_range   TYPE tvarvc-type VALUE 'S',                 "#EC NOTEXT
      c_param   TYPE tvarvc-type VALUE 'P'.                 "#EC NOTEXT

    TYPES:
      BEGIN OF ty_cols,
        posic    TYPE c LENGTH 002,  " Posição de coluna
      END OF ty_cols ,

      BEGIN OF ty_font,
        code     TYPE c LENGTH 006,  " Definição do nome da fonte
        name     TYPE c LENGTH 020,  " Tipo de fonte (nome)
        size     TYPE i,             " Tamanho da fonte
        bold     TYPE c LENGTH 001,  " Negrito
        italic   TYPE c LENGTH 001,  " Italico
        color    TYPE i,             " Cor da fonte
        bgcolor  TYPE i,             " Cor de fundo
      END OF ty_font ,

      BEGIN OF ty_tabela,
        campo      TYPE c LENGTH 2000,
      END   OF ty_tabela ,

      BEGIN OF ty_arquivo,
        linha         TYPE string,
      END   OF ty_arquivo ,

      ty_campos TYPE TABLE OF string .

    DATA:
      v_ok_code        LIKE sy-ucomm ,
      v_logotype       TYPE c LENGTH 040 VALUE space,     "#EC NOTEXT .
      v_flag           TYPE c LENGTH 001 VALUE space,     "#EC NOTEXT .
      ti_linecolor     TYPE TABLE OF slis_specialcol_alv ,
      ti_sort          TYPE TABLE OF slis_sortinfo_alv ,
      ti_fieldcat      TYPE TABLE OF slis_fieldcat_alv ,
      te_listheader1   TYPE slis_t_listheader ,
      te_listheader    TYPE slis_listheader ,
      te_layout        TYPE slis_layout_alv ,
      te_print         TYPE slis_print_alv ,
      te_variante      TYPE disvariant ,
      te_sort          TYPE slis_sortinfo_alv ,
      te_fieldcat      TYPE slis_fieldcat_alv ,
      ti_listheader    LIKE TABLE OF te_listheader ,
      t_tabela         TYPE TABLE OF ty_tabela ,
      t_campos         TYPE TABLE OF ty_tabela ,
      t_arquivo        TYPE TABLE OF ty_arquivo ,
      vg_tabela        TYPE ty_tabela ,
      vg_arquivo       TYPE ty_arquivo ,
      ti_tvarvc        TYPE TABLE OF tvarvc ,
      wa_tvarvc        TYPE tvarvc ,
      t_cols           TYPE TABLE OF ty_cols ,
      vg_fonts         TYPE ty_font ,
      vg_cols          TYPE ty_cols ,
      vg_excel         TYPE ole2_object ,
      vg_workbook      TYPE ole2_object ,
      vg_plan          TYPE ole2_object ,
      vg_sheets        TYPE ole2_object ,
      vg_cel           TYPE ole2_object ,
      vg_interior      TYPE ole2_object ,
      vg_column        TYPE ole2_object ,
      t_fonts          TYPE TABLE OF ty_font ,
      vg_font          TYPE ole2_object ,
      lv_memo          TYPE c LENGTH 020 VALUE space,
      lv_cursor        TYPE screen-name  VALUE space.
*______________________________________________________________________*
*   Declaração Eventos (Method) da CLASS
*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
    METHODS constructor.

    METHODS set_cursor
      IMPORTING
        !string TYPE string.

    METHODS get_cursor
      IMPORTING
        !memo   TYPE string.

    METHODS gera_xml
      IMPORTING
        value(tabela)     TYPE table
        value(screen_out) TYPE c      DEFAULT space
        value(path)       TYPE string OPTIONAL.

    METHODS move_para_tabela
      IMPORTING
        value(separador) TYPE c DEFAULT ';'
        value(usa_conversor) TYPE c DEFAULT space
      CHANGING
        value(dados) TYPE table .

    METHODS carrega_arquivo
      IMPORTING
        value(diretorio) TYPE string
        value(eliminar_linhas) TYPE numc2 DEFAULT 0
      EXPORTING
        value(subrc) TYPE subrc .

    METHODS salva_arquivo
      IMPORTING
        value(dados) TYPE table
        value(separador) TYPE string DEFAULT ';'
        value(usa_conversor) TYPE c DEFAULT space
        value(diretorio) TYPE string
      EXPORTING
        value(subrc) TYPE subrc .

    METHODS salva_em_csv
      IMPORTING
        value(dados) TYPE table
        value(diretorio) TYPE string
      EXPORTING
        value(subrc) TYPE subrc .

    METHODS salva_em_excel
      IMPORTING
        value(name) TYPE any DEFAULT 'PLAN_DADOS'
        value(dados) TYPE table
        value(usa_conversor) TYPE c DEFAULT space
        value(diretorio) TYPE string
      EXPORTING
        value(subrc) TYPE subrc .

    METHODS carrega_diretorio
      CHANGING
        value(diretorio) TYPE string .

    METHODS carrega_diretorio_in
      CHANGING
        value(diretorio) TYPE string .

    METHODS carrega_diretorio_out
      IMPORTING
        value(nome_do_arquivo)  TYPE string DEFAULT space
        value(tipo_do_arqruivo) TYPE string DEFAULT '.csv'
      CHANGING
        value(diretorio) TYPE string .

    METHODS carregar_data
      IMPORTING
        value(_name) TYPE string
      EXPORTING
        value(_value) TYPE any
        value(_subrc) TYPE subrc .

    METHODS carregar_range
      IMPORTING
        value(_name) TYPE string
      EXPORTING
        value(_range) TYPE table
        value(_subrc) TYPE subrc .

    METHODS processando
      IMPORTING
        !texto TYPE string OPTIONAL .

    METHODS reset_alv .

    METHODS add_fieldcat
      IMPORTING
        !i_string TYPE string .

    METHODS add_sort
      IMPORTING
        !i_string TYPE string .

    METHODS add_header
      IMPORTING
        !i_string TYPE string .

    METHODS f4_variants
      CHANGING
        !p_variant TYPE slis_vari .

    METHODS display_report
      IMPORTING
        !i_repid TYPE sy-repid
        !i_optimize TYPE c DEFAULT space
        !i_edit TYPE c DEFAULT space
        !i_print_info TYPE c DEFAULT 'X'
        !i_variant TYPE slis_vari DEFAULT space
        !i_pf_status TYPE slis_formname DEFAULT space
        !i_top_of_page TYPE slis_formname DEFAULT space
        !i_exit_top_of_page TYPE slis_formname DEFAULT space
        !i_exit_end_of_page TYPE slis_formname DEFAULT space
        !i_user_command TYPE slis_formname DEFAULT space
        !i_title TYPE lvc_title DEFAULT space
        !i_start_col TYPE i DEFAULT 0
        !i_start_row TYPE i DEFAULT 0
        !i_end_col TYPE i DEFAULT 0
        !i_end_row TYPE i DEFAULT 0
        !i_fieldname TYPE slis_fieldname DEFAULT space
        !i_tabname TYPE slis_tabname DEFAULT space
        !i_table TYPE table .

    METHODS open_excel
      IMPORTING
        value(name) TYPE any
        value(diretorio) TYPE string
      EXPORTING
        value(subrc) TYPE subrc .

    METHODS set_font
      IMPORTING
        value(code) TYPE any DEFAULT 'DATA'
        value(name) TYPE any DEFAULT 'Arial'
        value(size) TYPE any DEFAULT 10
        value(bold) TYPE any DEFAULT ' '
        value(italic) TYPE any DEFAULT ' '
        value(color) TYPE any DEFAULT 0
        value(bgcolor) TYPE any DEFAULT -4142 .

    METHODS use_font
      IMPORTING
        !format TYPE any .

    METHODS write_cell
      IMPORTING
        value(format) TYPE any DEFAULT 'DATA'
        value(row) TYPE any
        value(col) TYPE any
        value(value) TYPE any OPTIONAL
      EXPORTING
        value(subrc) TYPE subrc .

    METHODS freeze
      IMPORTING
        value(row) TYPE i
        value(col) TYPE i
      EXPORTING
        !subrc TYPE subrc .

    METHODS close_excel
      IMPORTING
        value(diretorio) TYPE string .

ENDCLASS.                    "cl_abap  DEFINITIO

*----------------------------------------------------------------------*
*       CLASS CL_ABAP IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_abap IMPLEMENTATION.

* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------
  METHOD constructor.

    DATA v_len TYPE i            VALUE 0.
    DATA v_c   TYPE c LENGTH 001 VALUE space.
    DATA v_n   TYPE n LENGTH 002 VALUE 0.

    FIELD-SYMBOLS:   TYPE ty_cols.

    v_len = STRLEN( sy-abcde ).

    CLEAR t_cols[].

* Cria as posições de colunas de "A" a "Z"
    DO v_len TIMES.

      v_n = sy-index - 1.

* Pega a letra referida (Ex.: "B" )
      APPEND INITIAL LINE TO t_cols ASSIGNING .
      -posic = sy-abcde+v_n(1).

    ENDDO.

* Cria as posições de colunas de "AA" até "ZZ"
    DO v_len TIMES.

      v_n = sy-index - 1.

* Pega a letra referida (Ex.: "B" )
      v_c = sy-abcde+v_n(1).

      DO v_len TIMES.

        v_n = sy-index - 1.

        APPEND INITIAL LINE TO t_cols ASSIGNING .

* Adiciona a segunda letra referida (Ex.: "BX")
        CONCATENATE v_c sy-abcde+v_n(1) INTO -posic.

      ENDDO.

    ENDDO.
*--> Resultado final é as colunas de: "A" até "ZZ"

*--> Define cinco tipos de formatos:
* Título
    me->set_font( EXPORTING code    = 'TITLE'
                            name    = 'Tahoma'
                            size    = 18
                            bold    = 'X'
                            italic  = 'X'
                            color   = 2
                            bgcolor = 41 ).

* Cabeçalho
    me->set_font( EXPORTING code    = 'HEADER'
                            name    = 'Arial'
                            size    = 14
                            bold    = ' '
                            italic  = 'X'
                            color   = 0
                            bgcolor = 40 ).

* Dados
    me->set_font( EXPORTING code    = 'KEY'
                            name    = 'Courier'
                            size    = 10
                            bold    = 'X'
                            italic  = ' '
                            color   = 1
                            bgcolor = 4 ).

    me->set_font( EXPORTING code    = 'DATA'
                            name    = 'Courier'
                            size    = 10
                            bold    = 'X'
                            italic  = ' '
                            color   = 0 ""41
                            bgcolor = -4142 ).

* Subtotal
    me->set_font( EXPORTING code    = 'SUB'
                            name    = 'Times New Roman'
                            size    = 10
                            bold    = ' '
                            italic  = ' '
                            color   = 1
                            bgcolor = 36 ).

* Total.
    me->set_font( EXPORTING code    = 'TOTAL'
                            name    = 'Times New Roman'
                            size    = 10
                            bold    = 'X'
                            italic  = ' '
                            color   = 1
                            bgcolor = 6 ).

  ENDMETHOD.                    "constructor

* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->SET_CURSOR
* +-------------------------------------------------------------------------------------------------+
* | [--->] STRING                         TYPE        STRING
* +--------------------------------------------------------------------------------------
  METHOD set_cursor.

    CLEAR: lv_memo, lv_cursor.

    SPLIT string AT '|' INTO lv_memo lv_cursor.
    IF ( NOT ( lv_memo   IS INITIAL ) AND
         NOT ( lv_cursor IS INITIAL ) ).

      FREE MEMORY ID lv_memo.

      EXPORT m_cursor = lv_cursor TO MEMORY ID lv_memo.
      MESSAGE s055(00) DISPLAY LIKE 'E'.

    ENDIF.

  ENDMETHOD.                    "set_cursor

* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->GET_CURSOR
* +-------------------------------------------------------------------------------------------------+
* | [--->] MEMO                           TYPE        STRING
* | [<-->] XML                            TYPE        TABLE
* +--------------------------------------------------------------------------------------
  METHOD get_cursor.

    CLEAR: lv_memo, lv_cursor.

    lv_memo = memo.

    IMPORT m_cursor = lv_cursor FROM MEMORY ID lv_memo.
    IF ( lv_cursor <> space ).
      SET CURSOR FIELD lv_cursor.
    ENDIF.

    FREE MEMORY ID lv_memo.

  ENDMETHOD.                    "get_cursor

* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->GERA_XML
* +-------------------------------------------------------------------------------------------------+
* | [--->] TABELA                         TYPE        TABLE
* | [<-->] XML                            TYPE        TABLE
* +--------------------------------------------------------------------------------------
  METHOD gera_xml.

*>>> Declaração de Variavei, Tab.Interna e outros Objetos Locais
    TYPES:
      BEGIN OF ty_screen,
        line         TYPE c LENGTH 2000,
      END   OF ty_screen.

    DATA:
      vl_from        TYPE string,
      vl_to          TYPE string,
      vl_string      TYPE string,
      vl_tabix       TYPE sy-tabix,
      vl_campos      TYPE ty_tabela,
      vl_type        TYPE c LENGTH 001,
      vl_line        TYPE n LENGTH 015,
      vl_data        TYPE c LENGTH 010,
      vl_hora        TYPE c LENGTH 008,
      vl_pos         TYPE n LENGTH 001,
      vl_names       TYPE sydes_nameinfo,
      tl_xml         TYPE TABLE OF string,
      tl_screen      TYPE TABLE OF ty_screen,
      tl_table       TYPE sydes_desc.

    FIELD-SYMBOLS:
              TYPE ANY,
             TYPE ANY,
            TYPE ANY,
              TYPE ANY,
          LIKE LINE OF tl_screen.

    IF ( screen_out = space AND path IS INITIAL ).
      MESSAGE s398(00) WITH 'Falta o caminho' '(diretório) e' 'arquivo!' space DISPLAY LIKE 'E'.
      RETURN.
    ENDIF.

    GET TIME.
    WRITE sy-datum TO vl_data USING EDIT MASK '__/__/____'.
    WRITE sy-uzeit TO vl_hora USING EDIT MASK '__:__:__'.

*>>> Lista os campos da tabela interna do parâmetro de entrada
    FREE tl_table.
    DESCRIBE FIELD tabela INTO tl_table.
    IF ( tl_table IS INITIAL ).
      RETURN.
    ENDIF.

    DELETE tl_table-names WHERE name+0(2) = '=='.
    DELETE ADJACENT DUPLICATES FROM tl_table-names
                          COMPARING name.
    DELETE tl_table-names FROM 1 TO 2.

    CLEAR: t_campos[].
    LOOP AT tl_table-names INTO vl_names.

      SEARCH vl_names-name FOR '-' IN CHARACTER MODE.
      CHECK ( sy-subrc <> 0 ).

      APPEND vl_names-name TO t_campos.

    ENDLOOP.

    IF ( t_campos[] IS INITIAL ).
      RETURN.
    ENDIF.

*>>> Adiciona a TAG de identificação do arquivo
    APPEND INITIAL LINE TO tl_xml ASSIGNING .
    CONCATENATE
      '' INTO .

*>>> Adiciona a TAG de início de arquivo
    APPEND INITIAL LINE TO tl_xml ASSIGNING .
     =''.

    LOOP AT tabela ASSIGNING .

      vl_line = sy-tabix.

*>>> Adiciona a TAG de início de registro
      APPEND INITIAL LINE TO tl_xml ASSIGNING .
      CONCATENATE '' INTO .

*>>> Processo dinâmico da captura da campos
      LOOP AT t_campos INTO vl_campos.

        vl_tabix = sy-tabix.

        CLEAR vl_from.
        vl_from = vl_campos.

        CLEAR vl_from.
        CONCATENATE '-' vl_campos-campo INTO vl_from.
        CONDENSE vl_from NO-GAPS.

        ASSIGN (vl_from) TO .
        CHECK (  IS ASSIGNED ).

        vl_to = .
        UNASSIGN .

*>>> Adiciona os dados ao XML
        APPEND INITIAL LINE TO tl_xml ASSIGNING .
        CONCATENATE  '<' vl_campos '>' vl_to '' INTO .

      ENDLOOP.  "<<< t_tabela[]

      APPEND INITIAL LINE TO tl_xml ASSIGNING .
      CONCATENATE '' INTO .

    ENDLOOP.  "<<< ti_arquivo[]

    APPEND INITIAL LINE TO tl_xml ASSIGNING .
     = ''.

    APPEND INITIAL LINE TO tl_xml ASSIGNING .
     = ''.

    IF NOT ( tl_xml[] IS INITIAL ).

      IF ( screen_out = space ).

        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            filename                = path
            filetype                = 'ASC'
          TABLES
            data_tab                = tl_xml
          EXCEPTIONS
            file_write_error        = 1
            no_batch                = 2
            gui_refuse_filetransfer = 3
            invalid_type            = 4
            no_authority            = 5
            unknown_error           = 6
            header_not_allowed      = 7
            separator_not_allowed   = 8
            filesize_not_allowed    = 9
            header_too_long         = 10
            dp_error_create         = 11
            dp_error_send           = 12
            dp_error_write          = 13
            unknown_dp_error        = 14
            access_denied           = 15
            dp_out_of_memory        = 16
            disk_full               = 17
            dp_timeout              = 18
            file_not_found          = 19
            dataprovider_exception  = 20
            control_flush_error     = 21
            OTHERS                  = 22.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid
                TYPE 'S'
              NUMBER sy-msgno
                WITH sy-msgv1
                     sy-msgv2
                     sy-msgv3
                     sy-msgv4 DISPLAY LIKE sy-msgty.
        ENDIF.

      ELSE.

        vl_pos = 2.
        LOOP AT tl_xml INTO vl_string.

          vl_tabix = sy-tabix.

          APPEND INITIAL LINE TO tl_screen ASSIGNING .
          CASE vl_tabix.

            WHEN 1.
              -line = vl_string.

            WHEN 2.
              -line+vl_pos = vl_string.
              ADD 3 TO vl_pos.

            WHEN 3.
              -line+vl_pos = vl_string.
              ADD 3 TO vl_pos.

            WHEN OTHERS.
              IF ( vl_string+0(2) = '-line = vl_string.
                ELSE.
                  SUBTRACT 3 FROM vl_pos.
                  -line+vl_pos = vl_string.
                ENDIF.
              ELSE.
                -line+vl_pos = vl_string.
                IF ( vl_pos = 5 ).
                  ADD 3 TO vl_pos.
                ENDIF.
              ENDIF.

          ENDCASE.

        ENDLOOP.

        EDITOR-CALL FOR tl_screen TITLE 'Arquivo XML' DISPLAY-MODE.

      ENDIF.

    ENDIF.

  ENDMETHOD.                    "gera_xml

* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->ADD_FIELDCAT
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_STRING                       TYPE        STRING
* +--------------------------------------------------------------------------------------
  METHOD add_fieldcat.

    DATA:
      vl_string    TYPE string     VALUE space,
      vl_table     TYPE string     VALUE space,
      vl_field     TYPE string     VALUE space,
      vl_curow     TYPE string,
      vl_cucol     TYPE n LENGTH 003 VALUE 0.
*      te_fieldcat  LIKE slis_t_fieldcat_alv.

    CLEAR:
      vl_string,
      vl_table,
      vl_field,
      te_fieldcat.

    DESCRIBE TABLE ti_fieldcat LINES vl_cucol.
    IF ( vl_cucol = 0 ).
      vl_cucol = 1.
    ENDIF.

    SPLIT i_string
       AT '|'
     INTO vl_cucol                 "... Posição da Coluna
          te_fieldcat-fix_column   "... Coluna Fixa
          vl_string                "... Tabela e Campo
          te_fieldcat-inttype      "... Tipo
          te_fieldcat-outputlen    "... Tamanho da Coluna
          te_fieldcat-just         "... Alinhamento
          te_fieldcat-reptext_ddic "... Titulo da Coluna
          te_fieldcat-hotspot      "... Coluna Secitiva
          te_fieldcat-checkbox     "... Coluna de Marcação
          te_fieldcat-icon         "... Coluna de Icone
          te_fieldcat-symbol       "... Coluna de Simbolo
          te_fieldcat-do_sum       "... Coluna com Total
          te_fieldcat-no_out       "... Coluna Oculta
          te_fieldcat-edit.        "... Coluna Editavel

    SPLIT vl_string AT '-' INTO vl_table vl_field.

    te_fieldcat-row_pos   = vl_curow. "... Posição da Linha
    te_fieldcat-col_pos   = vl_cucol. "... Posição da Coluna
    te_fieldcat-tabname   = vl_table. "... Tabela
    te_fieldcat-fieldname = vl_field. "... Campo

*    "... Quando for uma coluna de edição é uma entrada
*    IF ( te_fieldcat-edit <> space ).
*      te_fieldcat-input = 'X'.
*    ENDIF.

    APPEND te_fieldcat TO ti_fieldcat.

  ENDMETHOD.                    "add_fieldcat


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->ADD_HEADER
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_STRING                       TYPE        STRING
* +--------------------------------------------------------------------------------------
  METHOD add_header.

    CLEAR te_listheader.

    SPLIT i_string
       AT '|'
     INTO te_listheader-typ
          te_listheader-key
          te_listheader-info.

    APPEND te_listheader TO ti_listheader.

  ENDMETHOD.                    "add_header


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->ADD_SORT
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_STRING                       TYPE        STRING
* +--------------------------------------------------------------------------------------
  METHOD add_sort.

    DATA:
      vl_string  TYPE string VALUE space,
      vl_table   TYPE string VALUE space,
      vl_field   TYPE string VALUE space.

    CLEAR:
      vl_string,
      vl_table,
      vl_field,
      te_sort.

    SPLIT i_string
       AT '|'
     INTO te_sort-spos            "... Posição de Ordenação
          vl_string               "... Tabela e Campo
          te_sort-up              "... Ordenação Cresente
          te_sort-down            "... Ordenação Decresente
          te_sort-group           "... Agrupamento pelo Campo
          te_sort-subtot.         "... Coluna de SubTotais

    SPLIT vl_string AT '-' INTO vl_table vl_field.

    te_sort-tabname   = vl_table. "... Tabela
    te_sort-fieldname = vl_field. "... Campo

    APPEND te_sort TO ti_sort.

  ENDMETHOD.                    "add_sort


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->CARREGAR_DATA
* +-------------------------------------------------------------------------------------------------+
* | [--->] _NAME                          TYPE        STRING
* | [<---] _VALUE                         TYPE        ANY
* | [<---] _SUBRC                         TYPE        SUBRC
* +--------------------------------------------------------------------------------------
  METHOD carregar_data.

    SELECT SINGLE * INTO wa_tvarvc
                    FROM tvarvc
                   WHERE name = _name
                     AND type = c_param.
    IF sy-subrc <> 0.
      MESSAGE s398(00)
         WITH 'Parâmetro' _name 'não encontrado' space
         DISPLAY LIKE 'E'.
      _subrc = 4.
      EXIT.
    ENDIF.

    _subrc = 0.

    _value = wa_tvarvc-low.

  ENDMETHOD.                    "CARREGAR_DATA


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->CARREGAR_RANGE
* +-------------------------------------------------------------------------------------------------+
* | [--->] _NAME                          TYPE        STRING
* | [<---] _RANGE                         TYPE        TABLE
* | [<---] _SUBRC                         TYPE        SUBRC
* +--------------------------------------------------------------------------------------
  METHOD carregar_range.

    DATA d_ref TYPE REF TO data.

    FIELD-SYMBOLS: <_range> TYPE ANY,
                   <_field> TYPE ANY.

    CREATE DATA d_ref LIKE LINE OF _range.
    ASSIGN d_ref->* TO <_range>.

    SELECT * INTO TABLE ti_tvarvc
                   FROM tvarvc
                  WHERE name = _name
                    AND type = c_range.
    IF ( ti_tvarvc[] IS INITIAL ).
      MESSAGE s398(00)
         WITH 'Parâmetro' _name 'não encontrado' space
         DISPLAY LIKE 'E'.
      _subrc = 4.
      EXIT.
    ENDIF.

    _subrc = 0.

    LOOP AT ti_tvarvc INTO wa_tvarvc.

      ASSIGN COMPONENT 'SIGN' OF STRUCTURE <_range> TO <_field>.
      IF sy-subrc = 0.
        <_field> = wa_tvarvc-sign.
      ENDIF.

      ASSIGN COMPONENT 'OPTION' OF STRUCTURE <_range> TO <_field>.
      IF sy-subrc = 0.
        <_field> = wa_tvarvc-opti.
      ENDIF.

      ASSIGN COMPONENT 'LOW' OF STRUCTURE <_range> TO <_field>.
      IF sy-subrc = 0.
        <_field> = wa_tvarvc-low.
      ENDIF.

      ASSIGN COMPONENT 'HIGH' OF STRUCTURE <_range> TO <_field>.
      IF sy-subrc = 0.
        <_field> = wa_tvarvc-high.
      ENDIF.

      APPEND <_range> TO _range.

    ENDLOOP.

  ENDMETHOD.                    "CARREGAR_RANGE


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->CARREGA_ARQUIVO
* +-------------------------------------------------------------------------------------------------+
* | [--->] DIRETORIO                      TYPE        STRING
* | [--->] ELIMINAR_LINHAS                TYPE        NUMC2 (default =0)
* | [<---] SUBRC                          TYPE        SUBRC
* +--------------------------------------------------------------------------------------
  METHOD carrega_arquivo.

    CLEAR t_arquivo[].
    CALL FUNCTION 'GUI_UPLOAD'
      EXPORTING
        filename                = diretorio
        filetype                = 'ASC'
      TABLES
        data_tab                = t_arquivo[]
      EXCEPTIONS
        file_open_error         = 1
        file_read_error         = 2
        no_batch                = 3
        gui_refuse_filetransfer = 4
        invalid_type            = 5
        no_authority            = 6
        unknown_error           = 7
        bad_data_format         = 8
        header_not_allowed      = 9
        separator_not_allowed   = 10
        header_too_long         = 11
        unknown_dp_error        = 12
        access_denied           = 13
        dp_out_of_memory        = 14
        disk_full               = 15
        dp_timeout              = 16
        OTHERS                  = 17.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid
            TYPE 'S'
          NUMBER sy-msgno
            WITH sy-msgv1
                 sy-msgv2
                 sy-msgv3
                 sy-msgv4 DISPLAY LIKE sy-msgty.
      subrc = 4.
      EXIT.
    ENDIF.

    IF ( t_arquivo[] IS INITIAL ).
      MESSAGE s208(00)
         WITH 'Não ha dados para carga!' DISPLAY LIKE 'E'.
      subrc = 4.
      EXIT.
    ENDIF.

*>>> Elimina as 5 primeiras linhas da tabela interna
    IF ( eliminar_linhas > 0 ).
      DELETE t_arquivo FROM 1 TO eliminar_linhas.
    ENDIF.

    IF ( t_arquivo[] IS INITIAL ).
      MESSAGE s208(00)
         WITH 'Não ha dados para carga!' DISPLAY LIKE 'E'.
      subrc = 4.
      EXIT.
    ENDIF.

    subrc = 0.

  ENDMETHOD.                    "carrega_arquivo


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->CARREGA_DIRETORIO
* +-------------------------------------------------------------------------------------------------+
* | [<-->] DIRETORIO                      TYPE        STRING
* +--------------------------------------------------------------------------------------
  METHOD carrega_diretorio.

    DATA:
      vl_rc          TYPE i,
      tl_file        TYPE TABLE OF file_table,
      vl_file        TYPE file_table.

    IF ( diretorio IS INITIAL ).
      CALL METHOD cl_gui_frontend_services=>get_sapgui_workdir
        CHANGING
          sapworkdir = diretorio.
    ENDIF.

    CALL METHOD cl_gui_frontend_services=>directory_browse
      EXPORTING
        window_title         = 'Diretórios'
        initial_folder       = diretorio
      CHANGING
        selected_folder      = diretorio
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4.
    IF ( sy-subrc EQ 0 ).
      CONCATENATE diretorio '' INTO diretorio.
    ENDIF.

  ENDMETHOD.                    "CARREGA_DIRETORIO_IN


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->CARREGA_DIRETORIO_IN
* +-------------------------------------------------------------------------------------------------+
* | [<-->] DIRETORIO                      TYPE        STRING
* +--------------------------------------------------------------------------------------
  METHOD carrega_diretorio_in.

    DATA:
      vl_rc          TYPE i,
      tl_file        TYPE TABLE OF file_table,
      vl_file        TYPE file_table.

    IF ( diretorio IS INITIAL ).
      CALL METHOD cl_gui_frontend_services=>get_sapgui_workdir
        CHANGING
          sapworkdir = diretorio.
    ENDIF.

    CALL METHOD cl_gui_frontend_services=>file_open_dialog
      EXPORTING
        window_title            = 'Arquivo de carga de dados'
        default_extension       = '.txt'
        file_filter             = '*.*'
        initial_directory       = diretorio
      CHANGING
        file_table              = tl_file[]
        rc                      = vl_rc
      EXCEPTIONS
        file_open_dialog_failed = 1
        cntl_error              = 2
        error_no_gui            = 3
        OTHERS                  = 4.
    IF sy-subrc = 0.

      READ TABLE tl_file INTO vl_file INDEX 1.
      CHECK sy-subrc IS INITIAL.
      MOVE vl_file-filename TO diretorio.

    ENDIF.

  ENDMETHOD.                    "CARREGA_DIRETORIO_IN


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->CARREGA_DIRETORIO_OUT
* +-------------------------------------------------------------------------------------------------+
* | [--->] NOME_DO_ARQUIVO                TYPE        STRING (default =SPACE)
* | [--->] TIPO_DO_ARQRUIVO               TYPE        STRING (default =.CSV
* | [<-->] DIRETORIO                      TYPE        STRING
* +--------------------------------------------------------------------------------------
  METHOD carrega_diretorio_out.

    DATA:
      tipo             TYPE  string,
      filename         TYPE  string,
      path             TYPE  string,
      fullpath         TYPE  string,
      workdir          TYPE  string,
      user_action      TYPE  i.

    IF ( diretorio IS INITIAL ).
      CALL METHOD cl_gui_frontend_services=>get_sapgui_workdir
        CHANGING
          sapworkdir = diretorio.
    ENDIF.

    IF ( nome_do_arquivo IS INITIAL ).
      CONCATENATE 'D'
                  sy-datum
                  'H'
                  sy-uzeit
             INTO nome_do_arquivo.
    ENDIF.

    CONCATENATE '*' tipo_do_arqruivo INTO tipo.

    CONCATENATE nome_do_arquivo tipo_do_arqruivo INTO filename.
    path = diretorio.

    CALL METHOD cl_gui_frontend_services=>file_save_dialog
      EXPORTING
        window_title         = 'Download de dados'
        initial_directory    = workdir
        default_extension    = tipo
        default_file_name    = filename
        file_filter          = tipo
        prompt_on_overwrite  = 'X'
      CHANGING
        filename             = filename
        path                 = path
        fullpath             = fullpath
        user_action          = user_action
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid
            TYPE 'S'
          NUMBER sy-msgno
            WITH sy-msgv1
                 sy-msgv2
                 sy-msgv3
                 sy-msgv4 DISPLAY LIKE sy-msgty.
      EXIT.
    ENDIF.

    IF user_action <> cl_gui_frontend_services=>action_ok.
      MESSAGE s208(00) WITH 'Ação não pode ser executada!' DISPLAY LIKE 'E'.
      EXIT.
    ENDIF.

    diretorio = fullpath.

  ENDMETHOD.                    "CARREGA_DIRETORIO_OUT


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->CLOSE_EXCEL
* +-------------------------------------------------------------------------------------------------+
* | [--->] DIRETORIO                      TYPE        STRING
* +--------------------------------------------------------------------------------------
  METHOD close_excel.

*** Exibe o report gerado
    SET PROPERTY OF vg_excel 'Visible' = 0.

    GET PROPERTY OF vg_excel 'ActiveWorkbook' = vg_workbook.

    CALL METHOD OF vg_workbook 'SaveAs' EXPORTING #1 = diretorio.
    CALL METHOD OF vg_excel 'Quit'.

*** Libera da memória os objetos criados.
    FREE OBJECT vg_sheets.
    FREE OBJECT vg_workbook.
    FREE OBJECT vg_excel.

    CLEAR: vg_sheets, vg_workbook, vg_excel.

  ENDMETHOD.                    "close_excel


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->DISPLAY_REPORT
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_REPID                        TYPE        SY-REPID
* | [--->] I_OPTIMIZE                     TYPE        C (default =SPACE)
* | [--->] I_EDIT                         TYPE        C (default =SPACE)
* | [--->] I_PRINT_INFO                   TYPE        C (default ='X')
* | [--->] I_VARIANT                      TYPE        SLIS_VARI (default =SPACE)
* | [--->] I_PF_STATUS                    TYPE        SLIS_FORMNAME (default =SPACE)
* | [--->] I_TOP_OF_PAGE                  TYPE        SLIS_FORMNAME (default =SPACE)
* | [--->] I_EXIT_TOP_OF_PAGE             TYPE        SLIS_FORMNAME (default =SPACE)
* | [--->] I_EXIT_END_OF_PAGE             TYPE        SLIS_FORMNAME (default =SPACE)
* | [--->] I_USER_COMMAND                 TYPE        SLIS_FORMNAME (default =SPACE)
* | [--->] I_TITLE                        TYPE        LVC_TITLE (default =SPACE)
* | [--->] I_START_COL                    TYPE        I (default =0)
* | [--->] I_START_ROW                    TYPE        I (default =0)
* | [--->] I_END_COL                      TYPE        I (default =0)
* | [--->] I_END_ROW                      TYPE        I (default =0)
* | [--->] I_FIELDNAME                    TYPE        SLIS_FIELDNAME (default =SPACE)
* | [--->] I_TABNAME                      TYPE        SLIS_TABNAME (default =SPACE)
* | [--->] I_TABLE                        TYPE        TABLE
* +--------------------------------------------------------------------------------------
  METHOD display_report.

    CLEAR v_flag.

    te_layout-expand_all        = 'X'.
    te_layout-colwidth_optimize = i_optimize.
    te_layout-edit              = i_edit.
    te_layout-box_fieldname     = i_fieldname.
    te_layout-box_tabname       = i_tabname.

    te_variante-variant         = i_variant.

    te_print-no_print_listinfos = i_print_info.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        i_callback_program          = i_repid
        i_callback_top_of_page      = i_top_of_page
        i_callback_html_top_of_page = i_exit_top_of_page
        i_callback_html_end_of_list = i_exit_end_of_page
        i_callback_pf_status_set    = i_pf_status
        i_callback_user_command     = i_user_command
        it_fieldcat                 = ti_fieldcat[]
        is_layout                   = te_layout
        it_sort                     = ti_sort[]
        i_default                   = 'X'
        i_save                      = 'A'
        is_variant                  = te_variante
        is_print                    = te_print
        i_grid_title                = i_title
        i_screen_start_column       = i_start_col
        i_screen_start_line         = i_start_row
        i_screen_end_column         = i_end_col
        i_screen_end_line           = i_end_row
      TABLES
        t_outtab                    = i_table
      EXCEPTIONS
        program_error               = 1
        OTHERS                      = 2.

  ENDMETHOD.                    "display_report


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->F4_VARIANTS
* +-------------------------------------------------------------------------------------------------+
* | [<-->] P_VARIANT                      TYPE        SLIS_VARI
* +--------------------------------------------------------------------------------------
  METHOD f4_variants.

    DATA:
      vl_variant_exit TYPE c LENGTH 001 VALUE space,
      vl_variant      TYPE disvariant,
      vl_def_variant  TYPE disvariant.

    CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
      EXPORTING
        is_variant    = vl_variant
        i_save        = 'A'
      IMPORTING
        e_exit        = vl_variant_exit
        es_variant    = vl_def_variant
      EXCEPTIONS
        not_found     = 1
        program_error = 2
        OTHERS        = 3.
    IF sy-subrc IS INITIAL.

      IF vl_variant_exit = space.
        p_variant = vl_def_variant-variant.
      ENDIF.

    ELSE.

      CASE sy-subrc.
        WHEN 1.
          MESSAGE s208(00)
             WITH 'Não ha variantes salvas para este programa.'
             DISPLAY LIKE 'W'.
        WHEN 2.
          MESSAGE s208(00)
             WITH 'Erro ao tentar localizar as variantes.'
             DISPLAY LIKE 'E'.
        WHEN OTHERS.
          MESSAGE s208(00)
             WITH 'Verifique se existem variantes para este programa.'
             DISPLAY LIKE 'W'.
      ENDCASE.

    ENDIF.

  ENDMETHOD.                    "f4_variants


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->FREEZE
* +-------------------------------------------------------------------------------------------------+
* | [--->] ROW                            TYPE        I
* | [--->] COL                            TYPE        I
* | [<---] SUBRC                          TYPE        SUBRC
* +--------------------------------------------------------------------------------------
  METHOD freeze.

    DATA cel TYPE string.

    READ TABLE t_cols INTO vg_cols INDEX col.
    IF ( sy-subrc <> 0 ).
      subrc = 4.
    ENDIF.
    subrc = 0.

    FREE cel.
    cel = row.
    CONCATENATE cel vg_cols-posic INTO cel.
    CONDENSE cel.

* Obtem a planilha ativa
    GET PROPERTY OF vg_excel 'ActiveWindow' = vg_sheets.

* Seleciona a linha para fixar
    CALL METHOD OF vg_excel 'RANGE' = vg_cel
      EXPORTING
      #1 = cel.

    CALL METHOD OF vg_cel 'Select'.

* Congela (fixa) o cabeçalho (exibição)
    SET PROPERTY OF vg_sheets 'FreezePanes' = 1.

  ENDMETHOD.                    "freeze


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->MOVE_PARA_TABELA
* +-------------------------------------------------------------------------------------------------+
* | [--->] SEPARADOR                      TYPE        C (default =';')
* | [--->] USA_CONVERSOR                  TYPE        C (default =SPACE)
* | [<-->] DADOS                          TYPE        TABLE
* +--------------------------------------------------------------------------------------
  METHOD move_para_tabela.

*>>> Declaração de Variavei, Tab.Interna e outros Objetos Locais
    DATA:
      vl_from        TYPE string,
      vl_to          TYPE string,
      vl_tabix       TYPE sy-tabix,
      vl_campos      TYPE string,
      vl_type        TYPE c LENGTH 001,
      vl_names       TYPE sydes_nameinfo,
      tl_table       TYPE sydes_desc.

    FIELD-SYMBOLS:
            TYPE ANY,
            TYPE string,
              TYPE ANY.

*>>> Lista os campos da tabela interna do parâmetro de entrada
    CLEAR: t_tabela[].
    FREE tl_table.
    DESCRIBE FIELD dados INTO tl_table.
    IF NOT ( tl_table IS INITIAL ).

      DELETE tl_table-names WHERE name+0(2) = '=='.
      DELETE ADJACENT DUPLICATES FROM tl_table-names
                            COMPARING name.
      DELETE tl_table-names FROM 1 TO 2.

      LOOP AT tl_table-names INTO vl_names.

        SEARCH vl_names-name FOR '-' IN CHARACTER MODE.
        CHECK ( sy-subrc <> 0 ).

        APPEND vl_names-name TO t_tabela.

      ENDLOOP.

    ENDIF.

*>>> Inicia o processo de movimentação de dados
    CLEAR dados[].
    LOOP AT t_arquivo INTO vg_arquivo.

      APPEND INITIAL LINE TO dados ASSIGNING .

      CLEAR t_campos[].
      SPLIT vg_arquivo-linha AT separador INTO TABLE t_campos.

*>>> Processo dinâmico da captura da campos
      LOOP AT t_campos INTO vl_campos.

        vl_tabix = sy-tabix.

        CLEAR vl_from.
        vl_from = vl_campos.

        READ TABLE t_tabela INTO vg_tabela INDEX vl_tabix.
        CHECK sy-subrc = 0.

        CLEAR vl_to.
        CONCATENATE '-' vg_tabela-campo INTO vl_to.
        CONDENSE vl_to NO-GAPS.

        ASSIGN (vl_to) TO .
        CHECK (  IS ASSIGNED ).

        IF ( usa_conversor <> space ).
          CLEAR vl_type.
          DESCRIBE FIELD  TYPE vl_type.
          CASE vl_type.
            WHEN 'P'.  "... Valor com Decimais
              TRANSLATE vl_from USING '. '.
              TRANSLATE vl_from USING ',.'.
              CONDENSE vl_from NO-GAPS.
            WHEN 'D'.  "... Data
              TRANSLATE vl_from USING '/.'.
              TRANSLATE vl_from USING '-.'.
          ENDCASE.
        ENDIF.

         = vl_from.

        UNASSIGN .

      ENDLOOP.  "<<< t_tabela[]

    ENDLOOP.  "<<< ti_arquivo[]

  ENDMETHOD.                    "move_para_tabela


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->OPEN_EXCEL
* +-------------------------------------------------------------------------------------------------+
* | [--->] NAME                           TYPE        ANY
* | [--->] DIRETORIO                      TYPE        STRING
* | [<---] SUBRC                          TYPE        SUBRC
* +--------------------------------------------------------------------------------------
  METHOD open_excel.

*** Inicializando Excel
    CREATE OBJECT vg_excel 'EXCEL.APPLICATION'.
    IF NOT sy-subrc IS INITIAL.
      subrc = 4.
      EXIT.       "Não pôde inicializar o MS Excel.
    ENDIF.
    subrc = 0.

*** Oculta, para economizar tempo e memória
    SET PROPERTY OF vg_excel  'Visible' = 0.

*** Desabilita os alertas do excel
    SET PROPERTY OF vg_excel 'DisplayAlerts' = 0.

*** Define a pasta de trabalho atual.
    CALL METHOD OF vg_excel 'Workbooks' = vg_workbook.

*** Adiciona a pasta (workbook)
    CALL METHOD OF vg_workbook 'Add' = vg_plan
      EXPORTING
      #1 = 1.

*** Nomeia a planilha
    CALL METHOD OF vg_excel 'Sheets' = vg_sheets
      EXPORTING
      #1 = 1.
    SET PROPERTY OF vg_sheets 'Name' = name.

  ENDMETHOD.                    "OPEN_EXCEL


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->PROCESSANDO
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------
  METHOD processando.

    DATA:
      vl_hora        TYPE c LENGTH 008 VALUE space,
      vl_texto       TYPE string.

    GET TIME.
    WRITE sy-uzeit TO vl_hora.

    CONCATENATE vl_hora texto 'Processando...' INTO vl_texto SEPARATED BY space.

    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        text = vl_texto.

  ENDMETHOD.                    "processando


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->RESET_ALV
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------
  METHOD reset_alv.

    FREE    ti_fieldcat.
    REFRESH ti_fieldcat.
    CLEAR   ti_fieldcat.

    FREE    ti_listheader.
    REFRESH ti_listheader.
    CLEAR   ti_listheader.

    FREE    ti_sort.
    REFRESH ti_sort.
    CLEAR   ti_sort.

    FREE    ti_linecolor.
    REFRESH ti_linecolor.
    CLEAR   ti_linecolor.

  ENDMETHOD.                    "reset_alv


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->SALVA_ARQUIVO
* +-------------------------------------------------------------------------------------------------+
* | [--->] DADOS                          TYPE        TABLE
* | [--->] SEPARADOR                      TYPE        STRING (default =';')
* | [--->] USA_CONVERSOR                  TYPE        C (default =SPACE)
* | [--->] DIRETORIO                      TYPE        STRING
* | [<---] SUBRC                          TYPE        SUBRC
* +--------------------------------------------------------------------------------------
  METHOD salva_arquivo.

*>>> Declaração de Variavei, Tab.Interna e outros Objetos Locais
    TYPES:
      BEGIN OF ty_arquivo,
        linha        TYPE string,
      END   OF ty_arquivo.

    DATA:
      vl_linha       TYPE string,
      vl_to          TYPE string,
      vl_tabix       TYPE sy-tabix,
      vl_campo       TYPE string,
      vl_string      TYPE c LENGTH 2000  VALUE space,
      vl_filetype    TYPE c LENGTH 010   VALUE 'ASC',
      vl_separator   TYPE c LENGTH 001   VALUE space,
      vl_len         TYPE n LENGTH 006,
      vl_type        TYPE c LENGTH 001,
      vl_data        TYPE c LENGTH 010,
      vl_names       TYPE sydes_nameinfo,
      tl_table       TYPE sydes_desc,
      tl_arquivo     TYPE TABLE OF ty_arquivo.

    FIELD-SYMBOLS:
         TYPE ty_arquivo,
            TYPE ANY,
              TYPE ANY.

*>>> Lista os campos da tabela interna do parâmetro de entrada
    CLEAR: t_tabela[].
    FREE tl_table.
    DESCRIBE FIELD dados INTO tl_table.
    IF NOT ( tl_table IS INITIAL ).

      DELETE tl_table-names WHERE name+0(2) = '=='.
      DELETE ADJACENT DUPLICATES FROM tl_table-names
                            COMPARING name.
      DELETE tl_table-names FROM 1 TO 2.

      LOOP AT tl_table-names INTO vl_names.

        SEARCH vl_names-name FOR '-' IN CHARACTER MODE.
        CHECK ( sy-subrc <> 0 ).

        APPEND vl_names-name TO t_tabela.

      ENDLOOP.

    ENDIF.

*>>> Inicia o processo de movimentação de dados
    LOOP AT dados ASSIGNING .

*>>> Processo dinâmico da captura da campos
      CLEAR vl_linha.
      FREE  vl_linha.
      LOOP AT t_tabela INTO vg_tabela.

        vl_tabix = sy-tabix.

        CLEAR vl_to.
        CONCATENATE '-' vg_tabela-campo INTO vl_to.
        CONDENSE vl_to NO-GAPS.

        ASSIGN (vl_to) TO .
        CHECK (  IS ASSIGNED ).

        FREE vl_campo.
        vl_campo = .

        DESCRIBE FIELD  OUTPUT-LENGTH vl_len.

        IF ( usa_conversor <> space ).
          CLEAR vl_type.
          DESCRIBE FIELD  TYPE vl_type.
          CASE vl_type.
            WHEN 'P'.  "... Valor com Decimais
              TRANSLATE vl_campo USING '.,'.
              CONDENSE vl_campo NO-GAPS.
            WHEN 'D'.  "... Data
              CLEAR vl_data.
              WRITE  TO vl_data USING EDIT MASK '__/__/____'.
              CLEAR vl_campo. FREE vl_campo.
              vl_campo = vl_data.
          ENDCASE.
        ENDIF.

        UNASSIGN .

        IF ( vl_tabix = 1 ).
          IF ( separador <> ';' ).
            WRITE vl_campo TO vl_string+0(vl_len).
            vl_linha = vl_string+0(vl_len).
          ELSE.
            vl_linha = vl_campo.
          ENDIF.
        ELSE.
          IF ( separador <> ';' ).
            WRITE vl_campo TO vl_string+0(vl_len).
            CONCATENATE vl_linha separador vl_string+0(vl_len) INTO vl_linha.
          ELSE.
            CONCATENATE vl_linha separador vl_campo INTO vl_linha.
          ENDIF.
        ENDIF.

      ENDLOOP.  "<<< t_tabela[]

      CHECK NOT ( vl_linha IS INITIAL ).

      APPEND INITIAL LINE TO tl_arquivo ASSIGNING .
      -linha = vl_linha.

    ENDLOOP.  "<<< dados[]

    CASE separador.
      WHEN ';'.      vl_filetype = 'ASC'. vl_separator = space.
      WHEN 'EXCEL'.  vl_filetype = 'WK1'. vl_separator = 'X'.
    ENDCASE.

    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
        filename                = diretorio
        filetype                = vl_filetype
        write_field_separator   = vl_separator
      TABLES
        data_tab                = tl_arquivo[]
      EXCEPTIONS
        file_write_error        = 1
        no_batch                = 2
        gui_refuse_filetransfer = 3
        invalid_type            = 4
        no_authority            = 5
        unknown_error           = 6
        header_not_allowed      = 7
        separator_not_allowed   = 8
        filesize_not_allowed    = 9
        header_too_long         = 10
        dp_error_create         = 11
        dp_error_send           = 12
        dp_error_write          = 13
        unknown_dp_error        = 14
        access_denied           = 15
        dp_out_of_memory        = 16
        disk_full               = 17
        dp_timeout              = 18
        file_not_found          = 19
        dataprovider_exception  = 20
        control_flush_error     = 21
        OTHERS                  = 22.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid
            TYPE 'S'
          NUMBER sy-msgno
            WITH sy-msgv1
                 sy-msgv2
                 sy-msgv3
                 sy-msgv4 DISPLAY LIKE sy-msgty.
      subrc = 4.
      EXIT.
    ENDIF.

    subrc = 0.

  ENDMETHOD.                    "salva_arquivo


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->SALVA_EM_CSV
* +-------------------------------------------------------------------------------------------------+
* | [--->] DADOS                          TYPE        TABLE
* | [--->] DIRETORIO                      TYPE        STRING
* | [<---] SUBRC                          TYPE        SUBRC
* +--------------------------------------------------------------------------------------
  METHOD salva_em_csv.

    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
        filename                = diretorio
        filetype                = 'ASC'
      TABLES
        data_tab                = dados[]
      EXCEPTIONS
        file_write_error        = 1
        no_batch                = 2
        gui_refuse_filetransfer = 3
        invalid_type            = 4
        no_authority            = 5
        unknown_error           = 6
        header_not_allowed      = 7
        separator_not_allowed   = 8
        filesize_not_allowed    = 9
        header_too_long         = 10
        dp_error_create         = 11
        dp_error_send           = 12
        dp_error_write          = 13
        unknown_dp_error        = 14
        access_denied           = 15
        dp_out_of_memory        = 16
        disk_full               = 17
        dp_timeout              = 18
        file_not_found          = 19
        dataprovider_exception  = 20
        control_flush_error     = 21
        OTHERS                  = 22.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid
            TYPE 'S'
          NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
         DISPLAY LIKE sy-msgty.
      subrc = 4.
    ELSE.
      subrc = 0.
    ENDIF.

  ENDMETHOD.                    "salva_em_csv


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->SALVA_EM_EXCEL
* +-------------------------------------------------------------------------------------------------+
* | [--->] NAME                           TYPE        ANY (default ='PLAN_DADOS')
* | [--->] DADOS                          TYPE        TABLE
* | [--->] USA_CONVERSOR                  TYPE        C (default =SPACE)
* | [--->] DIRETORIO                      TYPE        STRING
* | [<---] SUBRC                          TYPE        SUBRC
* +--------------------------------------------------------------------------------------
  METHOD salva_em_excel.

*>>> Declaração de Variavei, Tab.Interna e outros Objetos Locais
    TYPES:
      BEGIN OF ty_arquivo,
        linha        TYPE string,
      END   OF ty_arquivo.

    DATA:
      vl_linha       TYPE string,
      vl_to          TYPE string,
      vl_tabix1      TYPE sy-tabix,
      vl_tabix2      TYPE sy-tabix,
      vl_campo       TYPE string,
      vl_string      TYPE c LENGTH 2000  VALUE space,
      vl_filetype    TYPE c LENGTH 010   VALUE 'ASC',
      vl_separator   TYPE c LENGTH 001   VALUE space,
      vl_len         TYPE n LENGTH 006,
      vl_type        TYPE c LENGTH 001,
      vl_data        TYPE c LENGTH 010,
      vl_names       TYPE sydes_nameinfo,
      tl_table       TYPE sydes_desc,
      tl_arquivo     TYPE TABLE OF ty_arquivo,
      vl_subrc       TYPE subrc.

    FIELD-SYMBOLS:
         TYPE ty_arquivo,
            TYPE ANY,
              TYPE ANY.

*>>> Lista os campos da tabela interna do parâmetro de entrada
    CLEAR: t_tabela[].
    FREE tl_table.
    DESCRIBE FIELD dados INTO tl_table.
    IF NOT ( tl_table IS INITIAL ).

      DELETE tl_table-names WHERE name+0(2) = '=='.
      DELETE ADJACENT DUPLICATES FROM tl_table-names
                            COMPARING name.
      DELETE tl_table-names FROM 1 TO 2.

      LOOP AT tl_table-names INTO vl_names.

        me->processando( ).

        SEARCH vl_names-name FOR '-' IN CHARACTER MODE.
        CHECK ( sy-subrc <> 0 ).

        APPEND vl_names-name TO t_tabela.

      ENDLOOP.

    ENDIF.

    CALL METHOD me->open_excel
      EXPORTING
        name      = name
        diretorio = diretorio
      IMPORTING
        subrc     = vl_subrc.

*>>> Inicia o processo de movimentação de dados
    LOOP AT dados ASSIGNING .

      me->processando( ).

      vl_tabix1 = sy-tabix.

*>>> Processo dinâmico da captura da campos
      CLEAR vl_tabix2.
      LOOP AT t_tabela INTO vg_tabela.

        me->processando( ).

        CLEAR vl_to.
        CONCATENATE '-' vg_tabela-campo INTO vl_to.
        CONDENSE vl_to NO-GAPS.

        ASSIGN (vl_to) TO .
        CHECK (  IS ASSIGNED ).

        ADD 1 TO vl_tabix2.

        FREE vl_campo.
        vl_campo = .

        IF ( usa_conversor <> space ).
          CLEAR vl_type.
          DESCRIBE FIELD  TYPE vl_type.
          CASE vl_type.
            WHEN 'P'.  "... Valor com Decimais
              TRANSLATE vl_campo USING '.,'.
              CONDENSE vl_campo NO-GAPS.
            WHEN 'D'.  "... Data
              CLEAR vl_data.
              WRITE  TO vl_data USING EDIT MASK '__/__/____'.
              CLEAR vl_campo. FREE vl_campo.
              vl_campo = vl_data.
          ENDCASE.
        ENDIF.

        UNASSIGN .

        CALL METHOD me->write_cell
          EXPORTING
            format = 'DATA'
            row    = vl_tabix1
            col    = vl_tabix2
            value  = vl_campo
          IMPORTING
            subrc  = vl_subrc.

      ENDLOOP.  "<<< t_tabela[]

    ENDLOOP.  "<<< dados[]

    CALL METHOD me->close_excel
      EXPORTING
        diretorio = diretorio.

    subrc = 0.

  ENDMETHOD.                    "salva_arquivo


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->SET_FONT
* +-------------------------------------------------------------------------------------------------+
* | [--->] CODE                           TYPE        ANY (default ='DATA')
* | [--->] NAME                           TYPE        ANY (default ='Arial')
* | [--->] SIZE                           TYPE        ANY (default =10)
* | [--->] BOLD                           TYPE        ANY (default =' ')
* | [--->] ITALIC                         TYPE        ANY (default =' ')
* | [--->] COLOR                          TYPE        ANY (default =0)
* | [--->] BGCOLOR                        TYPE        ANY (default =-4142)
* +--------------------------------------------------------------------------------------
  METHOD set_font.

    FIELD-SYMBOLS:  TYPE ty_font.

*** Busca na tabela interna se o código já existe.
    READ TABLE t_fonts ASSIGNING  WITH KEY code = code.
    IF NOT sy-subrc IS INITIAL.

* Insere um novo registro.
*** Seta os valores

      APPEND INITIAL LINE TO t_fonts ASSIGNING .
      -name = name.
      -size = size.
      IF bold IS INITIAL.
        -bold = c_blank.
      ELSE.
        -bold = c_x.
      ENDIF.
      IF italic IS INITIAL.
        -italic = c_blank.
      ELSE.
        -italic = c_x.
      ENDIF.
      -color = color.
      -bgcolor = bgcolor.
      -code = code.

    ELSE.

* Altera o registro atual.
*** Seta os valores

      -name = name.
      -size = size.
      IF bold IS INITIAL.
        -bold = c_blank.
      ELSE.
        -bold = c_x.
      ENDIF.
      IF italic IS INITIAL.
        -italic = c_blank.
      ELSE.
        -italic = c_x.
      ENDIF.
      -color = color.
      -bgcolor = bgcolor.

    ENDIF.

  ENDMETHOD.                    "SET_FONT


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->USE_FONT
* +-------------------------------------------------------------------------------------------------+
* | [--->] FORMAT                         TYPE        ANY
* +--------------------------------------------------------------------------------------
  METHOD use_font.

*** Validações
    READ TABLE t_fonts INTO vg_fonts WITH KEY code = format.

    IF NOT sy-subrc IS INITIAL.
*** Não localizou o tipo de fonte, utiliza a primeira
      READ TABLE t_fonts INTO vg_fonts INDEX 1.
    ENDIF.
    GET PROPERTY OF vg_cel 'Font' = vg_font.

*** Define a fonte (Letra)
    SET PROPERTY OF vg_font 'name' = vg_fonts-name.

*** Define o tamanho da fonte
    SET PROPERTY OF vg_font 'Size' = vg_fonts-size.

*** Define se a fonte será em italico ou não.
    IF vg_fonts-italic EQ c_x.
      SET PROPERTY OF vg_font 'Italic' = 1.
    ELSE.
      SET PROPERTY OF vg_font 'Italic' = 0.
    ENDIF.

*** Define se a fonte será em negrito ou não.
    IF vg_fonts-bold EQ c_x.
      SET PROPERTY OF vg_font 'Bold' = 1.
    ELSE.
      SET PROPERTY OF vg_font 'Bold' = 0.
    ENDIF.

*** Define a cor da letra
    SET PROPERTY OF vg_font 'ColorIndex' = vg_fonts-color.

*** Define a cor de fundo
    GET PROPERTY OF vg_cel 'Interior' = vg_interior.
    SET PROPERTY OF vg_interior 'ColorIndex' = vg_fonts-bgcolor.
    SET PROPERTY OF vg_interior 'Pattern' = 1.

*** Libera os objetos criados
    FREE OBJECT vg_interior.
    FREE OBJECT vg_font.

  ENDMETHOD.                    "use_font


* ---------------------------------------------------------------------------------------+
* | Instance Public Method CL_ABAP->WRITE_CELL
* +-------------------------------------------------------------------------------------------------+
* | [--->] FORMAT                         TYPE        ANY (default ='DATA')
* | [--->] ROW                            TYPE        ANY
* | [--->] COL                            TYPE        ANY
* | [--->] VALUE                          TYPE        ANY(optional)
* | [<---] SUBRC                          TYPE        SUBRC
* +--------------------------------------------------------------------------------------
  METHOD write_cell.

*** Valida se já foi definido algum tipo de fonte
    IF t_fonts[] IS INITIAL.
      subrc = 4.
      EXIT.    "Tabela de fontes vazia.
    ENDIF.
    subrc = 0.

    READ TABLE t_cols INTO vg_cols INDEX row.
    IF ( sy-subrc <> 0 ).
      subrc = 4.
      EXIT.    "Tabela de fontes vazia.
    ENDIF.
    subrc = 0.

*** Cria o objeto 'Célula' do Excel
    CALL METHOD OF vg_excel 'Cells' = vg_cel
      EXPORTING
      #1 = row
      #2 = col.

*** Grava o valor
    SET PROPERTY OF vg_cel 'Value' = value.

*** Define o formato da célula
    CALL METHOD me->use_font
      EXPORTING
        format = format.

*** Libera os objetos criados
    FREE OBJECT vg_cel.

  ENDMETHOD.                    "write_cell

ENDCLASS.                    "CL_ABAP IMPLEMENTATION
*______________________________________________________________________*
*   Declaração do objecto que será utilizado no desenvolvimento
*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
DATA obj_abap      TYPE REF TO cl_abap.

***[ End of INCLUDE ]***************************************************

Arquivos para Download:

ZGERA_XML.txt