ABAP动态内表实现动态GROUP BY及动态字段求和问题咨询
ABAP 动态内表动态GROUP BY及动态字段求和实现方案
可行实现方案
问题1:动态GROUP BY逻辑实现
你当前硬编码SWITCH拼接分组规则的方式无法适配50+分组场景,可通过动态生成分组键字符串的方式实现全动态分组:
- 先维护配置表,维护每个
Factor_Type对应的分组字段列表,比如配置表结构为:Factor_TYPE+SEQ+GROUP_FIELD,按顺序存储每种类型对应的分组字段名 - 运行时根据当前
Factor_Type取出对应的所有分组字段,循环将每个字段的值用特殊分隔符(比如不会出现在业务数据里的^|^)拼接成唯一的分组键字符串,直接作为GROUP BY的键即可,不需要硬编码任何分组逻辑
问题2:动态字段求和实现
不需要在REDUCE里硬编码字段名,通过ASSIGN COMPONENT动态分配字段引用即可实现动态取值:
- 同样在配置表中维护每个
Factor_Type对应的需求和的百分比字段名 - 循环取值时先动态分配字段到字段符号,直接累加字段符号的值即可
完整示例代码
" 1. 提前从配置表取当前Factor_Type对应的配置数据 DATA: lt_group_fields TYPE STANDARD TABLE OF fieldname, " 分组字段列表 lv_sum_field TYPE fieldname. " 求和字段名 " 这里替换成你自己的配置表读取逻辑,根据lv_factor_type取到lt_group_fields和lv_sum_field " 2. 动态分组+求和逻辑 LOOP AT <fs_table> ASSIGNING FIELD-SYMBOL(<fs_line>) GROUP BY VALUE string( " 动态拼接分组键 LET lv_key TYPE string INITIAL `` IN FOR lv_field IN lt_group_fields NEXT lv_key = |{ lv_key }{ ASSIGN val = <fs_line>->*(lv_field) }^|^| ) ASCENDING ASSIGNING FIELD-SYMBOL(<fs_group>). " 直接在REDUCE里对当前分组动态求和,不需要额外中转临时内表 DATA(lv_total) = REDUCE i( INIT sum = 0 FOR <fs_mem> IN GROUP <fs_group> NEXT sum = sum + COND #( LET <lv_perc> TYPE i OPTIONAL IN ASSIGN COMPONENT lv_sum_field OF STRUCTURE <fs_mem> TO <lv_perc> WHEN <lv_perc> IS ASSIGNED THEN <lv_perc> ELSE 0 ) ). IF lv_total > 100. " 你的导出逻辑,可从<fs_group>里拆分出各分组字段值,或者存储分组键字符串 ENDIF. ENDLOOP.
补充说明
- 如果需要拆分分组键获取每个分组字段的原值,用
SPLIT按分隔符拆分即可 - 若担心分隔符和业务数据冲突,可改用RTTI动态构造分组结构作为GROUP BY的键,逻辑和拼接字符串类似,只是把分组值放到动态结构的对应字段里即可
- 如果是7.40以下ABAP版本,把动态取字段值的
->*写法替换成ASSIGN COMPONENT语法即可兼容 - 动态取字段时加了
IS ASSIGNED校验,可避免配置错误导致程序dump
内容的提问来源于stack exchange,提问作者HatriGt Ace
相关产品推荐
相关产品推荐

