quinta-feira, 27 de outubro de 2011

Tela de seleção Dinâmica

  "  Tem uma dica de tela que todo o usuário gosta, que é deixar a tela dinâmica
" mostrando somente o que o usuário precisa conforme a necessidade, o código é
" simples e é um tipo de código muito usado, segue código abaixo.

REPORT zmjdinamicscreen.

" Tabelas transparentes ...
TABLES :
  ekko,
  ekpo
  .

" Constantes ...
CONSTANTS :
  c_r1(02)     TYPE c VALUE 'R1',           "Grupo campo tela seleção
  c_r2(02)     TYPE c VALUE 'R2'            "Grupo campo tela seleção
.

" Tela de seleção ...

*text-p03 = Opções de Processamento
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-p03.
PARAMETERS:
"  Olhem esse negocio de 'user command' é isso que informa que deve realizar
" alguma coisa antes de continuar,
  p_blc1    RADIOBUTTON GROUP gp01 DEFAULT 'X'
                             USER-COMMAND radio,
  p_blc2    RADIOBUTTON GROUP gp01
  .
SELECTION-SCREEN END OF BLOCK b1.


SELECTION-SCREEN BEGIN OF BLOCK b2.
PARAMETERS:
"  Aqui eu criei um parameters normal mas eu criei um ID para ele,
" informando que o campo 'group1' deste parameters recebe o valor 'r2'
" separando-o dos outros objetos da tela de seleção.
  p_bloc1  TYPE file_table-filename DEFAULT 'Bloco 1'
    MODIF ID r2
  .
SELECTION-SCREEN END   OF BLOCK b2.

SELECTION-SCREEN BEGIN OF BLOCK b3.
PARAMETERS:
"  Fiz igualzinho ao de cima mas agora o valor e diferente, tendo o 'r1'
" para o campo 'group1' de cada parameters abaixo.
  P_bloc21  TYPE file_table-filename DEFAULT 'Bloco 21'
      MODIF ID r1,
  P_bloc22  TYPE file_table-filename DEFAULT 'Bloco 22'
      MODIF ID r1,
  P_bloc23  TYPE file_table-filename DEFAULT 'Bloco 23'
      MODIF ID r1
  .
SELECTION-SCREEN END   OF BLOCK b3.


*----------------------------------------------------------------------*
* At Selection-Screen                                                  *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

* Conforme opção de processamento, desabilita campos da tela.

  IF NOT p_blc1 IS INITIAL.
    PERFORM f_controla_tela USING c_r2.
  ELSE.
    PERFORM f_controla_tela USING c_r1.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  f_controla_tela
*&---------------------------------------------------------------------*
*       Mostra e oculta os campos  da tela de seleção conforme opção
* de processamento escolhido
*----------------------------------------------------------------------*
*      -->p_campo    Campo que deve se habilitado
*----------------------------------------------------------------------*
FORM f_controla_tela USING p_campo TYPE c.

" Dá o loop em cada objeto da tela.
  LOOP AT SCREEN.

" Condicão para ativar ou desativar, Mostra ou não mostra na tela .
    IF screen-group1 NE p_campo AND
     NOT screen-group1 IS INITIAL.
      screen-active = 0.
    ELSE.
      screen-active = 1.
    ENDIF.

    MODIFY SCREEN.
  ENDLOOP.

ENDFORM.                    " f_controla_tela

quarta-feira, 26 de outubro de 2011

Função - TMP_GUI_DIRECTORY_LIST_FILES

  *&---------------------------------------------------------------------*
"  As vezes devemos trabalhar com arquivos que estão na rede, sabendo
" o endereço do diretório; com esta função você consegue listar os arquivos
" e pastas que existem no mesmo.

REPORT zmjteste.

" Diretório : ...
PARAMETERS: p_dir TYPE file_table-filename.

" Variáveis ...
DATA: v_title      TYPE string,              "Título da Janela
      v_folder     TYPE string,              "Diretório selecionado
      vg_filecount TYPE i,
      vg_dircount  TYPE i,
      it_filetab   TYPE TABLE OF sdokpath,
      it_dirtable  TYPE TABLE OF sdokpath
      .
