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

能否在END AT语句中分组多列?单循环实现内表求和可行吗?

单个循环实现ABAP内表分组求和的方案

当然可以!你完全不需要用两个循环来实现这个需求,ABAP的AT END OF语句本身就支持多字段联合分组,直接用单个循环就能完成按WERKS、LGORT和MATNR分组并对QUANTITY求和的操作,而且代码会更简洁易读。

优化后的单个循环实现代码

首先要记住一个关键前提:必须先给内表按分组字段排序,这是AT END OF正确识别分组的基础。

* 先按分组字段排序,确保同组数据连续排列
SORT lt_stock BY werks lgort matnr.

DATA: ls_stock TYPE LINE OF lt_stock,
      ls_stock_calculated TYPE LINE OF lt_stock.

LOOP AT lt_stock INTO ls_stock.
  " 因为已经按werks->lgort->matnr排序,最后一个字段的END OF就代表整个分组结束
  AT END OF matnr.
    SUM. " 自动对当前分组的数值型字段(此处为QUANTITY)求和
    MOVE-CORRESPONDING ls_stock TO ls_stock_calculated.
    " 此时ls_stock的QUANTITY已经是分组求和后的值,直接存入结果表
    APPEND ls_stock_calculated TO lt_stock_calculated.
  ENDAT.
ENDLOOP.

如果你想更明确地标注多字段分组的逻辑,也可以这样写(效果和上面完全一致,写法更直观):

SORT lt_stock BY werks lgort matnr.

LOOP AT lt_stock INTO ls_stock.
  AT END OF werks AND lgort AND matnr.
    SUM.
    MOVE-CORRESPONDING ls_stock TO ls_stock_calculated.
    APPEND ls_stock_calculated TO lt_stock_calculated.
  ENDAT.
ENDLOOP.

关键细节说明

  • 排序的必要性:AT END OF是依赖内表的排序顺序来识别分组的,只有当同组的WERKS、LGORT、MATNR连续排列时,才能正确触发分组结束的逻辑。
  • 多字段分组的逻辑:当内表按werks lgort matnr排序后,AT END OF matnr就等价于“当前werks+lgort+matnr组合的分组结束”——因为前面的字段已经有序,只有三个字段都完全匹配的行才会被归为同一组。
  • SUM的作用:SUM语句会自动对当前分组内的所有数值型字段求和,求和后的结果会直接覆盖当前工作区(ls_stock)对应的字段,无需手动计算。

和原有方案的对比

你原来的方法需要先拼接key生成中间表,再二次循环求和,不仅多了一次循环和中间内表的开销,还增加了代码复杂度。优化后的单个循环方案:

  • 省去了中间内表的创建和维护
  • 代码逻辑更直观,可读性更强
  • 执行效率更高(减少了一次内表遍历操作)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:47:49