*&---------------------------------------------------------------------*
*& Report ZMJ_imp_file
*&
*&---------------------------------------------------------------------*
" Hoje irei mostrar um 'Method' que faz a mesma coisa que o Gui_upload
" mas com esse 'Method' não precisamos tratar o dados, ele já alimenta
" direto a tabela com as informações do arquivo, sigam passo a passo este
" programa pois é muito util.
REPORT zmj_imp_file.
" Tipos
TYPES :
* Arquivo TXT - Cabeçalho
BEGIN OF ty_arqh,
bukrs TYPE ekko-bukrs, "Empresa
ebeln TYPE ekko-ebeln, "Nº do documento de compras
lifnr TYPE ekko-lifnr, "Fornecedor
END OF ty_arqh,
* Arquivo TXT - Itens
BEGIN OF ty_arqi,
ebeln TYPE ekpo-ebeln, "Nº do documento de compras
ebelp TYPE ekpo-ebelp, "N° item
matnr TYPE ekpo-matnr, "Cod Material
maktx TYPE makt-maktx, "Texto breve do Material
END OF ty_arqi
.
" Tabelas Internas
data : it_arqh TYPE TABLE OF ty_arqh,
it_arqi TYPE TABLE OF ty_arqi
.
" Variáveis.
data : v_file TYPE string, "Diretório + Nome arquivo
v_perc(05) TYPE p DECIMALS 2, "Percentual do Processo
c_x type c VALUE 'X', " COnstante X
v_title TYPE string, "Título da Janela
c_idiret TYPE string VALUE 'C:\' "Diretório Inicial
.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-p01.
PARAMETERS:
p_pathho TYPE file_table-filename, "Dados Cabeçalho
p_pathio TYPE file_table-filename "Dados Item
.
SELECTION-SCREEN END OF BLOCK b1.
*----------------------------------------------------------------------*
* At Selection-Screen *
*----------------------------------------------------------------------*
* Ajuda na Escolha do Diretório para gravação do Arquivo
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_pathho.
PERFORM f_busca_caminho CHANGING p_pathho.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_pathio.
PERFORM f_busca_caminho CHANGING p_pathio.
INITIALIZATION.
START-OF-SELECTION.
* Abre o arquivo TXT e joga na tabela interna, desconsiderando
* cabeçalho
* text-001 - Dados Cabeçalho
* text-002 - Dados Item
PERFORM f_carrega_arquivo:
" espero que vcs tenha percebido que mesmo as tabelas tendo campos e
" qtde de campos diferentes ele faz mesmo assim, o importante é vc
" declarar a tabela certinha.
TABLES it_arqh USING p_pathho text-001,
TABLES it_arqi USING p_pathio text-002
.
" Durante o processo de debugar, olhe como estão as tabelas internas,
" adicione mais campos para as tabelas internas e respectivamente dentro
" do arquivo txt caso queira.
BREAK-POINT.
*&---------------------------------------------------------------------*
*& Form F_CARREGA_ARQUIVO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->p_table Tabela interna do arquivo
* -->p_pathfile Diretório + Nome arquivo (tela de seleção)
* -->p_text Texto de Mensagem para identificar o arquivo
*----------------------------------------------------------------------*
form F_CARREGA_ARQUIVO tables p_table
using p_pathfile
p_text.
" Move o valor da variável que contem o nome do arquivo, para dentro de
" uma outra variável para ter compatibilidade com o campo do method, senão
" não rola.
MOVE p_pathfile TO v_file.
* Exibe mensagem na barra de Status
* Msg: Carregando arquivo...
ADD 5 TO v_perc.
PERFORM f_progress_indicator USING 'Texto 1' v_perc.
* Abre arquivo de extensão '.TXT' que tem os campos separados por TAB e
* move dados para a tabela interna
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = v_file
has_field_separator = c_x
CHANGING
data_tab = p_table[]
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 NOT sy-subrc IS INITIAL.
* Msg: Erro na abertura do arquivo de XXX indicado.
MESSAGE i836(sd) WITH text-010 p_text text-018.
LEAVE LIST-PROCESSING.
ENDIF.
* Desconsidera cabeçalho do arquivo
DELETE p_table[] INDEX 1.
CLEAR v_file.
ENDFORM. " f_carrega_arquivo
*&---------------------------------------------------------------------*
*& Form f_progress_indicator
*&---------------------------------------------------------------------*
* Indicador de visualização do progresso na janela atual
*----------------------------------------------------------------------*
* -->P_TEXTO Texto do processamento
* -->P_PERCENT Porcentual do processamento
*----------------------------------------------------------------------*
FORM f_progress_indicator USING p_texto TYPE c
p_percent TYPE p.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = p_percent
text = p_texto.
ENDFORM. " f_progress_indicator
*&---------------------------------------------------------------------*
*& Form F_BUSCA_CAMINHO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_P_PATHHD text
*----------------------------------------------------------------------*
form F_BUSCA_CAMINHO changing p_file TYPE file_table-filename.
DATA:
it_path TYPE TABLE OF file_table, "Diretório do arq escolhido
st_path TYPE file_table, "Diretório do arq escolhido
vl_rc TYPE i, "N° de arq ou -1 se erro ocorre
vl_user TYPE i. "Ação do usuário
* Monta título da Janela:
* Msg: Selecione o arquivo desejado e Clique no botão [Abrir]
CLEAR v_title.
MOVE text-003 TO v_title.
* Chamada da caixa de diálogo para busca do arquivo
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = v_title
initial_directory = c_idiret
file_filter = cl_gui_frontend_services=>filetype_text
CHANGING
file_table = it_path
rc = vl_rc
user_action = vl_user
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4.
* Se não executou abertura com sucesso ou não selecionou nenhum arquivo
IF NOT sy-subrc IS INITIAL OR it_path[] IS INITIAL.
* Se usuário não cancelou a abertura ou não fechou a janela
* Atributo ACTION_CANCEL = 9
IF vl_user NE cl_gui_frontend_services=>action_cancel.
* Msg: Arquivo inválido.
MESSAGE i836(sd) WITH text-004.
ELSE.
EXIT.
ENDIF.
ELSE.
* Retornando o diretório ao campo da tela de seleção
CLEAR st_path.
READ TABLE it_path INTO st_path INDEX vl_rc.
IF sy-subrc EQ 0.
MOVE st_path-filename TO p_file.
ENDIF.
ENDIF.
endform. " F_BUSCA_CAMINHO