" At select ....
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dir.
  PERFORM f_busca_arquivo CHANGING p_dir.

" Start-of-selection ...
START-OF-SELECTION.

  PERFORM :
  " pega os arquivos e pastas do diretório informado.
    f_get_files,
  " mostra os mesmos.....
    f_show_this.

*&---------------------------------------------------------------------*
*&      Form  F_BUSCA_ARQUIVO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_P_DIR  text
*----------------------------------------------------------------------*
FORM f_busca_arquivo  CHANGING p_file  TYPE file_table-filename.


  CLEAR: v_title, v_folder.

* Monta título da Janela:
* Msg: Selecione a Pasta Desejada para gravação do arquivo e Clique no
* Botão [OK]
  MOVE text-001 TO v_title.

* Chamada da janela para busca de diretório
  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title         = v_title
      initial_folder       = 'C:/'
    CHANGING
      selected_folder      = v_folder
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.

* Se não executou abertura com sucesso
  IF sy-subrc NE 0.

*   Msg: Erro na busca do diretório.
    MESSAGE i836(sd) WITH text-002.

* Retornando o diretório ao campo da tela de seleção
  ELSE.
    MOVE v_folder TO p_file.
  ENDIF.

ENDFORM.                    " F_BUSCA_ARQUIVO

*&---------------------------------------------------------------------*
*&      Form  F_GET_FILES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_get_files .

  CALL FUNCTION 'TMP_GUI_DIRECTORY_LIST_FILES'
    EXPORTING
      directory  = p_dir  " Diretório
      filter     = '*.*'  " Tipo de arquivo
    IMPORTING
      file_count = vg_filecount
      dir_count  = vg_dircount
    TABLES
      file_table = it_filetab  " Tabelas com os arquivos
      dir_table  = it_dirtable " Tabela com as pastas
    EXCEPTIONS
      cntl_error = 1
      OTHERS     = 2.

  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_GET_FILES


*&---------------------------------------------------------------------*
*&      Form  F_SHOW_THIS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_show_this .

  DATA : st_filetab  LIKE LINE OF it_filetab,
         st_dirtable LIKE LINE OF it_dirtable.

  WRITE : / 'Arquivos', / .
  LOOP AT it_filetab INTO st_filetab.
    WRITE : / st_filetab-pathname.
  ENDLOOP.

  WRITE :  / , / 'Pastas', / .
  LOOP AT it_dirtable INTO st_dirtable.
    WRITE : / st_dirtable-pathname.
  ENDLOOP.

ENDFORM.                    " F_SHOW_THIS

Soma por chave ( COLLECT )

  *&---------------------------------------------------------------------*
"  Se tiver querendo somar algo por alguma chave, usamos o 'COLLECT' ele
" funciona como um 'APPEND' mas antes de coloca o registro na tabela ele
" verifica se já existe este registro, se existir ( conforme chave ) é
" feito a adição do registro somando o ultimo campo.

" A chave são todos os campos anteriores, portanto se ele encontrar algo
" diferente neste campos isso é considerado outro registro.

report zmjcollect.

" Tipos ...
" Tipo a - Chaves ( carrid, connid, fldate )
TYPES :
  BEGIN OF ty_soma_a,
    carrid TYPE sflight-carrid,
    connid TYPE sflight-connid,
    fldate TYPE sflight-fldate,
    price  TYPE sflight-price,
  END OF   ty_soma_a,

" Tipo b - Chaves ( carrid, connid )
  BEGIN OF ty_soma_b,
    carrid TYPE sflight-carrid,
    connid TYPE sflight-connid,
    price  TYPE sflight-price,
  END OF   ty_soma_b
  .

" Tabelas internas ...
data : it_sflight TYPE TABLE OF sflight,
       it_sfsomaa TYPE TABLE OF ty_soma_a,
       it_sfsomab TYPE TABLE OF ty_soma_b
       .

" Estruturas ...
data : st_sflight TYPE sflight,
       st_sfsomaa TYPE ty_soma_a,
       st_sfsomab TYPE ty_soma_b
       .

BREAK-POINT.


