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

基于SAP系统表EKBE 无LOOP实现内表分组汇总求和

ABAP EKBE表按采购凭证分组汇总数量实现方案

针对基于EKBE表查询结果按EBELN、EBELP分组汇总MENGE并写入同组所有行SUMA1字段的需求,可直接使用ABAP 7.40+版本的新语法实现,无需显式编写LOOP循环。


前置修正:原代码存在的问题

原代码有两处需要调整的点,否则会出现语法报错或运行结果异常:

  • 内表主键字段存在拼写错误:原写法WITH KEY elebn ebelp中elebn为错写字段,需要修正为ebeln
  • suma1字段类型定义不合理:EKBE的MENGE为带小数位的数量字段,用i整型存储会丢失小数精度、大数量场景下会溢出,建议改为和MENGE同类型

完整可运行代码

REPORT zz_program3.
TABLES: ekbe.

TYPES: BEGIN OF tt_mati1,
         ebeln  LIKE ekbe-ebeln,  " 采购凭证号
         ebelp  LIKE ekbe-ebelp,  " 采购凭证行项号
         bewtp  LIKE ekbe-bewtp,  " 凭证历史类别
         bwart  LIKE ekbe-bwart,  " 移动类型
         menge  LIKE ekbe-menge,  " 入库数量
         suma1  LIKE ekbe-menge,  " 分组汇总数量,和源字段同类型避免精度问题
       END OF tt_mati1.

DATA: lt_mati1 TYPE STANDARD TABLE OF tt_mati1 WITH KEY ebeln ebelp.

" 原EKBE查询逻辑
SELECT *
  FROM ekbe
  INTO CORRESPONDING FIELDS OF TABLE lt_mati1
 WHERE bewtp = 'E'  " 仅取入库类凭证历史
   AND bwart = '101'. " 仅取101移动类型(采购入库)

" 无LOOP分组汇总逻辑,直接给每行SUMA1赋值
lt_mati1 = VALUE #(
  FOR GROUPS grp OF <ls_line> IN lt_mati1
    GROUP BY ( ebeln = <ls_line>-ebeln
               ebelp = <ls_line>-ebelp )
    ASCENDING
    " 计算当前分组的MENGE合计值
    LET group_sum = REDUCE menge_d(
          INIT sum = 0
          FOR <grp_line> IN GROUP grp
          NEXT sum = sum + <grp_line>-menge
        )
    " 遍历组内所有行,写入汇总值
    IN ( LINES OF VALUE #(
          FOR <res_line> IN GROUP grp
          ( VALUE #( BASE <res_line> suma1 = group_sum ) )
        ) )
).

逻辑说明

  • 用FOR GROUPS对查询结果按EBELN+EBELP两个维度分组,每组对应同一个采购订单行的所有101入库记录
  • 嵌套REDUCE遍历当前分组下的所有条目,累加得到该组的MENGE总数值
  • 最后遍历组内每一行,基于原始行内容填充SUMA1为分组合计值,生成新的内表覆盖原内表即可
  • 后续如果需要新增分组维度,只需要在GROUP BY子句中追加对应字段,不需要改动其他逻辑

版本要求

该写法依赖ABAP 7.40 SP08及以上版本,目前EHP7及以上版本的ECC系统、全部S/4HANA系统都原生支持。

内容的提问来源于stack exchange,提问作者matthewkun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 21:06:36