Additional Blogs by Members
cancel
Showing results for 
Search instead for 
Did you mean: 
brunobex
Active Participant

English: With this blog you will know how to upload/download any file to a Z table.
This blog has arisen due to a question from a colleague in the SCN community.
I am posting a program I did in 2010.

Portuguese: Com esse blog você vai saber como fazer um upload/download de qualquer arquivo para uma tabela Z.
Esse blog surgiu devido a uma pergunta de um colega da comunidade SCN.
Estou postando um programa que fiz em 2010.


Passos:

1) Crie a tabela ZARQUIVO conforme figura abaixo:

Campos:

ID: apenas será um identificador de cada arquivo.

PARTIDX: será um contador de cada arquivo, irei quebrar o tamanho de 1000 em 1000.

FILENAME: será o nome do arquivo/localização

DATA_SIZE: será o tamanho binário de cada linha.

DATA: será o conteúdo binário do arquivo.

2) Crie o programa abaixo:

ZFILE_ANEXO

*&---------------------------------------------------------------------*

*& Report  ZFILE_ANEXO

*&

*&---------------------------------------------------------------------*

*&

*&

*&---------------------------------------------------------------------*

REPORT  ZFILE_ANEXO.

TYPES : BEGIN OF ty_data,

          data type x length 1,

       END OF ty_data.

DATA : t_data type standard table of ty_data,

       w_data like line of t_data.

DATA : t_data_tab type standard table of zarquivo,

       w_data_tab like line of t_data_tab.

*Parametros

Parameters : p_upload type c radiobutton group rb1,

             p_downlo type c radiobutton group rb1,

             p_id     type ZARQUIVO-id obligatory,

             p_file   type localfile.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

  PERFORM f_f4help_local_fname CHANGING p_file.

*inicio

start-of-selection.

  if not p_upload is initial.

    perform f_upload.

  else.

    perform f_download.

  endif.

*Forms

*&---------------------------------------------------------------------*

*&  Form f_upload

*&---------------------------------------------------------------------*

FORM f_upload.

  data: l_file type string,

        l_c1 type i,

        l_c2 type i,

        l_data type x length 1000.

  delete from zarquivo

  where id = p_id.

  l_file = p_file.

  CALL FUNCTION 'GUI_UPLOAD'

    EXPORTING

      FILENAME                = l_file

      FILETYPE                = 'BIN'

    TABLES

      DATA_TAB                = t_data

    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 SY-MSGTY

    NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

  DESCRIBE TABLE t_data.

  CHECK sy-tfill > 0.

  w_data_tab-id       = p_id.

  w_data_tab-filename = l_file.

  l_c1 = 0.

  l_c2 = 0.

  loop at t_data into w_data.

    l_data+l_c1 = w_data-data.

    add 1 to l_c1.

    if l_c1 = 1000.

      add 1 to l_c2.

      w_data_tab-partidx   = l_c2.

      w_data_tab-data_size = l_c1.

      w_data_tab-data      = l_data.

      append w_data_tab to t_data_tab.

      clear l_c1.

      clear l_data.

    endif.

  endloop.

  add 1 to l_c2.

  w_data_tab-partidx   = l_c2.

  w_data_tab-data_size = l_c1.

  w_data_tab-data = l_data.

  append w_data_tab to t_data_tab.

  modify zarquivo from table t_data_tab.

  if sy-subrc = 0.

*Upload efetuado com sucesso.

     message s208(00) with text-s01.

  endif.

ENDFORM. " f_upload

*&---------------------------------------------------------------------*

*&  Form f_download

*&---------------------------------------------------------------------*

FORM f_download.

  data : l_file type string,

         l_c1 type i.

  l_file = p_file.

  SELECT * INTO TABLE t_data_tab

  FROM zarquivo WHERE ID = P_ID.

  CHECK SY-SUBRC = 0.

  LOOP AT t_data_tab into w_data_tab.

    DO w_data_tab-data_size times.

      l_c1 = sy-index - 1.

      w_data-data = w_data_tab-data+l_c1.

      APPEND w_data to t_data.

    ENDDO.

  ENDLOOP.

  DESCRIBE TABLE t_data.

  CHECK sy-tfill > 0.

  CALL FUNCTION 'GUI_DOWNLOAD'

    EXPORTING

      BIN_FILESIZE            = sy-tfill

      FILENAME                = l_file

      FILETYPE                = 'BIN'

    TABLES

      DATA_TAB                = t_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

      OTHERS                  = 22.

  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE SY-MSGTY

    NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

ENDFORM. " f_download

*&---------------------------------------------------------------------*

*&      Form  F4HELP_LOCAL_FNAME

*&---------------------------------------------------------------------*

FORM f_f4help_local_fname CHANGING cv_filename TYPE localfile.

  DATA: lv_path          TYPE dxfields-longpath,

        lv_abend_flag    TYPE dxfields-abendflag.

  CALL FUNCTION 'F4_DXFILENAME_TOPRECURSION'

    EXPORTING

      i_location_flag = 'P'

    IMPORTING

      o_path          = lv_path

      abend_flag      = lv_abend_flag

    EXCEPTIONS

      rfc_error       = 1

      error_with_gui  = 2

      OTHERS          = 3.

  IF sy-subrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ELSEIF lv_abend_flag IS INITIAL.

    cv_filename = lv_path.

  ENDIF.

ENDFORM.                    " F_F4HELP_LOCAL_FNAME


3) Crie os elementos de textos e textos de seleção:

Símbolo de Texto

Texto

S01

Upload efetuado com sucesso.

Campo de Seleção

Texto

P_DOWNLO

Download

P_FILE

Arquivo

P_ID

ID sequencial do arquivo

P_UPLOAD       

Upload


4) Fazer o UPLOAD do arquivo

Rode o programa criado ZFILE_ANEXO pela transação SE38 ou SA38.
Nesse primeiro momento o programa irá fazer o UPLOAD do arquivo TESTE.DOC para a tabela ZARQUIVO e irá aparecer a mensagem de sucesso: "upload efetuado com sucesso".

5) Visualize a tabela após o UPLOAD do arquivo

A chave da tabela é o ID (identificador do arquivo) e PARTIDX (partes binárias do identificador do arquivo dividido em tamanhos de 1000).

6) Fazer o DOWNLOAD do arquivo e salvar na máquina local

Realizar o processo inverso. Você pode usar o mesmo nome do arquivo ou até mesmo salvar como outro nome. Neste caso utilizei outro nome TESTE2.DOC

7) Verificar a pasta onde foi feito o download

O arquivo DOWNLOAD foi criado exatamente igual ao original conforme mostrado abaixo:

12 Comments