使用动态组密钥在..GROUP BY处循环



我正试图通过使用动态组参数对数据进行分组来进行循环。

我们可以在循环的WHERE条件上使用动态查询,但我不知道是否可以在组条件中使用动态字符串。

下面是一个示例,用户决定将哪个字段分组,然后根据该决定添加额外的逻辑:

DATA query TYPE string.
IF i_condition_type = 'ERNAM'.
query = |ERNAM = MARA-ERNAM|.
ELSE.
query = |ERSDA = MARA-ERSDA|.
ENDIF.
LOOP AT lt_mara INTO DATA(mara) GROUP BY ( (query) ) "syntax error
ASSIGNING FIELD-SYMBOL(<group>).
LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<line_data>).
"//do something
ENDLOOP.
ENDLOOP.

有办法做到这一点吗?除了分组,我还对其他想法持开放态度,因为如果我不能动态分组,我会复制很多行,只更改组键。

正如注释中所指出的,LOOP AT ... GROUP BY不支持字符串中的动态分组子句。

在这个简单的示例中,您可以在运行时通过使用CONDSWITCH:之类的内联表达式来动态创建分组密钥

LOOP AT lt_mara INTO DATA(mara) GROUP BY 
SWITCH string(
i_condition_type
WHEN 'ERNAM' THEN mara-ernam
WHEN 'ERSDA' THEN mara-ersda
ELSE ''
)

但是你的关键构建逻辑可能太复杂了,无法用表达式(或者至少是一个人类仍然可读的表达式(来表达。在这种情况下,您还可以做其他事情:对方法返回的值进行分组:

LOOP AT lt_mara INTO DATA(mara) 
GROUP BY my_grouping_method( line = mara 
condition = i_condition_type )

然后,该方法的实现可以包括在运行时形成分组密钥所需的任何逻辑:

METHOD my_grouping_method.
IF condition = 'ERNAM'.
result = line-ernam.
ELSE.
result = line-ersda.
ENDIF.    
ENDMETHOD.

分组方法也可以是不同对象的方法。因此,您可以将分组条件表示为自己的类。这将允许你写这样的代码:

DATA(lo_group_condition) = NEW zcl_mara_group_condition( 'ERNAM' ). 
LOOP AT lt_mara INTO DATA(mara) 
GROUP BY lo_group_condition->get_key_from( mara )

最新更新