/* POPUP INI */
/* POPUP FIM */

Conteúdo

Procurar/Localizar por conteúdo


Google?  kkkkkkkkkkkkkkkkkkkkkk  #SQN

A questão é simples: Como encontrar um conteúdo/texto específico dentro de programas SAP?

A transação mágica é a EWK1 ou o programa RS_ABAP_SOURCE_SCAN, ambos intuitivos e não requerem explicações.

Quebra de linha via código utilizando ASCII

Pular linha é fácil né? É só dar Enter. Tá bom, então tenta fazer isto concatenando variáveis.
REPORT ZSAPeiros.

TYPES:
  BEGIN OF ty_data,
    linha(20)       TYPE c,
    END OF ty_data.

DATA:
  gt_data           TYPE TABLE OF ty_data,
  wa_data           TYPE          ty_data,
  lv_string         TYPE string,
  lv_pula           TYPE string.

lv_pula = cl_abap_conv_in_ce=>uccp( '000A' ). "CÓDIGO ASCII DO PULO DE LINHA

CONCATENATE '1' lv_pula '2' lv_pula '3' INTO lv_string.

wa_data-linha = lv_string.
APPEND wa_data TO gt_data.


CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
    filename                = 'C:\PULOLINHA.txt'
  CHANGING
    data_tab                = gt_data
  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
    not_supported_by_gui    = 22
    error_no_gui            = 23
    OTHERS                  = 24.

* ABRA NO NOTEPAD++ O ARQUIVO GERADO

Copiar arquivo entre Unix e Local, e também eliminar

Já precisou copiar aquele arquivo para o servidor para testar seu desenvolvimento né? Ou então enviar um arquivo para o servidor. Pois bem, este código faz isto, e ainda por cima também elimina, converte em texto ou binário, manda de Unix para Local, Local para Unix, Unix para Unix. Tudo isto e mais um pouco.
REPORT ZSAPeiros.

*********************************************************************************
* COPIAR ARQUIVOS DO UNIX PARA LOCAL E VICE-VERSA
*********************************************************************************
*&---------------------------------------------------------------------*
* Tela de seleção
*&---------------------------------------------------------------------*
PARAMETERS: p_origem  LIKE rlgrap-filename OBLIGATORY,
            p_destin  LIKE rlgrap-filename OBLIGATORY,
            p_get     RADIOBUTTON GROUP g0,
            p_put     RADIOBUTTON GROUP g0,
            p_unix    RADIOBUTTON GROUP g0,
            p_deleta  AS CHECKBOX,
            p_tex     RADIOBUTTON GROUP g1,
            p_bin     RADIOBUTTON GROUP g1.


*&---------------------------------------------------------------------*
*Initialization
*&---------------------------------------------------------------------*
INITIALIZATION.
  %_p_origem_%_app_%-text   = 'Arquivo de Origem'.
  %_p_destin_%_app_%-text   = 'Arquivo de Destino'.
  %_p_get_%_app_%-text      = 'Copiar do UNIX para PC'.
  %_p_put_%_app_%-text      = 'Copiar do PC para o UNIX'.
  %_p_unix_%_app_%-text     = 'Copiar do UNIX para UNIX'.
  %_p_deleta_%_app_%-text   = 'Deletar Arquivo Origem'.
  %_p_tex_%_app_%-text      = 'Arquivo Texto'.
  %_p_bin_%_app_%-text      = 'Arquivo Binário'.


*&---------------------------------------------------------------------*
* Tabelas Internas
*&---------------------------------------------------------------------*
  DATA: tg_file(1200) TYPE c OCCURS 0 WITH HEADER LINE.


*&---------------------------------------------------------------------*
* Variáveis
*&---------------------------------------------------------------------*
  DATA: vg_filename   TYPE string,
        vg_texto(100) type c.


*&---------------------------------------------------------------------*
*Start-of-selection
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  IF p_get = 'X'.
    PERFORM get_unix.        "Copiar do UNIX  para o Local
  ELSEIF p_unix = 'X'.
    PERFORM move_unix.       "Copiar do UNIX  para o UNIX
  ELSE.
    PERFORM put_unix.        "Copiar do Local para o UNIX
  ENDIF.


