You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:58:20