FILTER
A função FILTER é nova e ainda pouco conhecida. Vou dar-te um exemplo de como pode ser usada.
Imagina um cenário em que tens duas tabelas internas, uma com os cabeçalhos e outroa com os ítens de um documento:
SELECT * FROM vbak INTO TABLE headers.
SELECT * FROM vbap INTO TABLE items.
Tens de fazer LOOP aos cabeçalhos e depois processar os ítens. O normal é fazer algo assim:
LOOP AT headers INTO FINAL(header).
calculate_doc_quantity(
header = header
items = items ).
ENDLOOP.
METHOD calculate_doc_quantity.
RETURN REDUCE #(
INIT quantity TYPE mng13
FOR item IN items
WHERE ( vbeln = header-vbeln )
NEXT quantity = quantity + item-lfmng ).
ENDMETHOD.
Repara que enviamos os itens todos para dentro do process_header e depois, lá dentro, temos de filtrar só pelos que realmente pertencem ao cabeçalho actual. É muito feio e não faz sentido. Só não estranhamos porque estamos treinados a achar esta aberração normal.
Agora repara nesta versão alternativa que faz uso do FILTER:
LOOP AT headers INTO FINAL(header).
FINAL(header_items) = FILTER #( items WHERE vbeln = header-vbeln ).
calculate_doc_quantity( header_items ).
ENDLOOP.
METHOD calculate_doc_quantity.
RETURN REDUCE #(
INIT quantity TYPE mng13
FOR item IN items
NEXT quantity = quantity + item-lfmng ).
ENDMETHOD.
Já viste? Não é melhor? Nota como lá dentro não é necessário filtrar os items porque já só tens os que tem interessam. E nota também como, por causa disso, já nem é preciso passar o cabeçalho. Do ponto de vista semântico esta abordagem é muito mais saudável, mais fácil de entender e manter.
O Abapinho saúda-vos.