* 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