*&---------------------------------------------------------------------*
*&      Form  get_unix
*&---------------------------------------------------------------------*
FORM get_unix.
  clear vg_filename.
  vg_filename = p_destin.

  IF p_tex = 'X'.
    OPEN DATASET p_origem FOR INPUT IN TEXT MODE ENCODING DEFAULT.
  ELSE.
    OPEN DATASET p_origem FOR INPUT IN BINARY MODE.
  ENDIF.

  IF sy-subrc NE 0.
    WRITE: / 'Erro na abertura do arquivo UNIX'.
    EXIT.
  ENDIF.

  DO.
    READ DATASET p_origem INTO tg_file.
    IF sy-subrc NE 0.
      EXIT.
    ENDIF.
    APPEND tg_file.
  ENDDO.

  CLOSE DATASET p_origem.

  CHECK sy-subrc = 0.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename = vg_filename
      filetype = 'ASC'
    TABLES
      data_tab = tg_file
    EXCEPTIONS
      OTHERS   = 8.

  IF sy-subrc NE 0.
    WRITE: / 'Erro no Download do arquivo local'.
  ELSE.
    WRITE: / 'Transferência p/o Local executada com sucesso!'.
    IF p_deleta = 'X'.
      DELETE DATASET p_origem.
      IF NOT sy-subrc IS INITIAL.
        WRITE: /  'Erro ao deletar Arquivo Origem!'.
      ELSE.
        WRITE: / 'Arquivo Origem deletado com sucesso!'.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    "get_unix


*&---------------------------------------------------------------------*
*&      Form  put_unix
*&---------------------------------------------------------------------*
FORM put_unix.
  clear vg_filename.
  vg_filename = p_origem.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = vg_filename
      filetype = 'ASC'
    TABLES
      data_tab = tg_file
    EXCEPTIONS
      OTHERS   = 8.

  IF sy-subrc NE 0.
    WRITE: / 'Erro no Upload do arquivo local'.
    EXIT.
  ENDIF.

  IF p_tex = 'X'.
    OPEN DATASET p_destin FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
  ELSE.
    OPEN DATASET p_destin FOR OUTPUT IN BINARY MODE.
  ENDIF.

  IF sy-subrc NE 0.
    WRITE: / 'Erro na abertura do arquivo UNIX'.
    EXIT.
  ENDIF.

  LOOP AT tg_file.
    TRANSFER tg_file TO p_destin.
  ENDLOOP.

  CLOSE DATASET p_destin.

  WRITE: / 'Transferência p/o UNIX executada com sucesso!'.
ENDFORM.                    "put_unix


*&---------------------------------------------------------------------*
*&      Form  move_unix
*&---------------------------------------------------------------------*
FORM move_unix.
  OPEN DATASET p_origem FOR INPUT IN TEXT MODE ENCODING DEFAULT.

  clear vg_texto(100).

  IF sy-subrc NE 0.
    CONCATENATE 'Erro na abertura do arquivo:' p_origem
    INTO vg_texto SEPARATED BY space.
    WRITE:/ vg_texto COLOR COL_NEGATIVE INTENSIFIED OFF.
    EXIT.
  ENDIF.

  OPEN DATASET p_destin FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.

  IF sy-subrc NE 0.
    CONCATENATE 'Erro na abertura do arquivo:' p_destin
    INTO vg_texto SEPARATED BY space.
    WRITE:/ vg_texto COLOR COL_NEGATIVE INTENSIFIED OFF.
    EXIT.
  ENDIF.

  WHILE sy-subrc EQ 0.
    READ DATASET p_origem INTO tg_file.
    IF sy-subrc EQ 0.
      TRANSFER tg_file TO p_destin.
    ENDIF.
  ENDWHILE.

  CLOSE DATASET p_origem.

  IF sy-subrc EQ 0.
    IF NOT p_deleta IS INITIAL.
      DELETE DATASET p_origem.
    ENDIF.
    CONCATENATE 'O arquivo' p_origem 'foi movido para' p_destin
           INTO vg_texto SEPARATED BY space.
    WRITE:/ vg_texto COLOR COL_POSITIVE INTENSIFIED OFF.
  ENDIF.

  CLOSE DATASET p_destin.
