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

ABAP按成本中心分组员工并计算薪资总和的方法及报错解决

ABAP按成本中心分组计算薪资总和的实现方案

一、修复你代码中的语法错误

你遇到的sum( <p>-salary )报错,是因为ABAP的聚合函数sum()不能直接在循环中这样调用——它仅支持在GROUP BY的WITH子句、REDUCE表达式或SQL查询中使用。正确的做法是手动累加薪资,或者在分组阶段直接计算总和。

修改后的内层循环累加代码

LOOP AT i_download ASSIGNING FIELD-SYMBOL(<c>)
  GROUP BY <c>-kostl ASCENDING.

  WRITE: / <c>-kostl.

  DATA(lv_sum_salary) TYPE p DECIMALS 2.
  LOOP AT GROUP <c> ASSIGNING FIELD-SYMBOL(<p>).
    lv_sum_salary = lv_sum_salary + <p>-salary. " 手动累加每个员工的薪资
    WRITE: /'  ', <p>-pernr, <p>-salary.
  ENDLOOP.
  WRITE: /'  ', '薪资总和:', lv_sum_salary.
ENDLOOP.

二、更高效的分组聚合写法(ABAP 7.40+)

如果你的系统版本支持ABAP 7.40及以上,可以直接在GROUP BY中通过WITH子句计算薪资总和,无需内层循环:

LOOP AT itab ASSIGNING FIELD-SYMBOL(<c>)
  GROUP BY <c>-kostl ASCENDING
  WITH SUM( <c>-salary ) AS sum_salary. " 直接在分组时计算总和

  WRITE: / <c>-kostl, sum_salary.
ENDLOOP.

三、使用COLLECT语句实现

可以使用COLLECT语句,但需要满足两个前提:

  • 目标内表的主键必须是成本中心(KOSTL)
  • 薪资字段必须是数值类型(如P、I、F),因为COLLECT会自动累加相同主键的数值字段

示例代码

* 定义目标内表结构,主键为KOSTL
TYPES: BEGIN OF ty_cost_sum,
         kostl TYPE kostl,
         sum_salary TYPE p DECIMALS 2,
       END OF ty_cost_sum.
DATA: it_cost_sum TYPE STANDARD TABLE OF ty_cost_sum WITH KEY kostl.

* 遍历原始内表,用COLLECT累加薪资
LOOP AT itab ASSIGNING FIELD-SYMBOL(<c>).
  DATA(ls_cost_sum) = VALUE ty_cost_sum( kostl = <c>-kostl sum_salary = <c>-salary ).
  COLLECT ls_cost_sum INTO it_cost_sum.
ENDLOOP.

* 输出结果
LOOP AT it_cost_sum ASSIGNING FIELD-SYMBOL(<sum_line>).
  WRITE: / <sum_line>-kostl, <sum_line>-sum_salary.
ENDLOOP.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:25:14