这是这个问题的后续问题,但不是聚合,我想根据某些条件处理组并且无法找出正确的语法。如果至少有一个组成员具有此状态,我需要排除包含状态为“已删除”的文档的组。
到目前为止我试过了,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
,它只会过滤用于分组的基线,而不是组本身。我需要在 SQL 中有点类似。LOOP...FOR GROUPS
REDUCE
HAVING
更新好的,这是基于 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
Doc 0100000004 有反转线,所以结果应该是
bukrs belnr gjahr buzei xnegp
1000 0100000001 2019
1000 0100000003 2019