ENDFORM.                    "move_unix

Comparação do conteúdo de 2 arquivos

Digamos que você vez fez performane num programa que gera um relatório ou tem uma tabela de saída, e agora você precisa comparar o conteúdo, para ver se o resultado final é o mesmo. Está desenhado para comparar arquivos excel e texto. Informa quais são as linhas que estão diferentes e ainda gera um arquivo contendo apenas o que ficou diferente.
REPORT ZSAPeiros.

TYPES: BEGIN OF ty_file,
         line       TYPE string,
         cont(10)   TYPE n,
       END OF ty_file,

       BEGIN OF ty_file_fim,
         line       TYPE string,
       END OF ty_file_fim,

       BEGIN OF ty_file_aux,
         cont(10)   TYPE c,
         line       TYPE string,
       END OF ty_file_aux.

DATA: lv_hora_ini     TYPE sy-uzeit,
      lv_hora_fim     TYPE sy-uzeit,
      lv_hora         TYPE sy-uzeit,
      lv_cont(8)      TYPE c,
      lv_cont1(8)     TYPE c,
      lv_cont2(8)     TYPE c,
      lv_text(5000)   TYPE c,
      lv_filetype(10) TYPE c,
      lv_filename(30) TYPE c,
      lv_name_exp_srt TYPE string.

DATA: gt_file1         TYPE TABLE OF ty_file WITH HEADER LINE.
DATA: gt_file1_xls     TYPE TABLE OF ty_file_aux WITH HEADER LINE.
DATA: gt_file1_xls_exp TYPE TABLE OF ty_file_fim WITH HEADER LINE.
DATA: gt_file2         TYPE TABLE OF ty_file WITH HEADER LINE.
DATA: gt_file2_xls     TYPE TABLE OF ty_file_aux WITH HEADER LINE.
DATA: gt_file2_xls_exp TYPE TABLE OF ty_file_fim WITH HEADER LINE.

DATA: lv_call_mask(50)    TYPE c,
      lv_name_exp         TYPE ibipparms-path.


************************************************************************


PARAMETERS: p_file1 TYPE string OBLIGATORY,
            p_file2 TYPE string OBLIGATORY.


************************************************************************


INITIALIZATION.
  CLEAR lv_call_mask.
  CONCATENATE ',Excel (*.xls),*.XLS;*.XLSX' ',Texto (*.txt),*.TXT.'
         INTO lv_call_mask.


************************************************************************


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file1.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = space
      def_path         = space
      mask             = lv_call_mask
      mode             = 'O'
    IMPORTING
      filename         = lv_name_exp
    EXCEPTIONS
      inv_winsys       = 04
      no_batch         = 08
      selection_cancel = 12
      selection_error  = 16.
  p_file1 = lv_name_exp.


************************************************************************


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file2.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = space
      def_path         = space
      mask             = lv_call_mask
      mode             = 'O'
    IMPORTING
      filename         = lv_name_exp
    EXCEPTIONS
      inv_winsys       = 04
      no_batch         = 08
      selection_cancel = 12
      selection_error  = 16.
  p_file2 = lv_name_exp.


************************************************************************


END-OF-SELECTION.
  lv_hora_ini = sy-uzeit.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = p_file1
    TABLES
      data_tab = gt_file1.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = p_file2
    TABLES
      data_tab = gt_file2.


************************************************************************


  LOOP AT gt_file1.
    gt_file1-cont = sy-tabix.
    MODIFY gt_file1 INDEX sy-tabix.
  ENDLOOP.

  LOOP AT gt_file2.
    gt_file2-cont = sy-tabix.
    MODIFY gt_file2 INDEX sy-tabix.
  ENDLOOP.

  SORT: gt_file1 BY line,
        gt_file2 BY line.