" Alimentação da tabela principal
SELECT *
  from sflight
  into TABLE it_sflight
  UP TO 100 rows
  .

" Ordenando tabela principal conforme condições
sort it_sflight by carrid ASCENDING
                   connid ASCENDING
                   fldate ASCENDING
                   .

" Loop na tabela principal
  LOOP AT it_sflight INTO st_sflight.
" Movo os campos correspondentes da estrutura principal para uma estrut. aux.
" que é do mesmo tipo que a tabela do 'Collect'.
    MOVE-CORRESPONDING st_sflight to st_sfsomaa.
" Aqui tah a mágica
    COLLECT st_sfsomaa INTO it_sfsomaa.

" Movo os campos correspondentes da estrutura principal para uma estrut. aux.
" que é do mesmo tipo que a tabela do 'Collect'.
    MOVE-CORRESPONDING st_sflight to st_sfsomab.
" Aqui tah a mágica (dinovo)
    COLLECT st_sfsomab INTO it_sfsomab.

  ENDLOOP.

" Ordenando as tabelas auxiliares.
  SORT : it_sfsomaa,
         it_sfsomab
         .

  BREAK-POINT.

terça-feira, 25 de outubro de 2011

Campos a mais que o 'Default'

  *&---------------------------------------------------------------------*
"  Como sempre precisamos selecionar campos que estão em tabelas transpa-
" rentes, então criamos uma tabela interna e uma estrutura com o mesmo tipo
" que a tabela transparente, mas as vezes precisamos incluir campos que não
" existem nessa tabela, pra fazer isso usamos o comando 'INCLUDE STRUCTURE'
" na declaração do tipo conforme abaixo.

REPORT zfield_ex.

" Tipos
"  Reparem aonde começa e termina o tipo.
TYPES BEGIN OF ty_eban.
"  Inclusão dos campos da tabela EBAN no tipo TY_EBAN
        INCLUDE STRUCTURE eban.
"  Inclusão do campo saldo SALDOQ no tipo TY_EBAN
TYPES  : saldoq TYPE c,
      END OF   ty_eban.


" Tabela interna.
data : it_eban TYPE TABLE OF ty_eban.


BREAK-POINT.

SELECT *
  from eban
  into TABLE it_eban.

BREAK-POINT.

**&---------------------------------------------------------------------*
*" Se quiserem também pode declarar direto a tabela, mas eu não aconselho,
*" porisso eu deixei comentado mais como item de curiosidade rsrs, é que
*" programas standards as vezes usam.
*
*data BEGIN OF it_eban_direto.
*    include STRUCTURE eban.
*data: teste TYPE mara-matnr,
*     END OF   it_eban_direto
*  .
**&---------------------------------------------------------------------*

quarta-feira, 12 de outubro de 2011

Field Symbol - Tabela dinâmica

  *&---------------------------------------------------------------------*
"  Tem uma maneira muito interessante pra quem gosta de resolver as coisas
" de uma forma mais rápida é usando o 'Field-Symbol' que serve como um link
" com algum objeto ou area de memória, mostrarei uma jeito legal pra aplicar
" o 'field-Symbol'.

"  Irei mostrar como modificar dados de uma tabela interna da forma tradici-
" onal e da forma rápida (dinâmica).

REPORT  z_field_symbol.

" Declaração da tabela interna e da estrutura.
DATA : it_spfli TYPE TABLE OF spfli,
       st_spfli TYPE          spfli
       .

" Alimenta a tabela interna .
SELECT *
  FROM spfli
  INTO TABLE it_spfli
  .

" Aqui está a forma tradicional, muito eficaz, mas normal rsrsrs
LOOP AT it_spfli INTO st_spfli.

  st_spfli-fltype 'X'.
  modify it_spfli from st_spfli.

ENDLOOP.


" Aqui da forma mais rápida e dinâmica.
" Declaração dos fields symbols.
FIELD-SYMBOLS : <fs2> type spfli.

BREAK-POINT .

** Altera dinamicamente os dados da tabela interna.
LOOP AT it_spfli ASSIGNING <fs2>.
  <fs2>-fltype 'X'.
" Reparem bem que não existe nenhum modify.
ENDLOOP.

