ABAP 7.57多分组/LET REDUCE聚合实现数据透视需求求助
ABAP多条件分组汇总实现数据透视需求
核心思路
基于ERDAT(日期)、WERKS、LAND1维度分组,通过条件求和分别计算三类数量:
lfimg_t0:仅统计WADAT=ERDAT且ERDAT为当前日(2024.12.18)的LFIMG总和lfimg_older:统计ERDAT早于当前日一天以上的LFIMG总和lfimg_abc:仅统计ERDAT为当前日且ZUKRL包含ABC的LFIMG总和
代码实现
1. 定义常量与日期计算
CONSTANTS: gc_current_date TYPE d VALUE '20241218'. DATA(gc_one_day_before) TYPE d. " 计算当前日的前一天(用于判断"早一天以上") CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' EXPORTING date = gc_current_date days = -1 months = 0 years = 0 IMPORTING calc_date = gc_one_day_before.
2. 分组计算汇总值
根据需求选择分组维度:
- 若需按
日期+WERKS+LAND1透视,分组键包含ERDAT - 若需按
WERKS+LAND1透视,分组键仅保留WERKS和LAND1
" 示例:按WERKS+LAND1分组(数据透视行维度) DATA(lt_grouped) = VALUE #( FOR GROUPS <group> OF wa IN lt_raw GROUP BY ( werks = wa-werks land1 = wa-land1 ) LET " 计算lfimg_t0:当日WADAT=ERDAT的总和 sum_t0 = REDUCE i( INIT x = 0 FOR wa_group IN GROUP <group> NEXT x = x + COND #( WHEN wa_group-wadat = wa_group-erdat AND wa_group-erdat = gc_current_date THEN wa_group-lfimg ELSE 0 ) ) " 计算lfimg_older:早于当前日一天以上的总和 sum_older = REDUCE i( INIT x = 0 FOR wa_group IN GROUP <group> NEXT x = x + COND #( WHEN wa_group-erdat < gc_one_day_before THEN wa_group-lfimg ELSE 0 ) ) " 计算lfimg_abc:当日ZUKRL含ABC的总和 sum_abc = REDUCE i( INIT x = 0 FOR wa_group IN GROUP <group> NEXT x = x + COND #( WHEN wa_group-erdat = gc_current_date AND wa_group-zukrl CS 'ABC' THEN wa_group-lfimg ELSE 0 ) ) IN ( werks = <group>-werks land1 = <group>-land1 lfimg_t0 = sum_t0 lfimg_older = sum_older lfimg_abc = sum_abc ) ).
3. 动态表赋值(RTTS创建的输出表)
通过字段符号绑定动态表的组件,完成数据填充:
FIELD-SYMBOLS: <fs_result> TYPE any, <fs_werks> TYPE werks_d, <fs_land1> TYPE land1, <fs_t0> TYPE i, <fs_older> TYPE i, <fs_abc> TYPE i. LOOP AT lt_grouped ASSIGNING FIELD-SYMBOL(<group_line>). APPEND INITIAL LINE TO gt_result ASSIGNING <fs_result>. " 绑定动态表字段 ASSIGN COMPONENT 'WERKS' OF STRUCTURE <fs_result> TO <fs_werks>. ASSIGN COMPONENT 'LAND1' OF STRUCTURE <fs_result> TO <fs_land1>. ASSIGN COMPONENT 'LFIMG_T0' OF STRUCTURE <fs_result> TO <fs_t0>. ASSIGN COMPONENT 'LFIMG_OLDER' OF STRUCTURE <fs_result> TO <fs_older>. ASSIGN COMPONENT 'LFIMG_ABC' OF STRUCTURE <fs_result> TO <fs_abc>. " 赋值 <fs_werks> = <group_line>-werks. <fs_land1> = <group_line>-land1. <fs_t0> = <group_line>-lfimg_t0. <fs_older> = <group_line>-lfimg_older. <fs_abc> = <group_line>-lfimg_abc>. ENDLOOP.
关键说明
- 使用
GROUPS ... OF实现分组,确保每个维度组合独立计算 REDUCE + COND组合实现条件求和,避免多次循环原始内表- 日期计算使用标准函数,避免硬编码适配不同场景
- 动态表通过字段符号绑定组件,兼容RTTS创建的动态结构
内容的提问来源于stack exchange,提问作者kdobrev
相关产品推荐
相关产品推荐