************************************************************************


  LOOP AT gt_file1.
    READ TABLE gt_file2 WITH KEY line = gt_file1-line BINARY SEARCH.
    IF sy-subrc IS NOT INITIAL.
      lv_cont1 = lv_cont1 + 1.
      CONDENSE lv_cont1 NO-GAPS.
      gt_file1_xls-cont = gt_file1-cont.
      gt_file1_xls-line = gt_file1-line.
      APPEND gt_file1_xls.
    ENDIF.
  ENDLOOP.

  LOOP AT gt_file2.
    READ TABLE gt_file1 WITH KEY line = gt_file2-line BINARY SEARCH.
    IF sy-subrc IS NOT INITIAL.
      lv_cont2 = lv_cont2 + 1.
      CONDENSE lv_cont2 NO-GAPS.
      gt_file2_xls-cont = gt_file2-cont.
      gt_file2_xls-line = gt_file2-line.
      APPEND gt_file2_xls.
    ENDIF.
  ENDLOOP.


************************************************************************


  SORT: gt_file1_xls BY cont,
        gt_file2_xls BY cont.


************************************************************************


  CLEAR lv_text.
  CONCATENATE sy-vline
              'TEM NO ARQUIVO ARQUIVO'
              p_file1
              'E NÃO TEM NO ARQUIVO'
              p_file2
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_HEADING.

  WRITE: / sy-uline.

  LOOP AT gt_file1_xls.
    gt_file1_xls_exp-line = gt_file1_xls-line.
    APPEND gt_file1_xls_exp.
    IF sy-tabix = 1.
      CLEAR lv_text.
      lv_text+0(1)  = sy-vline.
      lv_text+2(10) = 'Linha'.
      lv_text+13(1) = sy-vline.
      lv_text+15    = 'Valor da linha'.
      WRITE: / lv_text COLOR COL_GROUP INTENSIFIED OFF.
      WRITE: / sy-uline.
    ENDIF.
    CLEAR lv_text.
    lv_text+0(1)  = sy-vline.
    lv_text+2(10) = gt_file1_xls-cont.
    lv_text+13(1) = sy-vline.
    lv_text+15    = gt_file1_xls-line.
    WRITE: / lv_text COLOR COL_HEADING INTENSIFIED OFF.
  ENDLOOP.


************************************************************************


  WRITE: / sy-uline.
  CLEAR lv_text.
  lv_text(1)   = sy-vline.
  WRITE: / lv_text COLOR COL_NEGATIVE INTENSIFIED.
  WRITE: / sy-uline.


************************************************************************


  CLEAR lv_text.
  CONCATENATE sy-vline
              'TEM NO ARQUIVO ARQUIVO'
              p_file2
              'E NÃO TEM NO ARQUIVO'
              p_file1
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_HEADING.

  WRITE: / sy-uline.

  LOOP AT gt_file2_xls.
    gt_file2_xls_exp-line = gt_file2_xls-line.
    APPEND gt_file2_xls_exp.
    IF sy-tabix = 1.
      CLEAR lv_text.
      lv_text+0(1)  = sy-vline.
      lv_text+2(10) = 'Linha'.
      lv_text+13(1) = sy-vline.
      lv_text+15    = 'Valor da linha'.
      WRITE: / lv_text COLOR COL_GROUP INTENSIFIED OFF.
      WRITE: / sy-uline.
    ENDIF.
    CLEAR lv_text.
    lv_text+0(1)  = sy-vline.
    lv_text+2(10) = gt_file2_xls-cont.
    lv_text+13(1) = sy-vline.
    lv_text+15    = gt_file2_xls-line.
    WRITE: / lv_text COLOR COL_HEADING INTENSIFIED OFF.
  ENDLOOP.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


* Linhas do arquivo 1
  CONDENSE lv_cont1 NO-GAPS.
  CLEAR lv_text.
  CONCATENATE sy-vline
              lv_cont1
              'linhas diferentes no arquivo'
              p_file1
         INTO lv_text SEPARATED BY space.

  IF lv_cont1 IS INITIAL.
    WRITE: / lv_text.
  ELSE.
    WRITE: / lv_text COLOR COL_TOTAL INTENSIFIED ON.
  ENDIF.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


