Conteúdo

Salvar arquivo com extensão definida (XLS, TXT ou N outra qualquer)

Quando necessário gravar um arquivo local, o ideal é deixar o usuário escolher o local de uma maneira mais "bonita", e não colocando aquele linguição fixo no parâmetro. O resultado deste código é um popup onde o usuário pode escolher o local a ser gravado o arquivo. Lembrando que este arquivo deverá ter a extensão TXT ou XLS. Pode ser feito para N outras extensões.
REPORT ZSAPeiros.

* Tabela qualquer, apenas para testar este código
DATA: BEGIN OF t_saida OCCURS 0,
               codg(3)  TYPE n,
               desc(10) TYPE c,
        END OF t_saida.

DATA: vl_call_mask(50)    TYPE c,
      vl_name_exp         LIKE ibipparms-path,
      vl_filename_exp     TYPE string.

* Extenção do arquivo de saída
CONCATENATE ',Excel (*.xls),*.XLS;*.XLSX' ',Texto (*.txt),*.TXT.' INTO vl_call_mask.

* Popup para informar o local onde será gravado o arquivo
CALL FUNCTION 'WS_FILENAME_GET'
  EXPORTING
    def_filename     = space
    def_path         = vl_name_exp
    mask             = vl_call_mask
    mode             = 'S' "S = Save, O = Open
  IMPORTING
    filename         = vl_name_exp
  EXCEPTIONS
    inv_winsys       = 04
    no_batch         = 08
    selection_cancel = 12
    selection_error  = 16.

IF sy-subrc IS INITIAL.

  vl_filename_exp = vl_name_exp.

* Popula tabela criada
  t_saida-codg = '1'.
  t_saida-desc = 'Um'.
  APPEND t_saida.

  t_saida-codg = '2'.
  t_saida-desc = 'Dois'.
  APPEND t_saida.

  t_saida-codg = '3'.
  t_saida-desc = 'Três'.
  APPEND t_saida.

  t_saida-codg = '4'.
  t_saida-desc = 'Quatro'.
  APPEND t_saida.

  t_saida-codg = '5'.
  t_saida-desc = 'Cinco'.
  APPEND t_saida.

* Grava o arquivo no local informado
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename                = vl_filename_exp
      write_field_separator   = ';'
    TABLES
      data_tab                = t_saida
    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 'Gravado com sucesso!' TYPE 'S'.
  ELSE.
    MESSAGE 'Erro o gravar!' TYPE 'E'.
  ENDIF.

ENDIF.