" 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
quinta-feira, 27 de outubro de 2011
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
" 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.
" 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
* .
**&---------------------------------------------------------------------*
" 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.
" 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
" 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+.
" 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.
" 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
*& 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
Assinar:
Postagens (Atom)