* Linhas do arquivo 2
  CONDENSE lv_cont2 NO-GAPS.
  CLEAR lv_text.
  CONCATENATE sy-vline
              lv_cont2
              'linhas diferentes no arquivo'
              p_file2
         INTO lv_text SEPARATED BY space.

  IF lv_cont2 IS INITIAL.
    WRITE: / lv_text.
  ELSE.
    WRITE: / lv_text COLOR COL_TOTAL INTENSIFIED ON.
  ENDIF.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


* Linhas do arquivo 1 e 2
  lv_cont = lv_cont1 + lv_cont2.
  CONDENSE lv_cont NO-GAPS.
  CLEAR lv_text.
  CONCATENATE sy-vline
              lv_cont
              'linhas diferentes no total'
         INTO lv_text SEPARATED BY space.

  IF lv_cont IS INITIAL.
    WRITE: / lv_text.
  ELSE.
    WRITE: / lv_text COLOR COL_TOTAL INTENSIFIED ON.
  ENDIF.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


  lv_hora_fim = sy-uzeit.
  lv_hora = lv_hora_fim - lv_hora_ini.

  CLEAR lv_text.
  CONCATENATE sy-vline
              'Tempo gasto:'
              lv_hora
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_POSITIVE INTENSIFIED ON USING EDIT MASK '_________________:__:__'.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


  CLEAR lv_text.
  CONCATENATE sy-vline
              'Duplo clique para exportar as linhas diferentes do arquivo 1:'
              p_file1
              'para TXT ou XLS'
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_GROUP INTENSIFIED OFF.


************************************************************************


  WRITE: / sy-uline.


************************************************************************


  CLEAR lv_text.
  CONCATENATE sy-vline
              'Duplo clique para exportar as linhas diferentes do arquivo 2:'
              p_file2
              'para TXT ou XLS'
         INTO lv_text SEPARATED BY space.
  WRITE: / lv_text COLOR COL_GROUP INTENSIFIED OFF.

  WRITE: / sy-uline.


************************************************************************


AT LINE-SELECTION.
  IF sy-ucomm EQ 'PICK'.


************************************************************************


    IF sy-lisel+2(26) = 'Duplo clique para exportar' AND
       sy-lisel+61(1) = '1'.

      lv_cont = STRLEN( p_file1 ).
      lv_cont = lv_cont - 4.
      CONCATENATE p_file1(lv_cont)
                  '_DIF'
             INTO lv_filename.

      CLEAR lv_name_exp.
      CALL FUNCTION 'WS_FILENAME_GET'
        EXPORTING
          def_filename     = lv_filename
          def_path         = space
          mask             = lv_call_mask
          mode             = 'S'
        IMPORTING
          filename         = lv_name_exp
        EXCEPTIONS
          inv_winsys       = 04
          no_batch         = 08
          selection_cancel = 12
          selection_error  = 16.

      IF sy-subrc IS INITIAL.
        lv_cont = STRLEN( lv_name_exp ).
        lv_cont = lv_cont - 3.
        IF lv_name_exp+lv_cont(3) = 'XLS'.
          lv_filetype = 'DAT'.
        ELSE.
          lv_filetype = 'ASC'.
        ENDIF.
        lv_name_exp_srt = lv_name_exp.
        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            filename              = lv_name_exp_srt
            filetype              = lv_filetype
            write_field_separator = 'X'
          TABLES
            data_tab              = gt_file1_xls_exp.
      ENDIF.

    ENDIF.


