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

