*&---------------------------------------------------------------------*
" 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.