公司碰到一个需求,由于预留单在抛到条码扫描过账系统之后发生了更改,造成实际中仓库的不方便,需要做一个自制表存储日志。
刚好RESB在CDHDR里面又没有日志记录,不得不在程序里面做增强,需要在MB21/MB22 ( 直接创建预留单 )、BAPI创建修改删除预留单、CJ20N( 项目 库存类物料组件生成预留单)/CN22,生产订单保存创建预留CO01/CO02,委外PO会展BOM产生预留(不用考虑)。
首先介绍一下预留单号:预留单号是可能不留号的,原因是预留单的Number Range有设20的缓冲编号,如果需要保证连号需要调整。
预留是向仓库发出一种请求,要求仓库在某个时间保证某个物料在就绪状态。
1、手工创建预留单:
MB21/MB22除了我们正常的部门领料会用到,其实还有一些其他的用途。
在新机研发新品打样上的用料,因无法对工单实施发料,又想把这种消耗纳入到SAP系统作全局控制;此时手工创建预留可起到很大的帮助;
首先:可对研发新品打样,建立成本中心;如果有用料,审请后创建成本中心预留,
RUN MRP后自动产生采购审请,经审批后产生采购订单,
再对预留(成本中心)发料。这一过程发生的费用,即可纳入到SAP核算体系;
其它:
正常下客户订单,通过RUN MRP产生的工单预留,转成PO后,预留在这整个过程是不能被修改的,查看库存明细,即可看到明细,其中包括预留数量;
对工单发料后,库存中的预留自动消失;
而手工创建的预留,则是可以删除的,对手工预留删除后,不能反删除!
自动预留:当Procduction orders, networks, WBS,委外 PO 一创建,需要的元/组件就会在仓库自动建立预留。如果在仓库级采用再订购点计划(Reorder Point Planning),当可用库存低于再订购点时,系统自动生成库存调拔预留补上差量。
用户不能手动修改预留(MB21/MB22),必须从发起预留的事务对象单据间接修改,修改工单,网络,委外PO数量,间接更新预留单数量。
MB22/MB21增强比较简单:使用的标准用户出口User Exit:MBCF0007。
2、BAPI创建修改删除预留单
BAPI的函数组:MB_BUS2093,注意:BAPI_RESERVATION_CREATE已经过时,无法使用,请选择函数:BAPI_RESERVATION_CREATE1
增强内的更新语句都存放在MBRE函数组的函数里面,而且在函数的最后都有BADI去实现增强
但是我用SE19去新建BADI的实现的时候,系统表示这个BADI还没有开放给我们普通用户,这个控制是在表SXS_ATTR的INTERNAL字段控制的。
后来还是没写增强,在BAPI后面写上的日志逻辑,大家如果有什么更好的办法,请私聊。
3、CJ20N和CN22的预留单
CJ20N和CN22的预留单用不了User Exit和BADI,用系统留下来的enhancement point,但是两者的增强不能写到一起。
首先预留是挂在网络中的,所以单独用CN22也是能够修改预留(注:只能修改预留单数量,并不能创建,必须在CJ20N新增物料组件)。
修改预留和修改网络NETWORK同步的,都在函数 CO_ZV_ORDER_POST 中,但是CN22 只修改网络,CJ20N 在修改网络之后还需要修改项目和WBS ,这种使用的是 SAP LUW的理念, 使三者同时提交或者回滚。主要使用的是UPDATE FUNCTION 和PERFORM ON COMMIT 两种语法。
SAP LUW可以参考我的历史文章:https://blog.csdn.net/weixin_42646630/article/details/107253498
这种语法的提交回滚都是在 commit work / commit work and wait 一时刻提交的, 两种语法的差异可以参考上面的文章。
CJ20N 在调用 CO_ZV_ORDER_POST的时候,通过入参 控制函数不会提交,而是在修改完项目之后一起提交。 为了避免差异,我再update function中写了增强,这样可以保持一致性,注意:请不要再提交commit work 后面写增强,在这里CN22/CJ20N/BAPI的提交语法的地点都不一致。
生产预留CO01/CO02 目前并不启用, 所以也就没有去找。
可以参考这篇文章:https://blog.csdn.net/weixin_42646630/article/details/111029171