Это дополнительный вопрос для этого , но вместо агрегации я хочу обрабатывать группы на основе некоторого условия и не могу определить правильный синтаксис для этого.Мне нужно исключить группы, которые содержат документы со статусом «удален», если хотя бы один из членов группы имеет этот статус.
Я пробовал до сих пор GROUP...WITHOUT MEMBERS
, LOOP...FOR GROUPS
, REDUCE
, и это решение, которое я в итоге получаю
DATA(lt_valid_doc) = VALUE tt_struct(
FOR ls_valid IN VALUE tt_struct(
FOR GROUPS <group_key> OF <wa> IN lt_ilot
GROUP BY ( guid = <wa>-guid guid2 = <wa>-guid2 ) ASCENDING
LET not_deleted = REDUCE #( INIT valid TYPE t_ref_s_struct
FOR <m> IN GROUP <group_key>
NEXT valid = COND #(
WHEN valid IS NOT BOUND OR <m>-stat = 'I1040'
THEN REF #( <m> ) ELSE valid ) )
IN ( not_deleted->* ) )
WHERE ( status NE 'I1040' )
( ls_valid ) ).
Однако это решение кажетсяизбыточный для меня (фильтр I1040
указан дважды).Существует ли какой-либо синтаксис, позволяющий сделать это в одном операторе (REDUCE
, GROUP
или чем-либо еще), не создавая вложенную таблицу на лету и не фильтруя ее, как я делаю сейчас?
Если я использую WHERE
условие для всех вышеприведенных операторов (GROUP...WITHOUT MEMBERS
, LOOP...FOR GROUPS
и REDUCE
) - оно фильтрует только строки base для группировки, а не сами группы.Мне нужно что-то похожее на HAVING
в SQL.
UPDATE ОК, вот реальный компилируемый пример на основе таблицы BSEG.Задача состоит в том, чтобы найти только не переписанные документы, т.е. исключить все документы с перевернутыми (XNEGP = true) строками.
TYPES: BEGIN OF t_s_bseg,
bukrs TYPE bseg-bukrs,
belnr TYPE bseg-belnr,
gjahr TYPE bseg-gjahr,
buzei TYPE bseg-buzei,
xnegp TYPE bseg-xnegp,
END OF t_s_bseg,
tt_bseg TYPE SORTED TABLE OF t_s_bseg WITH EMPTY KEY.
TYPES: t_ref_s_bseg TYPE REF TO t_s_bseg.
DATA(lt_valid_fi_doc) = VALUE tt_bseg(
FOR ls_valid IN VALUE tt_bseg(
FOR GROUPS <group_key> OF <wa> IN lt_bseg
GROUP BY ( bukrs = <wa>-bukrs belnr = <wa>-belnr gjahr = <wa>-belnr ) ASCENDING
LET not_reversed = REDUCE #( INIT valid TYPE t_ref_s_bseg
FOR <m> IN GROUP <group_key>
NEXT valid = COND #(
WHEN valid IS NOT BOUND OR <m>-xnegp = abap_true
THEN REF #( <m> ) ELSE valid ) )
IN ( not_reversed->* ) )
WHERE ( xnegp NE abap_true )
( ls_valid ) ).
Входные строки
bukrs belnr gjahr buzei xnegp
1000 0100000001 2019 1
1000 0100000001 2019 2
1000 0100000003 2019 1
1000 0100000003 2019 2
1000 0100000004 2019 1
1000 0100000004 2019 2 X
Док 0100000004 имеет перевернутую строку, поэтому результат должен быть
bukrs belnr gjahr buzei xnegp
1000 0100000001 2019
1000 0100000003 2019