segunda-feira, 2 de julho de 2012

Tipos de Selects - Parte 2

  *  Fala galerinha, Hoje vem a segunda parte dos Tipos de selects um pouco
* mais fundo sobre o assunto, mas mesmo assim básico pra qualquer ABAPer,
* ahhhh, tah com o mesmo esquema de break-points do post anterior, bons
* Estudos e qualquer dúvida estamos aih, vou aproveitar e informar que
* o serviço de distribuição de curriculos continua a todo o vapor, to
* falando isso pq recebi alguns emails com essa dúvida. Valeo aeee.
*&---------------------------------------------------------------------*
REPORT z_selects_type.

* Declarações das estruturas e tabelas Internas
DATA :
  it_spfli   TYPE TABLE OF spfli,
  it_sflight TYPE TABLE OF sflight,
  st_spfli   TYPE spfli,
  st_sflight TYPE sflight
  .

* Range's
DATA :
  r_fltime  TYPE RANGE OF spfli-fltime,
  rs_fltime LIKE LINE OF r_fltime.
.

*  Usando Inner Join / Left outer Join, que serve pra alimentar uma
* unica tabela com informações de duas tabelas que tenha pelomenos uma
* relação (campo) em comum.
PERFORM f_inner_join.

*  O famoso 'For all entries' primeiro seleciona normal os dados de uma
* tabela e na segunda tabela são selecionados os registros conforme os
* dados da primeira
PERFORM f_for_all_entries.

* Seleciona com condições especíais.
PERFORM f_cond_especial.


*&---------------------------------------------------------------------*
*&      Form  f_inner_join
*&---------------------------------------------------------------------*
FORM f_inner_join .

  BREAK-POINT.
*  Criação do tipo para a tabela interna que irá conter informações das
* duas tabelas, reparem nos tipos dos campos.
  TYPES :
    BEGIN OF ty_aux,
      carrid    TYPE spfli-carrid,
      connid    TYPE spfli-connid,
      cityfrom  TYPE spfli-cityfrom,
      cityto    TYPE spfli-cityto,
      fldate    TYPE sflight-fldate,
      price     TYPE sflight-price,
      planetype TYPE sflight-planetype,
    END OF   ty_aux
    .

*  Declaraçõs local da estrutura e tabela interna.
  DATA :
    it_aux TYPE TABLE OF ty_aux,
    st_aux TYPE ty_aux.


*  Modo Inner Join Normal
  SELECT spfli~carrid
         spfli~connid
         spfli~cityfrom
         spfli~cityto
         sflight~fldate
         sflight~price
         sflight~planetype
    INTO TABLE it_aux
    FROM sflight
    INNER JOIN spfli
            ON spfli~carrid 'AA'
           AND spfli~connid sflight~connid.

  BREAK-POINT.

  FREE it_aux.

*  Modo Inner Join usando 'apelidos' nas tabelas não muda nada soh a
* a visualização do código que parece mais limpa.
  SELECT a~carrid
         a~connid
         a~cityfrom
         a~cityto
         b~fldate
         b~price
         b~planetype
    INTO TABLE it_aux
    FROM sflight AS b
    INNER JOIN spfli AS a
            ON a~carrid 'AA'
           AND a~connid b~connid.

  BREAK-POINT.

  FREE it_aux.

*  Modo left outer Join, a diferença entre o inner join é que ele traz
* todos os dados inclusive os com valores nulos. ( Nunca Usei, mas vai sabe
* um dia precisemos )
  SELECT a~carrid
         a~connid
         a~cityfrom
         a~cityto
         b~fldate
         b~price
         b~planetype
    INTO TABLE it_aux
    FROM sflight AS b
    LEFT OUTER JOIN spfli AS a
            ON a~carrid 'JL'
           AND a~connid b~connid.

  BREAK-POINT.

  FREE it_aux.

ENDFORM.                    " f_inner_join

*&---------------------------------------------------------------------*
*&      Form  f_for_all_entries
*&---------------------------------------------------------------------*
FORM f_for_all_entries .

* Obs. Nunca esqueça de identificar a tabela nivel Header e tabela Nivel Item.
* ( SPFLI - Nivel Header e SFLIGHT - Nivel Item ).

  SELECT *
    FROM spfli
    INTO TABLE it_spfli
    WHERE carrid 'AA'.

  BREAK-POINT.

  SELECT *
    FROM sflight
    INTO TABLE it_sflight
    FOR ALL ENTRIES IN it_spfli
    WHERE carrid it_spfli-carrid
      AND connid it_spfli-connid.

* Ordenação da tabela final
  SORT it_sflight.

  BREAK-POINT.

ENDFORM.                    " f_for_all_entries

*&---------------------------------------------------------------------*
*&      Form  f_cond_especial
*&---------------------------------------------------------------------*
FORM f_cond_especial .

*  Operações | Equivalentes
*      =     |     EQ
*      <>    |     NE
*      <     |     LT
*      >     |     GT
*      <=    |     LE
*      >=    |     GE


* Select simples com condições
  SELECT *
    FROM spfli
    INTO TABLE it_spfli
    WHERE fltime > 500
      AND fltime < 1000.

  BREAK-POINT.
  FREE it_spfli.

* Select simples com condições entre campos da mesma tabela
  SELECT *
    FROM sflight
    INTO TABLE it_sflight
    WHERE seatsmax_f sflight~seatsocc_f.

  BREAK-POINT.
  FREE it_sflight.

*  Select simples com operações equivalentes comparando campos da
* mesma tabela.
  SELECT *
    FROM sflight
    INTO TABLE it_sflight
    WHERE seatsmax_f GT sflight~seatsocc_f.

  BREAK-POINT.
  FREE it_sflight.

*  Select onde a condição é um intervalo
  SELECT carrid connid fltime
    FROM spfli
    INTO CORRESPONDING FIELDS OF TABLE it_spfli
    WHERE fltime BETWEEN 500 AND 1000.

  BREAK-POINT.
  FREE it_spfli.

*  Select onde a condição é um intervalo usando Range. Não lembra
* o que é Range veja link abaixo.
*  http://abapjuniores.blogspot.com.br/2011/03/ranges.html

  rs_fltime-sign   'I'.
  rs_fltime-option 'BT'.
  rs_fltime-low    '500'.
  rs_fltime-high   '1000'.
  APPEND rs_fltime TO r_fltime.

  SELECT carrid connid fltime
    FROM spfli
    INTO CORRESPONDING FIELDS OF TABLE it_spfli
    WHERE fltime in r_fltime.

  BREAK-POINT.
  FREE it_spfli.

ENDFORM.                    " f_cond_especial
Comentários
0 Comentários

Nenhum comentário:

Postar um comentário