庫存分配

-- ======================================ide

-- 程序:未清需求按BOM樣式展開查看訂單執行狀態spa

-- wangtpip

-- 2017.7.7it

-- EXEC [U_P_STOCK2NEED_IN_MRP_TRACKING_EXPEND]io

-- 1)5開頭物料排除class

-- 2)只體現未清工單程序

-- ======================================im

ALTER PROCEDURE [dbo].[U_P_STOCK2NEED_IN_MRP_TRACKING_EXPEND]數據

AS查詢

BEGIN

DECLARE @dueDate DATETIME

DECLARE @owe_line_count INT

DECLARE @level INT

DECLARE @maxLevel INT --需求計算的最大層級


DECLARE @doc INT --已跑MRP的最後一個銷售訂單

SELECT @doc = MAX(T1.DocEntry) 

FROM OWOR T0 

INNER JOIN ORDR T1 ON T0.PickRmrk = T1.NumAtCard

WHERE T0.Status IN ('P','R')


DECLARE @doc2 INT --已跑MRP的最後一個銷售預測

SELECT @doc2 = MAX(T1.AbsId) 

FROM OWOR T0 

INNER JOIN OFCT T1 ON T0.PickRmrk = T1.Code

WHERE T0.Status IN ('P','R')


--截止日默認爲下個月最後一天

SET @dueDate = '99991231'

;

--SELECT @end


--170706 未清銷售訂單和預測單 按BOM展開計算所有需求

WITH BOM2(NumAtCard,Father,ItemCode,Quantity,ShipDate,[LEVEL],Position)

AS

(

SELECT T10.NumAtCard,CAST('' AS NVARCHAR(20)), T10.[ItemCode]

,SUM(T10.Quantity) Quantity,MIN(T10.ShipDate) ShipDate,1 [LEVEL]

,CAST(1000+ROW_NUMBER() OVER(order by T10.NumAtCard,T10.[ItemCode]) AS VARCHAR(MAX))

--INTO #TEMP_OPEN_NEED

FROM 

(

SELECT T0.NumAtCard, T1.[ItemCode],T1.OpenCreQty Quantity ,T1.ShipDate

FROM [dbo].ORDR T0

INNER JOIN RDR1 T1 ON T1.DocEntry=T0.DocEntry AND T1.LineStatus='O'

--LEFT JOIN OSLP T2 ON T2.SlpCode=T0.SlpCode

WHERE T0.DocStatus = 'O' AND T0.DocType ='I'  

AND T0.DocEntry <= @doc --不考慮未跑MRP的銷售訂單

--AND T1.ShipDate <= @dueDate

UNION ALL

--SELECT T0.Code, T1.ItemCode,T1.Quantity ,T1.[Date] ShipDate

----SELECT T1.ItemCode,T1.Quantity ,T1.[Date] [ShipDate] 

--FROM OFCT T0 INNER JOIN FCT1 T1 ON T0.AbsID = T1.AbsID

--WHERE T0.AbsID <= @doc2 AND T1.[Date] BETWEEN '20170401' AND @dueDate AND T1.Quantity > 0

SELECT T10.Code,T10.ItemCode,T10.Quantity - ISNULL(SUM(T11.CmpltQty),0) Quantity,T10.[ShipDate]

FROM

(

SELECT T0.Code, T1.ItemCode,SUM(T1.Quantity) Quantity ,MIN(T1.[Date]) [ShipDate]

--SELECT T1.ItemCode,T1.Quantity ,T1.[Date] [ShipDate] 

FROM OFCT T0 INNER JOIN FCT1 T1 ON T0.AbsID = T1.AbsID

WHERE T0.AbsID <= @doc2 AND T1.[Date] BETWEEN '20170401' AND @dueDate AND T1.Quantity > 0 

GROUP BY T0.Code,T1.ItemCode

)T10 

LEFT JOIN OWOR T11 ON T10.Code = T11.PickRmrk AND T10.ItemCode = T11.ItemCode

GROUP BY T10.Code,T10.ItemCode,T10.Quantity,T10.ShipDate

HAVING T10.Quantity > ISNULL(SUM(T11.CmpltQty),0)

)T10

GROUP BY T10.NumAtCard,T10.[ItemCode]

UNION ALL

SELECT T0.NumAtCard,T1.Code,T2.Code

,T0.Quantity*T2.Quantity/T1.Qauntity,DATEADD(DD,-ISNULL(T3.LeadTime,0),T0.ShipDate) ,T0.[LEVEL]+1

,T0.Position+'-'+CAST(10+T2.ChildNum AS VARCHAR(3))

FROM BOM2 T0

INNER JOIN OITT T1 ON T0.ItemCode = T1.Code 

INNER JOIN ITT1 T2 ON T1.Code = T2.Father AND T2.Type = '4'

INNER JOIN OITM T3 ON T1.Code = T3.ItemCode

)


SELECT *

INTO #BOM2

FROM BOM2

WHERE ITEMCODE NOT LIKE '5%'

;


SELECT NumAtCard,ItemCode,CEILING(SUM(Quantity)) Quantity,MIN(ShipDate) ShipDate

