-- ======================================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