" Bem galera, vou mostrar algo que é muito importante que são as melhorias
" e aplicações em programas standards, conhecidos como enhancements.
" Os enhancements servem para colocar algum processo, ou para trazer
" informações de objetos standards sem modificar o código.
" Para começar a fazer isso você deve saber primeiro indentificar o lugar
" mas só isso não adianta, depois de identificar você deve encontrar os
" 'enhancements points' que são pontos dentro do programa onde você pode
" colocar o código. Para encontrar faça :
" Primeiramente clique no botão 'Enhance' pra começa a trabalha com as
" melhorias.
" Após isso, vá no menu 'Edit/ Enhanciments Operations / Show Implicit
" enhancements options'
" Fazendo isso irá mostrar algumas linhas cheias de aspas duplas tipo
" assim """"""" ... Clicando com o botão direito neles aparecerá a opção
" 'enhancements implementetion/create' conforme abaixo.
" Agora eh soh criar, o enhanciment, caso queira crie o 'composite enhancement
" implementation' para uma melhor organização.
" Falando em organização não faça que nem eu fiz.... crie um include pra
" ficar mais organizado e facil de dar manutenção, sem conta que é muito feio
" ver todo akele código no meio do standard.
" Este brinquedinho e muito útil mas não sai testando em programas standards
" sem o conhecimento do chefe rsrsrs... portanto pra treinar faça num programa
" 'Z' mesmo, oq não faz muito sentido, eu sei, mas para prática está otimo.
quinta-feira, 3 de novembro de 2011
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
" 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
" 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+.
Assinar:
Postagens (Atom)