" Vamos fazer um select bem simples usando o comando 'for all entries in',
" esse comando é mais usado do que o 'Inner Join' pois é mais claro
" para dar manutenção.
REPORT zselect_data.
" Tabelas transparentes ....
TABLES : mara
.
" Tipos .....
TYPES :
BEGIN OF ty_mara,
matnr TYPE mara-matnr,
ersda TYPE mara-ersda,
ernam TYPE mara-ernam,
END OF ty_mara,
BEGIN OF ty_makt,
matnr TYPE makt-matnr,
spras TYPE makt-spras,
maktx TYPE makt-maktx,
END OF ty_makt,
BEGIN OF ty_mard,
matnr TYPE mard-matnr,
werks TYPE mard-werks,
lgort TYPE mard-lgort,
pstat TYPE mard-pstat,
END OF ty_mard,
BEGIN OF ty_outtab,
check TYPE c,
matnr TYPE mara-matnr,
ersda TYPE mara-matnr,
maktx TYPE makt-maktx,
werks TYPE mard-werks,
lgort TYPE mard-lgort,
pstat TYPE mard-pstat,
END OF ty_outtab
.
" Estruturas ....
DATA : st_mara TYPE ty_mara,
st_makt TYPE ty_makt,
st_mard TYPE ty_mard,
st_outtab TYPE ty_outtab,
st_outtab2 TYPE ty_outtab
.
" Tabelas internas ....
DATA : it_mara TYPE TABLE OF ty_mara,
it_makt TYPE TABLE OF ty_makt,
it_mard TYPE TABLE OF ty_mard,
it_outtab TYPE TABLE OF ty_outtab,
it_outtab2 TYPE TABLE OF ty_outtab
.
" Tela de seleção .....
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS : so_matnr FOR mara-matnr.
PARAMETERS : p_spras TYPE makt-spras,
p_werks TYPE mard-werks,
p_lgort TYPE mard-lgort
.
SELECTION-SCREEN END OF BLOCK b1.
" Start of selection .....
START-OF-SELECTION.
PERFORM z_select_mara.
" Confere se retornou dados no select
IF sy-subrc = 0.
PERFORM z_select_makt.
PERFORM z_select_mard.
ELSE.
MESSAGE 'Não foi encontrados registro(s) com os dados informados ' TYPE 'I'.
ENDIF.
PERFORM : z_feed_table,
z_show_data.
*&---------------------------------------------------------------------*
*& Form Z_SELECT_MARA
*&---------------------------------------------------------------------*
" Seleciona os dados da tabela MARA e passa os campos selecionados para dentro
" da tabela interna, tente sempre especificar os campos que vc quer trabalhar
" para garantir uma performance melhor nunca coloque '*', nunca esqueça tb de
" colocar os campos na mesma ordem que está na tabela standard e pra melhorar o
" select tente sempre coloca todas as chaves primarias da tabela.
FORM z_select_mara .
" pega os campos matnr, ersda e Ernam ...
SELECT matnr
ersda
ernam
" da tabela mara ...
FROM mara
" e coloca na tabela interna 'it_mara' ....
INTO TABLE it_mara
" só pegue os 100 primeiros registros
UP TO 100 ROWS
" a condição eh que soh pegue o registros que contenham no select options.
WHERE matnr IN so_matnr
.
ENDFORM. " Z_SELECT_MARA
*&---------------------------------------------------------------------*
*& Form Z_SELECT_MAKT
*&---------------------------------------------------------------------*
FORM z_select_makt .
" Seleciona os dados da tabela MAKT e passa os campos selecionados para dentro
" da tabela interna,
SELECT matnr
spras
maktx
" da tabela MAKT ...
FROM makt
" e coloca na tabela interna 'it_makt' ....
INTO TABLE it_makt
" para todas as entradas da tabela 'it_mara' (que jah esta preenchida)
FOR ALL ENTRIES IN it_mara
" com estas condições, lembrando que tem que relacionar as tabelas nas condições
WHERE matnr = it_mara-matnr
AND spras = p_spras
.
ENDFORM. " Z_SELECT_MAKT
*&---------------------------------------------------------------------*
*& Form Z_SELECT_MARD
*&---------------------------------------------------------------------*
FORM z_select_mard .
" faz o mesmo que o select de cima. rsrs
SELECT matnr
werks
lgort
pstat
FROM mard
INTO TABLE it_mard
FOR ALL ENTRIES IN it_mara
WHERE matnr = it_mara-matnr
AND werks = p_werks
AND lgort = p_lgort
.
ENDFORM. " Z_SELECT_MARD
*&---------------------------------------------------------------------*
*& Form Z_feed_table
*&---------------------------------------------------------------------*
FORM z_feed_table .
" Esse loop eh muito importante, debbungando vc verá que ele pega
" o primeiro registro e joga na estrutura...
LOOP AT it_mara INTO st_mara.
" depois lê as tabelas jogando pra um estrutura tb, se atender as
" condições
READ TABLE it_makt INTO st_makt WITH KEY matnr = st_mara-matnr
spras = p_spras.
READ TABLE it_mard INTO st_mard WITH KEY matnr = st_mara-matnr
werks = p_werks
lgort = p_lgort .
" Aki é alimentado a estrutura com os valores que foram solicitados,
st_outtab-check = space.
st_outtab-matnr = st_mara-matnr.
st_outtab-ersda = st_mara-ersda.
st_outtab-maktx = st_makt-maktx.
st_outtab-werks = st_mard-werks.
st_outtab-lgort = st_mard-lgort.
st_outtab-pstat = st_mard-pstat.
" depois da estrutura devidamente preenchida este registro eh colocado
" numa tabela de saida que poderá ser usado para preencher Relatório ALV
APPEND st_outtab TO it_outtab.
" Limpa a estrutura pra naum leva sujeira e começa o Loop tudo denovo.
CLEAR : st_outtab.
ENDLOOP.
ENDFORM. " Z_feed_table
*&---------------------------------------------------------------------*
*& Form Z_SHOW_DATA
*&---------------------------------------------------------------------*
FORM z_show_data .
" Mostra os dados da tabela de saida
LOOP AT it_outtab INTO st_outtab.
WRITE : / st_outtab.
ENDLOOP.
ENDFORM. " Z_SHOW_DATA