segunda-feira, 10 de outubro de 2011

Função - Read Text

  *----------------------------------------------------------------------*
"  Função usada para trazer o texto dos objetos, lembrado que caso vc não
" saiba id do texto, procure na tabela transparente TTXIT que nesta tabela
" mostra todas as informações de chaves para trazer o texto.

REPORT zmj_read_text.

"
data : c_id_c   TYPE tdid     VALUE 'F01',  " ID de texto (cabec)
       v_nm_txt TYPE thead-tdname,          " Chave de busca do Texto Cabec
       c_obj_c  TYPE tdobject VALUE 'EKKO'" obj. de aplicação (cabec)
       it_lines TYPE TABLE OF tline,        "linhas de textos (cabec)
       st_lines TYPE          tline
       .


PERFORM f_bapi_texto_cabec USING '0000000001'.


FORM f_bapi_texto_cabec USING v_nm_txt.

** O nome do texto (chave) é o Nº do documento de compras
*  v_nm_txt = '0000000001'.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      = c_id_c
      language                = sy-langu
      name                    = v_nm_txt
      object                  = c_obj_c
    TABLES
      lines                   = it_lines
    EXCEPTIONS
      id                      = 1
      language                = 2
      name                    = 3
      not_found               = 4
      object                  = 5
      reference_check         = 6
      wrong_access_to_archive = 7
      OTHERS                  = 8.


BREAK-POINT.


  IF sy-subrc EQ 0.

    LOOP AT it_lines INTO st_lines.
      WRITE  st_lines.
    ENDLOOP.

* Gera mensagem de informação no Log de Processamento
  ELSE.

    MESSAGE 'Texto não encontrado' TYPE 'I'.

  ENDIF.

ENDFORM.                    " f_bapi_texto_cabec

Relacionamento de tabelas

  "  Um dos grandes problemas de um Abap é saber o relacionamento entre as
" tabelas que você está trabalhando, qual é o header, qual é o item, aonde 
" eu pego a informação disso, quais são as chaves que devo usar na cláusula 
" 'where' do meu 'For all entries', bem..... tem em bastante lugar um 
" arquivo .pdf com os relacionamentos de tabelas mais usadas, mas eu irei
" mostrar como faz pra ver esse relacionamento dentro do SAP mesmo,
" Iremos primeiro na transação se11, e colocar no campo tabela TTXIT   


 

"  Dentro da tela principal do tabela veremos que existe um botãozinho que
" está do lado do botão 'conteúdo', chamado 'Gráfico', conforme imagem abaixo.





" Após clicar neste botão irá aparecer está tela.





" Esta tela mostra a tabela que você está, e todas as outras tabelas q fazem
" contato com ela, eu peguei a tabela TTXIT porque eu sabia que a relação era
" pequena, mas todas as tabelas têm, peguem uma tabela grande como mara ou
" kna1 pra vocês verem o relacionamento monstro que tem.. rsrs
"  Se forem atentos vocês perceberam que existe uma linha que conecta as 
" tabelas umas com as outras, clique duas vezes nessa linha...



"  Prontinho, nesta tela você consegue visualizar os campos que fazem o 
" relacionamento entre as duas tabelas assim.

"  Desse jeito que eu mostrei a gente consegue visualizar as tabelas que 
" fazem relação com a tabela principal e ainda mostra as chaves de relaciona-
"mento entre elas, isso pode ajudar muito você em seus selects porai.

"  Espero ter ajudado vocês, continuem mandando emails com sugestões e opniões,
" prometo que estarei atendendo o máximo possivel.. t+.

Vendo valor específico no Debbuger

  "  As vezes trabalhamos com tabelas que são do tipo de tabelas transparentes
" que tem uma quantidade grande de campos, quando estamos debugando vemos
" que o campo que vc precisa não aparece na tabela, pra resolver isso é 
" muito simples...


 

"  Conforme a imagem acima devemos primeiro identificar a linha do registro
" que queremos ver, depois colocar o nome do campo, vc clicando duas vezes na 
" tabela interna vc não vê o campo mas ele existe e fazendo isso ele mostra
" este campo especifico num registro especifico.

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