背景
此文适合对SAP PP模块生产订单业务有一定了解的PP顾问和ABAP开发人员阅读。
所在项目中遇到一个特殊需求,创建拆解工单时,拆除整机得到半成品和原材料。
这时候不是增加组件预留数量,而是减少预留数量(因为半成品和原材料增多了),业务方的要求是,这种特殊类型工单,组件数量默认是负数。说实话这种需求我见过,这种解决方案我是第一次听说(更别提见)。为什么不用物料凭证移动类型配置,同仓转储之类的成熟解决方案,我不知道,大概是财务科目配不明白吧。
OK,我的任务是实现需求,别的咱也不知道,咱也不敢问。
需求是通过接口创建拆解工单,组件物料是定制的,数量是负的。
有点绕的解决方案
我之前(差不多10年前)一直用一个标准BAPI处理PP生产订单的增删改,就是BAPI_ALM_ORDER_MAINTAIN。
实际上这是一个PM模块维修/服务工单使用的BAPI,SAP的PP,PM,PS模块使用了同一套底表来存储业务数据(问就是架构原因,我也不知道为什么),所以这个API也能够用来处理PP生产订单。为什么非得用PM的API来改PP的数据呢,因为PP模块没有相应功能的API,自带的BAPI_PRODORD_CREATE没有什么考虑定制组件之类的功能,SAP就是摆烂,OK?
SAP曾推出过一系列Note补丁,禁止客户开发人员使用这个BAPI改生产订单,都被我司的BASIS同事屏蔽了,所以我们一直这么用。
我在目前项目的系统一看,BAPI_ALM_ORDER_MAINTAIN这个BAPI不能用了。Note打了好几波,摘都摘不掉。
接口使用的账号不是dialog账号,不能支持BDC的CO01方式,只能另想办法。
最终考虑,使用COXT函数组的CO_XT_COMPONENT_ADD来添加定制组件和加工数量(负数)。
方案细节
- 先调用BAPI_PRODORD_CREATE创建生产订单,这一步会自动生成加工组件,不能定制。
这一步会根据表头的物料,工厂,订单类型,数量,计划起始/截止日期生成生产订单,同时会根据订单物料对应的生产BOM自动计算加工组件物料和数量,按常规方式不能改(非常规可以,我们下面聊)。
我们需要做的是,删除不需要的“自动计算”出来的组件,替换成需要的定制组件。
FORM create_ppo.
DATA:ls_orderdata TYPE bapi_pp_order_create,
ls_return TYPE bapiret2,
lv_order_number TYPE aufnr.
* 创建生产订单
CLEAR:ls_orderdata.
ls_orderdata-material = gs_h-matnr.
ls_orderdata-plant = gs_h-dwerk.
ls_orderdata-order_type = gs_h-auart.
ls_orderdata-quantity = gs_h-pgmng.
ls_orderdata-basic_start_date = gs_h-gstrp.
ls_orderdata-basic_end_date = gs_h-gltrp.
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
orderdata = ls_orderdata
IMPORTING
return = ls_return
order_number = lv_order_number.
IF ls_return-type = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
MESSAGE ID ls_return-id
TYPE ls_return-type
NUMBER ls_return-number
WITH ls_return-message_v1
ls_return-message_v2
ls_return-message_v

847

被折叠的 条评论
为什么被折叠?



