Conteúdo

SM30 - Incluir botão para importar arquivo CSV ou TXT - Horácio Mode

Certa vez um "Amigo" funcional me pediu pra colocar um botão na SM30 pra eu importar um excel e já visualizar/atualizar na SM30.

Chamei ele de preguiçoso, mas não teve como, tive que ajudar o Horácio (braço-curto).

Vai que vc tb tem um amigo Horácio, então isso pode ajudá-lo.

Vou utilizar como exemplo nossa tabela ZSAPEIROS:


Criar visão de atualização para mesma. Grupo de funções ZGFSAPEIROS foi criado:


Buscar o nome do Programa de nosso Grupo de funções. Para isto, ir na SE80 com o grupo de funções criado, e clicar em Programa básico:


Copiar a Interface de usuário do programa SAPLSVIM para nosso grupo de funções:



Veja como ficou agora o Grupo de funções. Veja que vários objetos foram adicionados:


Associar à interface criada, ou seja, iremos mudar a rotina standard pela individual:




No Status GUI EALX, crie o campo que dará ação no Importar o arquivo:



Após ativar todos os objetos do grupo, veja na SM30 que o botão já existe:


Agora é hora de dar ação no botão. Para isto crie o module ZIMPFILE dentro do PAI:




Duplo clique no módule, e basta copiar e colar o código abaixo:

*----------------------------------------------------------------------*
***INCLUDE LZGFSAPEIROSI01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  ZIMPFILE  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE zimpfile INPUT.
  DATA:
    lv_subrc      TYPE          sy-subrc,
    lv_tabix      TYPE          sy-tabix,
    lt_filetable  TYPE          filetable,
    wa_filetable  TYPE          file_table,
    lv_filename   TYPE          string,
    lt_zsapeiros  TYPE TABLE OF zsapeiros,
    wa_zsapeiros  TYPE          zsapeiros,
    lt_data_tab   TYPE          table_of_strings,
    wa_data_tab   TYPE          string.

  IF function EQ 'IMPFILE'.

* Popup para escolher o arquivo à ser importado
    CALL METHOD cl_gui_frontend_services=>file_open_dialog
      EXPORTING
        file_filter             = '(*.csv)|*.csv|(*.txt)|*.txt|'
      CHANGING
        file_table              = lt_filetable
        rc                      = lv_subrc
      EXCEPTIONS
        file_open_dialog_failed = 1
        cntl_error              = 2
        error_no_gui            = 3
        not_supported_by_gui    = 4
        OTHERS                  = 5.

    IF sy-subrc IS INITIAL.

* Importar o arquivo
      READ TABLE lt_filetable
            INTO wa_filetable
                 INDEX 1.

      IF sy-subrc IS INITIAL.

        lv_filename = wa_filetable-filename.

        CALL METHOD cl_gui_frontend_services=>gui_upload
          EXPORTING
            filename                = lv_filename
            has_field_separator     = ';'
          CHANGING
            data_tab                = lt_data_tab
          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
            not_supported_by_gui    = 17
            error_no_gui            = 18
            OTHERS                  = 19.

        IF sy-subrc IS NOT INITIAL.
          MESSAGE ID sy-msgid
                TYPE sy-msgty
              NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.

* Passar valores importados para estrutura
        LOOP AT lt_data_tab INTO wa_data_tab.

* Quebra linha importada nos campos da estrutura
          SPLIT wa_data_tab
             AT ';'
           INTO wa_zsapeiros-matnr
                wa_zsapeiros-maktx.

* Converte o campo material
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = wa_zsapeiros-matnr
            IMPORTING
              output = wa_zsapeiros-matnr.

* Move os dados da estrutura pra view
          '' = wa_zsapeiros.
          PERFORM move_extract_to_view_wa.
          lv_subrc = 8.
          lv_tabix = lv_tabix + 1.
          nextline = nextline + 1.
          PERFORM check_key.
          PERFORM nicht_vorhanden USING lv_subrc lv_tabix.

        ENDLOOP.

      ENDIF.

    ENDIF.

  ENDIF.
ENDMODULE.                 " ZIMPFILE  INPUT

Agradecimentos ao "Amigo" Kazitoris