基于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
相关产品推荐
相关产品推荐

