LOOP AT ... GROUP BY 使用动态组键

LOOP AT... GROUP BY with dynamic group key

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

我们可以在循环的 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.

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

 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 )