## 1.1、业务背景
A公司在同一个物理位置,业务组织架构上划分了4个工厂管理(可理解为车间),为保证物流、账务统一,简化操作复杂性,在SAP中采用一个工厂组织模式,组织图如下:
因业务上采用反冲扣料模式,经常因没有账务库存扣料失败导致月结时处理COGI(此处不对业务管理做特殊说明),因此在SAP端启用“可用性-
全工厂检查”(需要检查原料仓库,线边仓不会备大量原材料),但业务上4个分厂都有各自的二级仓,去ATP检查时需要排除其他的二级仓。ATP检查规则为:原料仓库+分工厂的线边仓,SAP标准检查要么全工厂(MRP范围)检查,要么库存地点检查,无法满足业务需求,需要做增强处理。
## 1.2、对应方案:
首先运行事务代码CO09,查看结果
运行BAPI_MATERIAL_AVAILABILITY
## 3.1、增强思路
找到系统中计算全工厂下(1000+1002)的库存数量时,排除掉1002库存地点,让得到的全工厂库存数量只有1000库存地点中的库存100,这样减掉已经占用的20,让最终得到的可用数量为80
## 3.2、EXIT_SAPLATPC_001(未采用)
社区推荐的增强点EXIT_SAPLATPC_001(ATP检查前输入),增强点EXIT_SAPLATPC_002(ATP检查后结果输出)。这两个增强点并没有找到使用办法,因此没有采用,有清楚的望不吝赐教。
## 3.3、STOCK_RECEIPT_ISSUE_READ
在BAPI_MATERIAL_AVAILABILITY运行时,经过函数AVAILABILITY_CHECK_EXECUTE中调用的函数STOCK_RECEIPT_ISSUE_READ,在该函数后得到物料工厂检查时对应的库存地点1000/1002,并且得到对应的库存地点和全工厂下的库存总数
全工厂库存数量150,1002库存50
因此在STOCK_RECEIPT_ISSUE_READ函数末尾,做隐式增强,根据接口抛内存进来的内表,删除对应库存的数据,并将全工厂下的库存数量减去排除的库存地点对应的库存数量(150
• 50 = 100)
最终得到BAPI返回的结果为80
通过上文的隐式增强,就可以解决需求。但是上文的增强是在得到数据后删除了应有的数量,而本身的思路是想在查询数据前,排除掉1002库存地点,使系统计算的库存数量就是我们需要的,则增强点更加完美,增强出错率更低,因此继续调试了获取库存数量的源码,过程记录如下:
PERFORM stock_read
get_stock()
read_stock()
select_stock()
最终查询视图atpc_cds_stock,获取库存数量。
并且查询条件只是物料、工厂、特殊库存标识,并没有库存地点,因此之前想通过删除库存地点得到正确取数的想法行不通,还是要回到对查询结果进行删除的逻辑上来
并且该视图还可以查询其他的数据,有兴趣可以研究下