如何通过ABAP获取SAP生产订单的目标成本
SAP存储生产订单成本的主要底表包括:
- COBK: CO凭证表头
- COEP: CO凭证行项目
- COSS: 来自CO内部的汇总数据
- COSP: 来自CO外部部的汇总数据
先说结论:SAP 对生产订单的目标成本是没有保存到底表的。那么如何通过代码的方式获取呢?
K_KKB_KKBCS_ORDER_REPORT 函数
这个函数类似调用事务码 KKBC_ORD,对这个函数调用,只需要提供 order number,但函数自动通过 ALV 来展示数据,这就带来了调用函数的不便。
对函数的源码进行分析,可以看出,函数的主要过程为
- 调用 K_KKB_KKBCS_CO_OBJECT_READ 函数,获取生产订单的成本数据。
- 调用 K_KKB_2XHEADER_GET 获取表头的数据,如订单号、订单类型、工厂、物料。
- 调用 K_KKB_CO_OBJECT_DISPLAY 函数显示生产订单数据
主体的逻辑在 K_KKB_KKBCS_CO_OBJECT_READ 函数中。函数调用后返回 4 个表参数:
G_T_COSLA 表参数:能够获取期间产出数量。我们和 KKBC_ORD 事务码界面进行对比:
G_T_COSPA 表参数,对应 COSP 表的存储数据:
G_T_COSSA 表参数,对应 COSS 表的存储数据。
既然函数的主体是调用 K_KKB_KKBCS_CO_OBJECT_READ 函数,那么我们直接调用这个函数不就可以了吗?我们来测试一下。调用这个函数,需要填写 OBART 和 AUFNR 两个参数。
运行函数之后,可以看到,函数能获取到数据。如下图所示:
但我们对数据进行查看,可以发现缺少目标成本的数据 (WRTYP = 5)。也就是说,如果我们调用 K_KKB_KKBCS_ORDER_REPORT 函数,能获取到目标成本的数据,但系统会自动以 ALV 显示出来,这个不是我们想要的。如果调用 K_KKB_KKBCS_CO_OBJECT_READ 函数,表参数只有实际成本和计划成本,但没有目标成本。
什么原因呢?怎么解决呢?解决方案还需要从源码入手。我们用 SE37 进入 K_KKB_KKBCS_ORDER_REPORT 的源码一看究竟。这个函数的代码不是那么简单,我们略过不相关的部分。先找到与计算目标成本相关的部分:
进入子例程 get_target:
这才是真正用于计算目标成本的函数。基于调试方式很容易得到这个函数的参数的用法。在这里设置断点,然后通过 K_KKB_KKBCS_ORDER_REPORT 函数进入:
这个函数提供了获取目标成本的第一种方法,调用 K_TARGETCOSTS_OBJECT_RECALC 函数,函数调用需要通过前面的函数抓取到产出数量、产出物料的计量单位等信息。以下是使用 SE37 事务码对该函数的测试:
数据已经能够正确获取:
第二个问题,为什么调用 K_KKB_KKBCS_ORDER_REPORT 函数能获取到目标成本,调用 K_KKB_KKBCS_CO_OBJECT_READ 函数不能获取目标成本?基于分析,SAP 在函数组中,有一个 g_object 参数,在调用函数之前,需要对该函数赋值 ,然后检查 g_object 是否等于 obj-auf。对代码细节有兴趣的小伙伴可以自行调试来验证。关键点贴图如下:
知道了原因,也就有了第二种解决方案:拷贝 K_KKB_KKBCS_CO_OBJECT_READ 函数为 ZK_KKB_KKBCS_CO_OBJECT_READ,并对拷贝出的 Z 函数代码进行微调。我们知道,函数必须位于函数组中,所以拷贝函数需要拷贝函数组。实际操作的步骤如下:
1、拷贝函数组 KKBC 到 ZKKBC
2、拷贝函数 K_KKB_KKBCS_CO_OBJECT_READ 到 ZK_KKB_KKBCS_CO_OBJECT_READ
3、将 ZK_KKB_KKBCS_CO_OBJECT_READ 的属性改为远程启用的模块,从而支持 RFC 外部调用
4、将函数的参数变更为值传递,这是远程调用模块的要求:
在代码中加上两行:
g_object = obj-auf.
move-corresponding i_hcstruktur to g_global_object.
本文结论
1、SAP对生产订单的目标成本目标在底表中存储,而是基于计算获得。
2、如果需要通过代码获取生产订单的目标成本,有两种解决方案,第一种方案是调用 K_TARGETCOSTS_OBJECT_RECALC 函数,但需要提供如生产数量、计量单位等信息,也需要先调用其他函数;第二种方案是基于 K_KKB_KKBCS_CO_OBJECT_READ 函数拷贝一个新的函数,并对代码进行微调。