能否在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
相关产品推荐
相关产品推荐

