当前位置: 首页 > news >正文

如何通过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 函数拷贝一个新的函数,并对代码进行微调。

相关文章:

  • 【无标题】I/O复用(epoll)三者区别▲
  • LeetCode 热题 100 24. 两两交换链表中的节点
  • JS正则表达式介绍(JavaScript正则表达式)
  • AI与机器人学:从SLAM到导航的未来
  • leetcode 2918. 数组的最小相等和 中等
  • Windows右键管理工具:轻松添加/删除/修改右键菜单项!
  • 常见的算法介绍
  • c++ struct类型加强
  • Python实例题:Python协程详解公开课
  • 如何让“语言不通”的纺织设备通过Profinet转CanOpen网关“聊”起来?
  • Ethercat转Profinet网关如何用“协议翻译术“打通自动化产线任督二脉
  • 数据库中的 Segment、Extent、Page、Row 详解
  • Vue3响应式原理源码解析(通俗易懂版)
  • C PRIMER PLUS——第7节:指针
  • OC语言学习——Foundation框架(上)
  • adamantix系统详细讲解
  • 数据结构与算法:树型dp
  • [C++] 大数减/除法
  • 鸿蒙 所有API缩略图鉴
  • Web3 初学者的第一个实战项目:留言上链 DApp
  • 我国成功发射遥感四十号02组卫星
  • 佩斯科夫:俄会考虑30天停火提议,但试图对俄施压无用
  • 未来之城湖州,正在书写怎样的城市未来
  • 中国证监会印发2025年度立法工作计划
  • 中信银行:拟出资100亿元全资设立信银金融资产投资有限公司
  • 越秀地产前4个月销售额约411.2亿元,达年度销售目标的34.1%