INTO #TMP_NEED_ALL_LINES --整個訂單的全部需求

FROM #BOM2 

GROUP BY NumAtCard,ItemCode;


--SELECT T0.NumAtCard,T0.Father,T0.ItemCode,T2.Quantity/T1.Qauntity BaseQty

-- FROM (SELECT DISTINCT NumAtCard,Father,ItemCode FROM #BOM2 WHERE Father <> '')  T0

-- INNER JOIN OITT T1 ON T0.Father = T1.Code

-- INNER JOIN ITT1 T2 ON T1.Code = T2.Father

-- ORDER BY  T0.NumAtCard,T0.Father,T0.ItemCode

--DROP TABLE #BOM2

--DROP TABLE #TMP_NEED_ALL_LINES

--RETURN


--數據查詢

SELECT DISTINCT

T14.Position [層次]

,'.'+replicate(' ',2*(T14.LEVEL-1))+ T14.ItemCode [物料(左縮進)]

,T10.NumAtCard [業務訂單號]

,T19.DocEntry [銷售訂單]

,T18.AbsId [銷售預測]

,T17.ItemCode [物料編號]

,T17.Spec [工序]

,T17.InvntryUom [單位]

,T16.BZ [已下達]

,T10.Quantity [未清訂單需求]

,T15.QtyIssued [已發料]

--,T11.PlannedQty [採購/生產下達數量],T12.CmpltQty [採購到貨/生產完工]

,T11.OpenQty [採購/生產在途]

,ISNULL(T15.QtyIssued,0)+ISNULL(T11.OpenQty,0) - T10.Quantity [溢缺(已發料+在途-需求)] 

,T12.Quantity [採購申請(未下達)]

,ISNULL(T15.QtyIssued,0)+ISNULL(T11.OpenQty,0) - T10.Quantity + ISNULL(T12.Quantity,0) [外購件溢缺2(溢缺+採購申請)]

,T13.OnHand [可用庫存]

,T13.OnHand_GK [灌口庫存]

,T13.OnHand_TA [同安庫存]

,ISNULL(T13.OnQC_GK,0) [灌口待檢]

,ISNULL(T13.OnQC_TA,0) [同安待檢]

,T10.ShipDate [交期]

,T17.LeadTime [提早期-天(未考慮)]

--,T10.ShipDate [交期]

,T17.U_Location [儲位]

,CASE T17.U_Factory WHEN 'GK' THEN '灌口' WHEN 'TN' THEN '同安' ELSE '-' END [工廠]

,T17.TaxCtg [工做中心]

,T17.U_Buyer [物料採購員]

,T17.ItemName [物料描述]

,'C02-原料倉庫/C03-成品倉庫/C05-委外倉庫/C06-配件倉/C11-包材倉庫/C17-高儀倉庫/C20-非生產類倉庫/C31-同安三樓龍頭倉庫/C32-同安四樓配件倉/C33-同安成品倉/C39-同安包材倉' [考慮庫存的倉庫]

FROM 

#TMP_NEED_ALL_LINES T10

INNER JOIN OITM T17 ON T10.ItemCode = T17.ItemCode

LEFT JOIN ORDR T19 ON T10.NumAtCard = T19.NumAtCard

LEFT JOIN OFCT T18 ON T10.NumAtCard = T18.Code

LEFT JOIN

(

SELECT T0.NumAtCard,T0.ItemCode,'Y' BZ

FROM #TMP_NEED_ALL_LINES T0

INNER JOIN OWOR T1 ON T0.NumAtCard = T1.PickRmrk AND T0.ItemCode = T1.ItemCode

UNION ALL

SELECT T0.NumAtCard,T0.ItemCode,'Y' BZ 

FROM #TMP_NEED_ALL_LINES T0

INNER JOIN POR1 T1 ON T0.NumAtCard = T1.U_OrderNo AND T0.ItemCode = T1.ItemCode

)T16 ON T10.NumAtCard = T16.NumAtCard AND T10.ItemCode = T16.ItemCode

LEFT JOIN(

--計劃數量

SELECT U0.NumAtCard,U0.ItemCode,SUM(ISNULL(PlannedQty,0)) PlannedQty,CEILING(SUM(ISNULL(OpenQty,0))) OpenQty

FROM

(

--生產訂單

SELECT T0.NumAtCard,T0.ItemCode,T1.PlannedQty PlannedQty ,CASE WHEN T1.Status IN ('P','R') AND T1.PlannedQty > T1.CmpltQty THEN T1.PlannedQty - T1.CmpltQty ELSE 0 END OpenQty

FROM #TMP_NEED_ALL_LINES T0

INNER JOIN OWOR T1 ON T0.NumAtCard = T1.PickRmrk AND T0.ItemCode = T1.ItemCode

WHERE T1.Status <> 'C'

UNION ALL

--採購訂單

SELECT T0.NumAtCard,T0.ItemCode,T1.Quantity*T1.NumPerMsr PlannedQty ,T1.OpenCreQty*T1.NumPerMsr 

FROM #TMP_NEED_ALL_LINES T0

INNER JOIN POR1 T1 ON T0.NumAtCard = T1.U_OrderNo AND T0.ItemCode = T1.ItemCode

INNER JOIN OPOR T2 ON T1.DocEntry = T2.DocEntry AND T2.DocType = 'I'

WHERE T2.CANCELED <> 'Y'

--UNION ALL --採購退貨單不會產生在途

--SELECT T0.NumAtCard,T0.ItemCode,T1.Quantity*T1.NumPerMsr PlannedQty ,T1.OpenCreQty*T1.NumPerMsr 

--FROM #TMP_NEED_ALL_LINES T0

--INNER JOIN RPD1 T1 ON T0.NumAtCard = T1.U_OrderNo AND T0.ItemCode = T1.ItemCode

--INNER JOIN ORPD T2 ON T1.DocEntry = T2.DocEntry AND T2.DocType = 'I'

)U0

GROUP BY U0.NumAtCard,U0.ItemCode

)T11 ON T10.NumAtCard = T11.NumAtCard AND T10.ItemCode = T11.ItemCode

LEFT JOIN 

(

--採購申請數量

SELECT T0.NumAtCard,T0.ItemCode,T1.OpenCreQty Quantity 

FROM #TMP_NEED_ALL_LINES T0

INNER JOIN PRQ1 T1 ON T0.NumAtCard = T1.U_OrderNo AND T0.ItemCode = T1.ItemCode AND T1.LineStatus = 'O'

)T12 ON T10.NumAtCard = T12.NumAtCard AND T10.ItemCode = T12.ItemCode

LEFT JOIN

(

--庫存情況

SELECT T0.ItemCode,ISNULL(SUM(CASE WHEN T0.WHSCODE NOT IN('C08','C38') THEN T0.OnHand ELSE 0 END),0) OnHand

,ISNULL(SUM(CASE WHEN T0.WhsCode NOT LIKE 'C3%' AND T0.WHSCODE <> 'C08' THEN T0.OnHand ELSE 0 END ),0) AS OnHand_GK 

,ISNULL(SUM(CASE WHEN T0.WhsCode LIKE 'C3%' AND T0.WhsCode <> 'C38' THEN T0.OnHand ELSE 0 END ),0) AS OnHand_TA

,ISNULL(SUM(CASE WHEN T0.WhsCode = 'C08' THEN T0.OnHand ELSE 0 END ),0) AS OnQC_GK

,ISNULL(SUM(CASE WHEN T0.WhsCode = 'C38' THEN T0.OnHand ELSE 0 END ),0) AS OnQC_TA

FROM OITW T0 

WHERE T0.OnHand >0 

AND T0.ItemCode IN (SELECT DISTINCT ItemCode FROM #TMP_NEED_ALL_LINES)

AND T0.WhsCode NOT IN ('C01','C04','C10','C13','C14','C15','C16','C18','C19','C34','C99')

GROUP BY T0.ItemCode

)T13 ON T10.ItemCode = T13.ItemCode

LEFT JOIN

(

--已發料數量

SELECT T29.NumAtCard,T20.ItemCode

,ISNULL(SUM(CASE WHEN CEILING(T21.PlannedQty*T20.BaseQty) < T22.IssuedQty --超出計劃數量發料 計劃量 - 完工數*基數

THEN CEILING(T21.PlannedQty*T20.BaseQty) - T21.CmpltQty*T20.BaseQty 

ELSE T22.IssuedQty - CEILING(T21.CmpltQty*T20.BaseQty) END) --不超出 實發量 - 完工數*基數 若負數則可能沒有領料或挪單領料,其它單理論上有正數補足

,0)  

AS [QtyIssued]

FROM 

(

--合計需求求下階需求

SELECT T0.Father,T2.Code ItemCode,SUM(T2.Quantity/T1.Qauntity) BaseQty

FROM (SELECT DISTINCT Father FROM #BOM2 WHERE Father <> '')  T0

INNER JOIN OITT T1 ON T0.Father = T1.Code

INNER JOIN ITT1 T2 ON T1.Code = T2.Father

GROUP BY  T0.Father,T2.Code

)T20

INNER JOIN (SELECT DISTINCT NumAtCard,Father FROM #BOM2) T29 ON T20.Father = T29.Father --AND T20.ItemCode = T29.ItemCode

INNER JOIN OWOR T21 ON T29.NumAtCard = T21.PickRmrk AND T20.Father = T21.ItemCode AND T21.[Status] IN ('P','R') --AND T11.DueDate <= @dueDate

INNER JOIN WOR1 T22 ON T21.DocEntry = T22.DocEntry AND T20.ItemCode = T22.ItemCode

GROUP BY T29.NumAtCard,T20.ItemCode

) T15 ON T10.NumAtCard = T15.NumAtCard AND T10.ItemCode = T15.ItemCode


RIGHT JOIN #BOM2 T14 ON T10.NumAtCard = T14.NumAtCard AND T10.ItemCode = T14.ItemCode


ORDER BY T14.Position ASC

FOR BROWSE 



DROP TABLE #BOM2

DROP TABLE #TMP_NEED_ALL_LINES

RETURN


END

相關文章
相關標籤/搜索