************************************************************************


    IF sy-lisel+2(26) = 'Duplo clique para exportar' AND
       sy-lisel+61(1) = '2'.

      lv_cont = STRLEN( p_file2 ).
      lv_cont = lv_cont - 4.
      CONCATENATE p_file2(lv_cont)
                  '_DIF'
             INTO lv_filename.

      CLEAR lv_name_exp.
      CALL FUNCTION 'WS_FILENAME_GET'
        EXPORTING
          def_filename     = lv_filename
          def_path         = space
          mask             = lv_call_mask
          mode             = 'S'
        IMPORTING
          filename         = lv_name_exp
        EXCEPTIONS
          inv_winsys       = 04
          no_batch         = 08
          selection_cancel = 12
          selection_error  = 16.

      IF sy-subrc IS INITIAL.
        lv_cont = STRLEN( lv_name_exp ).
        lv_cont = lv_cont - 3.
        IF lv_name_exp+lv_cont(3) = 'XLS'.
          lv_filetype = 'DAT'.
        ELSE.
          lv_filetype = 'ASC'.
        ENDIF.
        lv_name_exp_srt = lv_name_exp.
        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            filename              = lv_name_exp_srt
            filetype              = lv_filetype
            write_field_separator = 'X'
          TABLES
            data_tab              = gt_file2_xls_exp.
      ENDIF.

    ENDIF.

  ENDIF.

Adicionar espaços em branco no final do registro

E quem já não precisou gerar um arquivo com espaços até o limite solicitado pelo cliente? Bom, eu já, e na época ninguém me ensinou, e agora está mastigadinho pra você.
REPORT ZSAPeiros.

***************************************************************************
* NO SERVIDOR, UTILIZAR:
***************************************************************************
TRANSFER tabela-campo
      TO tabela_dest-campo_dest
         LENGTH 100. "Ou seja, 100 caracteres, adicionando brancos no final


***************************************************************************
* PARA ARQUIVOS LOCAIS, UTILIZAR:
***************************************************************************
* Tipo para tabela / estrutura principal
TYPES: BEGIN OF ty_data,
        linha(20)       TYPE c,                 "Linha
       END OF ty_data.

* Variáveis globais
DATA: gv_campo_espc     TYPE string,            "Espaço convertido
      gv_campo_qtde     TYPE i,                 "Quantidade caracteres
      gv_qtde_vezes     TYPE i,                 "Quantidade espaços a serem inseridos
      gv_campo_size(50) TYPE c.                 "Tamanho real do campo

* Tabela principal
DATA: gt_data           TYPE TABLE OF ty_data.  "Tabela

* Estrutura principal
DATA: wa_data           TYPE          ty_data.  "Estrutura

* Encode do espaço em branco
gv_campo_espc = cl_abap_conv_in_ce=>uccp( '00a0' ).

* Tamanho real do campo
DESCRIBE FIELD wa_data-linha LENGTH gv_campo_size IN CHARACTER MODE.

* Registro 1
wa_data-linha = '12345'.
gv_campo_qtde = STRLEN( wa_data-linha ).
gv_qtde_vezes = gv_campo_size - gv_campo_qtde.
DO gv_qtde_vezes TIMES.
  wa_data-linha+gv_campo_qtde(1) = gv_campo_espc.
  gv_campo_qtde = gv_campo_qtde + 1.
ENDDO.
CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
  EXPORTING
    intext            = wa_data-linha
  IMPORTING
    outtext           = wa_data-linha
  EXCEPTIONS
    invalid_codepage  = 1
    codepage_mismatch = 2
    internal_error    = 3
    cannot_convert    = 4
    fields_not_type_c = 5
    OTHERS            = 6.
APPEND wa_data TO gt_data.

* Registro 2
wa_data-linha = '67890'.
gv_campo_qtde = STRLEN( wa_data-linha ).
gv_qtde_vezes = gv_campo_size - gv_campo_qtde.
DO gv_qtde_vezes TIMES.
  wa_data-linha+gv_campo_qtde(1) = gv_campo_espc.
  gv_campo_qtde = gv_campo_qtde + 1.
ENDDO.
APPEND wa_data TO gt_data.

* Gera arquivo
CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
    filename                = 'C:\espacos_final.txt'
  CHANGING
    data_tab                = gt_data
  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
    not_supported_by_gui    = 22
    error_no_gui            = 23
    OTHERS                  = 24.

IF sy-subrc IS INITIAL.
  WRITE: / 'Arquivo gerado com sucesso!'.
ELSE.
  WRITE: / 'Erro ao gerar arquivo!'.
ENDIF.
/* POPUP INI */ /* POPUP FIM */