quarta-feira, 29 de junho de 2011

' For all Entries in ' Básico

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

Nenhum comentário:

Postar um comentário