segunda-feira, 10 de outubro de 2011

Method - cl_gui_frontend_services=>gui_upload

  *&---------------------------------------------------------------------*
*& 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
Comentários
0 Comentários

Nenhum comentário:

Postar um comentário