为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

项目可用库存

2010-10-08 7页 doc 126KB 15阅读

用户头像

is_156400

暂无简介

举报
项目可用库存项目可用库存(ATP) 1.​ 存储过程定义 名称:usp_GetItemATP 输入参数: @EntityID ID -- 实体ID @StdItemID ID -- 标准产品ID @ItemID ID -- 项目ID @UMCode UMCode -- 计量单位 @QtyFormat Varchar(16) -- 数量格式 @OrderTypeID ID -- 订单类型 @StorageAreaID ID=null -- 存储区域,可空 @PlannedDate DateTime -- 计划发货日期 @ExcludeSel...
项目可用库存
项目可用库存(ATP) 1.​ 存储过程定义 名称:usp_GetItemATP 输入参数: @EntityID ID -- 实体ID @StdItemID ID -- 产品ID @ItemID ID -- 项目ID @UMCode UMCode -- 计量单位 @QtyFormat Varchar(16) -- 数量格式 @OrderTypeID ID -- 订单类型 @StorageAreaID ID=null -- 存储区域,可空 @PlannedDate DateTime -- 计划发货日期 @ExcludeSelf Bit=0 -- 是否排除当前计划行,可空,默认为0 -- 为1用于发货计划库存占用时查看可用可存 -- 为1时需要传入@DetailID @DetailID ID=null -- 发货计划明细ID,可空 -- @ExcludeSelf=1时须指定 输出参数: @ATP Quantity -- 可用库存(对应于@UMCode) 同时返回可用库存的结果集(详见“业务逻辑 -> 返回结果”部分) 2.​ 业务逻辑 ATP(Available to promise)定义:ATP是指可承诺库存; ATP算法:根据ATP设置,将所有供给 - 所有需求; 其中,供给包括: 1)​ 在库:ATP标志为Y并且需求组和订单类型匹配的存储区域本商品的库存; 2)​ 采购在途:开放,接受和执行中的已订未收数,最小为0,需求日期早于计划日期; 3)​ 在制品:工单上的计划数-已完工入库数,计划完工日期早于计划日期; 4)​ 移仓入库:移仓单上的计划移入数量,移仓状态为开放; 需求包括: 1)​ 销售占用:订单计划行里的库存分配数; 2)​ 发货出库:配货明细; 3)​ 移仓出库:配货明细; 4)​ 调整出库(含其他出库):配货明细; 5)​ 采购退货:配货明细; 指定区域(指订单行上选定了存储区域,如何计算ATP):先看总可用库存是否满足,然后看指定区域的可用库存是否满足。 2.1.​ 计算 1)​ 取IM_ATPPolicy表中的设置: SELECT -- In @OnHandFlag = OnHand, @POFlag = PO, @IntransitFlag = Intransit, @WIPFlag = WIP, -- Out @SOFlag = SO, @TransferOutFlag = TransferOut, @AdjustmentFlag = Adjustment, @DNFlag = DN, @PRTFlag = PRT FROM IM_ATPPolicy WHERE EntityID = @EntityID 2)​ 取订单类型@OrderTypeID对应的需求组: SELECT @DemandGroupCode = DemandGroupCode FROM SD_OrderType WHERE OrderTypeID=@OrderTypeID 3)​ 根据@QtyFormat得到数量的精度,所有数量的计算结果需要按照这个精度做四舍五入: SELECT @QtyPrec = LEN(SUBSTRING(@QtyFormat, CHARINDEX('.', @QtyFormat)+1, LEN(@QtyFormat))) 4)​ 供给数计算: 注意,下面的示例SQL中返回的都是基本单位对应的数量,要转换成@UMCode对应的数量,转换结果根据@QtyPrec四舍五入。 ​ 如果在库标志@OnHandFlag=’Y’,计算在库数(OnHand):ATP标志为Y并且需求组和订单类型匹配的存储区域本商品的库存;分存储区域: SELECT s.StorageAreaID, Sum(b.BalanceQty) as OnHand FROM IM_InvBalance b INNER JOIN BA_StorageArea s ON b.StorageAreaID = s.StorageAreaID WHERE s.Status=41 -- 有效 and s.ATP = 'Y' and s.DemandGroupCode = @DemandGroupCode and b.EntityID = @EntityID and b.ItemID = @ItemID GROUP BY s.StorageAreaID ​ 如果采购在途标志@POFlag=’Y’,计算采购在途数(PO):开放、接受、执行中和发货完成的订单,行状态为输入、执行中、发货完成的订单行,已订未收数,最小为0;订单行需求日期早于计划日期;与存储区域无关: SELECT Sum( CASE WHEN (od.OrderQty-od.ReceivedQty) > 0 THEN Round((od.OrderQty-od.ReceivedQty) * od.Factor, @QtyPrec) ELSE 0 END) as PO FROM SD_Order o INNER JOIN SD_OrderDetail od ON o.OrderID = od.OrderID WHERE od.RequestDate<@PlannedDate and o.Status in (40, 50, 60, 70) -- 开放、接受、执行中、发货完成 and od.LineStatus in (10, 60, 70) -- 输入、执行中、发货完成 and o.BuyerID = @EntityID and od.ItemID = @ItemID ​ 如果在制品标志@WIPFlag=’Y’,计算在制品数(WIP):工单上的计划数-已完工入库数,计划完工日期早于计划日期;暂不实现; ​ 如果移仓入库标志@POFlag=’Y’,计算移仓入库数(Intransit):移仓单上的计划移入数量,移仓状态为开放;分存储区域: SELECT a.StorageAreaID, Sum(BaseQty) as Intransit FROM IM_InvTransferInAllocDetail a INNER JOIN IM_InvTransfer h ON h.InvTransferID = a.InvTransferID and h.Status = 40 -- 开放 INNER JOIN BA_StorageArea s ON a.StorageAreaID = s.StorageAreaID WHERE s.Status=41 -- 有效 and s.ATP = 'Y' and s.DemandGroupCode = @DemandGroupCode and h.ToEntityID = @EntityID and a.ItemID = @ItemID GROUP BY a.StorageAreaID 5)​ 需求数计算: 注意,下面的示例SQL中返回的都是基本单位对应的数量,要转换成@UMCode对应的数量,转换结果根据@QtyPrec四舍五入。 ​ 如果销售占用标志@SOFlag=’Y’,计算销售占用数(SO):订单计划行里的库存分配数;可能指定存储区域,也可能不指定存储区域; 如果传入@ExcludeSelf=1且指定了@DetailID,需要相应地排除@DetailID对应的占用数,参见下面SQL中注释的部分: 未指定存储区域的部分: SELECT Sum(op.BaseAllocQty) as SO FROM SD_OrderPlanDetail op INNER JOIN SD_Order o ON o.OrderID = op.OrderID INNER JOIN SD_OrderDetail od ON od.OrderDetailID = op.OrderDetailID WHERE o.SellerID = @EntityID and od.ItemID = @ItemID and o.Status in (20, 40, 50, 60) -- 待批、开放、接受、执行中 and od.LineStatus in (10, 60) -– 输入、执行中 and op.status=10 and op.StorageAreaID Is Null -- 如果传入@ExcludeSelf=1,需排除本计划明细: -- and op.OrderPlanDetailID <> @DetailID 指定存储区域的部分: SELECT op.StorageAreaID, Sum(op.BaseAllocQty) as SO FROM SD_OrderPlanDetail op INNER JOIN SD_Order o ON o.OrderID = op.OrderID INNER JOIN SD_OrderDetail od ON od.OrderDetailID = op.OrderDetailID INNER JOIN BA_StorageArea s ON op.StorageAreaID = s.StorageAreaID WHERE o.SellerID = @EntityID and od.ItemID = @ItemID and o.Status in (20, 40, 50, 60) -- 待批、开放、接受、执行中 and od.LineStatus in (10, 60) -– 输入、执行中 and s.ATP = 'Y' and s.DemandGroupCode = @DemandGroupCode -- 如果传入@ExcludeSelf=1,需排除本计划明细: -- and op.OrderPlanDetailID <> @DetailID GROUP BY op.StorageAreaID 需要减掉对应的发货单配货表的数据(已计入发货出库): SELECT op.StorageAreaID, -Sum(a.BaseQtyAlloc) as SO FROM SD_DNInvAllocDetail a INNER JOIN SD_DN h ON h.DNID = a.DNID INNER JOIN SD_DNDetail d ON h.DNID = d.DNID and d.DNDetailID = a.DNDetailID and d.LineStatus in (10, 51) -- 输入、已配 INNER JOIN BA_StorageArea s ON a.StorageAreaID = s.StorageAreaID INNER JOIN SD_OrderPlanDetail op ON op.OrderPlanDetailID = d.OrderPlanDetailID WHERE s.DemandGroupCode = @DemandGroupCode and s.ATP = 'Y' and h.EntityID = @EntityID and a.ItemID = @ItemID -- 如果传入@ExcludeSelf=1,需排除本计划明细: -- and op.OrderPlanDetailID <> @DetailID GROUP BY op.StorageAreaID ​ 如果发货出库标志@DNFlag=’Y’,计算发货出库数(DN):行状态为输入、已配的发货配货明细;分存储区域; SELECT a.StorageAreaID, Sum(a.BaseQtyAlloc) as DN FROM SD_DNInvAllocDetail a INNER JOIN SD_DN h ON h.DNID = a.DNID INNER JOIN SD_DNDetail d ON h.DNID = d.DNID and d.DNDetailID = a.DNDetailID and d.LineStatus in (10, 51) -- 输入、已配 INNER JOIN BA_StorageArea s ON a.StorageAreaID = s.StorageAreaID WHERE s.Status=41 -- 有效 and s.ATP = 'Y' and s.DemandGroupCode = @DemandGroupCode and h.EntityID = @EntityID and a.ItemID = @ItemID GROUP BY a.StorageAreaID ​ 如果采购退货标志@PRTFlag=’Y’,计算采购退货数(PRT):行状态为输入、已配的采购退货配货明细;分存储区域; SELECT a.StorageAreaID, Sum(a.BaseQtyAlloc) as PRT FROM PU_PRTInvAllocDetail a INNER JOIN PU_PRT h ON h.PRTID = a.PRTID INNER JOIN PU_PRTDetail d ON h.PRTID = d.PRTID and d.PRTDetailID = a.PRTDetailID and d.LineStatus in (10, 51) -- 输入、已配 INNER JOIN BA_StorageArea s ON a.StorageAreaID = s.StorageAreaID WHERE s.Status=41 -- 有效 and s.ATP = 'Y' and s.DemandGroupCode = @DemandGroupCode and h.EntityID = @EntityID and a.ItemID = @ItemID GROUP BY a.StorageAreaID ​ 如果移仓出库标志@TransferOutFlag=’Y’,计算移仓出库数(TransferOut):行状态为输入、出库已配、入库已配的移仓出库配货明细;分存储区域; SELECT a.StorageAreaID, Sum(a.BaseQty) as TransferOut FROM IM_InvTransferOutAllocDetail a INNER JOIN IM_InvTransfer h ON h.InvTransferID = a.InvTransferID INNER JOIN IM_InvTransferDetail d ON h.InvTransferID = d.InvTransferID and d.InvTransferDetailID = a.InvTransferDetailID and d.LineStatus in (10, 51, 52) -- 输入、出库已配、入库已配 INNER JOIN BA_StorageArea s ON a.StorageAreaID = s.StorageAreaID WHERE s.Status=41 -- 有效 and s.ATP = 'Y' and s.DemandGroupCode = @DemandGroupCode and h.FromEntityID = @EntityID and a.ItemID = @ItemID GROUP BY a.StorageAreaID ​ 如果调整出库标志@AdjustmentFlag=’Y’,计算调整出库数(含其他出库)(Adjustment):行状态为输入、已配的调整单配货明细;分存储区域; SELECT a.StorageAreaID, Sum(a.BaseQty) as Adjustment FROM IM_InvAdjustmentDetail a INNER JOIN IM_InvAdjustment h ON h.InvAdjustmentID = a.InvAdjustmentID and a.LineStatus in (10, 51) -- 输入、已配 INNER JOIN BA_StorageArea s ON a.StorageAreaID = s.StorageAreaID WHERE s.Status=41 -- 有效 and s.ATP = 'Y' and s.DemandGroupCode = @DemandGroupCode and h.EntityID = @EntityID and a.ItemID = @ItemID GROUP BY a.StorageAreaID 2.2.​ 返回结果 1)​ 返回的结果集由两部分组成: a)​ 总可用库存(不分存储区域),上面的供给需求数把所有的存储区域汇总; b)​  各个存储区域的可用库存; 具体字段如下(其中1-9是否需要计算,取决于IM_ATPPolicy表的设置): # 字段 说明 方向 StorageAreaID 存储区域ID 对于总可用库存,该字段为空 StorageAreaCode 存储区域代码 对于总可用库存,该字段为空 StorageAreaName 存储区域名称 对于总可用库存,该字段为空 1 OnHand 在库 供给 2 WIP 在制 供给 3 PO 采购在途 供给 4 Intransit 移仓入库 供给 5 SO 销售占用 需求 6 TransferOut 移仓出库 需求 7 Adjustment 调整出库 需求 8 DN 发货出库 需求 9 PRT 采购退货 需求 Allocated 已分配 需求数之和 Available 可用库存 供给数之和-需求数之和 2)​ 返回的可用库存数: 如果输入参数未指定存储区域,返回总可用库存数;如果指定了存储区域,取总可用库存和指定的那个存储区域的可用库存数中较小的那个。 3.​ 示例 假设几个参数的计算结果如下,其余数量都为0: 类型 存储区域 数量 OnHand A 100 OnHand B 200 PO   30 Intransit A 40 SO   200 SO B 10 TransferOut A 20 则返回的结果集应该是: Storage Area On Hand WIP PO Intransit SO Transfer Out Adjust DN PRT Allocated Available   300 0 30 40 210 20 0 0 0 230 140 A 100 0 0 40 0 20 0 0 0 20 120 B 200 0 0 0 10 0 0 0 0 10 190 输出参数@ATP: 1)​ 如果输入参数未指定存储区域,则@ATP = 总可用库存数 = 140; 2)​ 如果输入参数指定存储区域为A,则@ATP=Min(140, 120) = 120; 3)​ 如果输入参数指定存储区域为B,则@ATP=Min(140, 190) = 140; 补充说明: 1)​ 采购在途不分存储区域,因此指定存储区域的PO数都等于0; 2)​ 销售占用可能不指定存储区域,因此不分存储区域的SO数可能会大于各存储区域的SO数之和; 3)​ 因此,总可用库存数可能会大于某个存储区域的可用库存(如上例中存储区域A的可用库存数较小),也可能小于某个存储区域的可用库存(如上例中存储区域B的可用库存数较大);
/
本文档为【项目可用库存】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索