Files
e-Book/3.玩轉SQL/參考資料/erp/Day7/參考文檔/數量及成本重置-sp/GEX_RESETQTY.txt
T

225 lines
8.7 KiB
Plaintext

CREATE PROC dbo.GEX_RESETQTY
(
@PROD1 NVARCHAR(20),
@PROD2 NVARCHAR(20),
@RESETTYPE NCHAR(1),
@DATE2 VARCHAR(10)
)
/*
Function : 進銷存數量重置主程式
Description:
目前的想法是將所有歷史重置的資料都統一寫到 FIVINVFINAL_HISTORY, 用 RESETDATE 區分不同時期的重置
風險是單一 Table 會有過大的疑慮, 但好處是固定的 Table 名稱, 管理及 SQL 語法都較方便處理
不含生管的數量重置作業, 可以支援單一產品或全產品重置
執行範例 EXEC GEX_RESETQTY '','ZZ','1','2099/12/31'
RESETTYPE = 1 全重置
2 從頭到指定重置日
3 從前次重置日到指定重置日
4 從前次重置日到最後
9 期初期末存量表等報表要臨時使用的期初存量(取消)
1,4 寫到 FIVINVFINAL
2,3 寫到 FIVINVFINAL_HISTORY
目前只要使用1和2 即可, 期末數量和單據筆數關連不大
但是成本重置的 SP, 就要分段計算, 這是效能問題
Build Date : 2011/07/13
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2011/07/13 加入註解
2 Michael 2011/11/10 修正產品引數傳入星號(zz)的 SQL 問題
3 Michael 2013/03/18 將數量欄位為 null 更新為 0
*/
AS
--要先停掉 Trigger
DISABLE TRIGGER DBO.TRI_INVSTKBILL1_CALCCOST ON dbo.INVSTKBILL1_D;
DISABLE TRIGGER DBO.TRI_INVSTKBILL2_CALCCOST ON dbo.INVSTKBILL2_D;
DISABLE TRIGGER DBO.TRI_INVSTKBILL3_CALCCOST ON dbo.INVSTKBILL3_D;
IF @RESETTYPE = 1 OR @RESETTYPE = 4
BEGIN
SET @DATE2 = '2199/12/31'
END
IF @RESETTYPE = '' OR @RESETTYPE = '*' BEGIN SET @RESETTYPE = '1' END
IF @DATE2 = '' BEGIN SET @DATE2 = '2199/12/31' END
--FOR 擴充機制使用
DECLARE @LOGINID VARCHAR(60)
DECLARE @FUNCTAG VARCHAR(30)
SELECT @LOGINID=GETDATE()+Round(RAND() * 10000, 0)
SET @FUNCTAG = 'GEX_RESETQTY'
--擴充機制
EXEC GEXRPT_INVRPT_EXTEND @PROD1,@PROD2,'','zz','1900/01/01',@DATE2,@FUNCTAG,'INV_INIT',@LOGINID,1
SELECT A.PRODUCTID, B.WAREID INTO #INVALL FROM BASPRODUCT A LEFT JOIN BASWAREHOUSE B ON 1 = 1
WHERE CASE WHEN @PROD1 = '*' THEN @PROD1 ELSE A.PRODUCTID END >= @PROD1
AND CASE WHEN @PROD2 = '*' THEN @PROD2 ELSE A.PRODUCTID END <= @PROD2
IF @RESETTYPE = 1 OR @RESETTYPE = 4
BEGIN
DELETE FROM FIVINVFINAL WHERE NOT EXISTS
(
SELECT * FROM BASPRODUCT
WHERE PRODUCTID = FIVINVFINAL.PRODUCTID
)
DELETE FROM FIV_LPS WHERE LOWPOINTSTOCK IS NULL
INSERT INTO FIVINVFINAL (PRODUCTID,WAREID,LOWPOINTSTOCK,NOWQUANTITY,NOWCOST,BORROWOUTQTY,BORROWINQTY,RETURNINQTY,RETURNOUTQTY)
SELECT A.PRODUCTID,A.WAREID,0,0,0,0,0,0,0 FROM #INVALL A
LEFT JOIN FIVINVFINAL B ON A.PRODUCTID = B.PRODUCTID AND A.WAREID = B.WAREID
WHERE B.NOWQUANTITY IS NULL
AND CASE WHEN @PROD1 = '*' THEN @PROD1 ELSE A.PRODUCTID END >= @PROD1
AND CASE WHEN @PROD2 = '*' THEN @PROD2 ELSE A.PRODUCTID END <= @PROD2
--保留安全庫存設定
INSERT INTO FIV_LPS (PRODUCTID,WAREID,LOWPOINTSTOCK)
SELECT A.PRODUCTID,A.WAREID,ISNULL(A.LOWPOINTSTOCK,0) FROM FIVINVFINAL A
LEFT JOIN FIV_LPS B ON A.PRODUCTID = B.PRODUCTID AND A.WAREID = B.WAREID
WHERE B.LOWPOINTSTOCK IS NULL
AND CASE WHEN @PROD1 = '*' THEN @PROD1 ELSE A.PRODUCTID END >= @PROD1
AND CASE WHEN @PROD2 = '*' THEN @PROD2 ELSE A.PRODUCTID END <= @PROD2
UPDATE FIV_LPS SET LOWPOINTSTOCK = (SELECT LOWPOINTSTOCK FROM FIVINVFINAL WHERE FIV_LPS.PRODUCTID = FIVINVFINAL.PRODUCTID AND FIV_LPS.WAREID = FIVINVFINAL.WAREID)
END
ELSE IF @RESETTYPE = 2 OR @RESETTYPE = 3
BEGIN
INSERT INTO FIVINVFINAL_HISTORY (RESETDATE,PRODUCTID,WAREID,LOWPOINTSTOCK,NOWQUANTITY,NOWCOST,BORROWOUTQTY,BORROWINQTY,RETURNINQTY,RETURNOUTQTY)
SELECT @DATE2,A.PRODUCTID,A.WAREID,0,0,0,0,0,0,0 FROM #INVALL A
LEFT JOIN FIVINVFINAL_HISTORY B ON A.PRODUCTID = B.PRODUCTID AND A.WAREID = B.WAREID AND RESETDATE = @DATE2
WHERE B.NOWQUANTITY IS NULL
AND CASE WHEN @PROD1 = '*' THEN @PROD1 ELSE A.PRODUCTID END >= @PROD1
AND CASE WHEN @PROD2 = '*' THEN @PROD2 ELSE A.PRODUCTID END <= @PROD2
END;
WITH INV1
AS
(
SELECT A.PRODUCTID, A.WAREID, SUM(A.QUANTITY) AS QTY1 FROM INVSTKBILL1_D A
LEFT JOIN INVSTKBILL1_M B ON A.BILLNO = B.BILLNO
WHERE B.BILLDATE <= @DATE2 GROUP BY A.PRODUCTID, A.WAREID
), INV2
AS
(
SELECT A.PRODUCTID, A.WAREID, SUM(A.QUANTITY) AS QTY2 FROM INVSTKBILL2_D A
LEFT JOIN INVSTKBILL2_M B ON A.BILLNO = B.BILLNO
WHERE B.BILLDATE <= @DATE2 GROUP BY A.PRODUCTID, A.WAREID
), INV3
AS
(
SELECT A.PRODUCTID, A.WAREID, SUM(A.QUANTITY) AS QTY3 FROM INVSTKBILL3_D A
LEFT JOIN INVSTKBILL3_M B ON A.BILLNO = B.BILLNO
WHERE B.BILLDATE <= @DATE2 GROUP BY A.PRODUCTID, A.WAREID
), INV41
AS
(
SELECT A.PRODUCTID, A.WAREINWAREHOUSE, SUM(A.QUANTITY) AS QTY41 FROM INVSTKBILL4_D A
LEFT JOIN INVSTKBILL4_M B ON A.BILLNO = B.BILLNO
WHERE B.BILLDATE <= @DATE2 GROUP BY A.PRODUCTID, A.WAREINWAREHOUSE
), INV42
AS
(
SELECT A.PRODUCTID, A.WAREID, SUM(A.QUANTITY) AS QTY42 FROM INVSTKBILL4_D A
LEFT JOIN INVSTKBILL4_M B ON A.BILLNO = B.BILLNO
WHERE B.BILLDATE <= @DATE2 GROUP BY A.PRODUCTID, A.WAREID
), INV5
AS
(
SELECT A.PRODUCTID, A.WAREID, SUM(A.QUANTITY) AS QTY5 FROM INVSTKBILL5_D A
LEFT JOIN INVSTKBILL5_M B ON A.BILLNO = B.BILLNO
WHERE B.BILLDATE <= @DATE2 GROUP BY A.PRODUCTID, A.WAREID
), INV6
AS
(
SELECT A.PRODUCTID, A.WAREID, SUM(A.QUANTITY) AS QTY6 FROM INVSTKBILL6_D A
LEFT JOIN INVSTKBILL6_M B ON A.BILLNO = B.BILLNO
WHERE B.BILLDATE <= @DATE2 GROUP BY A.PRODUCTID, A.WAREID
), INV71
AS
(
SELECT A.M_PRODID, A.WAREID, SUM(A.STANDARDBATCHQTY) AS QTY71 FROM INVSTKBILL7_M A
WHERE A.BILLDATE <= @DATE2 GROUP BY A.M_PRODID, A.WAREID
), INV72
AS
(
SELECT A.PRODUCTID, A.WAREID, SUM(A.QUANTITY) AS QTY72 FROM INVSTKBILL7_D A
LEFT JOIN INVSTKBILL7_M B ON A.BILLNO = B.BILLNO
WHERE B.BILLDATE <= @DATE2 GROUP BY A.PRODUCTID, A.WAREID
), INV77
AS
(
--擴充機制
SELECT A.PRODUCTID, A.WAREID, SUM(A.QUANTITY) AS QTY77 FROM INVEXTEND_INIT A
WHERE A.LOGINID = @LOGINID AND FUNCTAG = @FUNCTAG
GROUP BY A.PRODUCTID, A.WAREID
), FINAL99
AS
(
SELECT A.PRODUCTID, A.WAREID, ISNULL(B.QTY1,0) AS QTY1, ISNULL(C.QTY2,0) AS QTY2, ISNULL(D.QTY3,0) AS QTY3,
ISNULL(E.QTY41,0) AS QTY41, ISNULL(F.QTY42,0) AS QTY42, ISNULL(G.QTY5,0) AS QTY5, ISNULL(H.QTY6,0) AS QTY6,
ISNULL(I.QTY71,0) AS QTY71, ISNULL(J.QTY72,0) AS QTY72, ISNULL(K.QTY77,0) AS QTY77
FROM #INVALL A
LEFT JOIN INV1 B ON A.PRODUCTID = B.PRODUCTID AND A.WAREID = B.WAREID
LEFT JOIN INV2 C ON A.PRODUCTID = C.PRODUCTID AND A.WAREID = C.WAREID
LEFT JOIN INV3 D ON A.PRODUCTID = D.PRODUCTID AND A.WAREID = D.WAREID
LEFT JOIN INV41 E ON A.PRODUCTID = E.PRODUCTID AND A.WAREID = E.WAREINWAREHOUSE
LEFT JOIN INV42 F ON A.PRODUCTID = F.PRODUCTID AND A.WAREID = F.WAREID
LEFT JOIN INV5 G ON A.PRODUCTID = G.PRODUCTID AND A.WAREID = G.WAREID
LEFT JOIN INV6 H ON A.PRODUCTID = H.PRODUCTID AND A.WAREID = H.WAREID
LEFT JOIN INV71 I ON A.PRODUCTID = I.M_PRODID AND A.WAREID = I.WAREID
LEFT JOIN INV72 J ON A.PRODUCTID = J.PRODUCTID AND A.WAREID = J.WAREID
LEFT JOIN INV77 K ON A.PRODUCTID = K.PRODUCTID AND A.WAREID = K.WAREID
), FINALOK
AS
(
SELECT PRODUCTID, WAREID, (QTY1-QTY2+QTY3+QTY41-QTY42-QTY5+QTY6+QTY71-QTY72+QTY77) AS NOWQTY
FROM FINAL99
)
--用 WITH 就一定要在下一句 SQL 使用, 只好先寫到 TempDB
SELECT * INTO #FINALOK FROM FINALOK
IF @RESETTYPE = 1 OR @RESETTYPE = 4
BEGIN
UPDATE FIVINVFINAL SET NOWQUANTITY = B.NOWQTY FROM #FINALOK B WHERE B.PRODUCTID = FIVINVFINAL.PRODUCTID AND B.WAREID= FIVINVFINAL.WAREID
UPDATE FIVINVFINAL SET LOWPOINTSTOCK = (SELECT LOWPOINTSTOCK FROM FIV_LPS WHERE FIV_LPS.PRODUCTID = FIVINVFINAL.PRODUCTID AND FIV_LPS.WAREID = FIVINVFINAL.WAREID)
DELETE FROM FIVINVFINAL WHERE NOWQUANTITY = 0 AND LOWPOINTSTOCK = 0 AND BORROWOUTQTY = 0 AND BORROWINQTY = 0 AND RETURNINQTY = 0 AND RETURNOUTQTY = 0
END
ELSE IF @RESETTYPE = 2 OR @RESETTYPE = 3
BEGIN
UPDATE FIVINVFINAL_HISTORY SET NOWQUANTITY = B.NOWQTY FROM #FINALOK B WHERE B.PRODUCTID = FIVINVFINAL_HISTORY.PRODUCTID AND B.WAREID= FIVINVFINAL_HISTORY.WAREID
AND FIVINVFINAL_HISTORY.RESETDATE = @DATE2
DELETE FROM FIVINVFINAL_HISTORY WHERE NOWQUANTITY = 0 AND LOWPOINTSTOCK = 0 AND BORROWOUTQTY = 0 AND BORROWINQTY = 0 AND RETURNINQTY = 0 AND RETURNOUTQTY = 0
END
--刪除暫存內容
DELETE FROM INVEXTEND_INIT WHERE LOGINID = @LOGINID AND FUNCTAG = @FUNCTAG
--重置借還貨數量
IF @RESETTYPE = 1 OR @RESETTYPE = 4 BEGIN
EXEC GEX_RESET_BORRQTY @PROD1,@PROD2
END
--將 NULL 重設為 0
UPDATE FIVINVFINAL SET LOWPOINTSTOCK = 0 WHERE LOWPOINTSTOCK IS NULL
UPDATE FIVINVFINAL SET BORROWOUTQTY = 0 WHERE BORROWOUTQTY IS NULL
UPDATE FIVINVFINAL SET BORROWINQTY = 0 WHERE BORROWINQTY IS NULL
UPDATE FIVINVFINAL SET RETURNINQTY = 0 WHERE RETURNINQTY IS NULL
UPDATE FIVINVFINAL SET RETURNOUTQTY = 0 WHERE RETURNOUTQTY IS NULL
DROP TABLE #INVALL
DROP TABLE #FINALOK;
--重啟 Trigger
ENABLE TRIGGER DBO.TRI_INVSTKBILL1_CALCCOST ON dbo.INVSTKBILL1_D;
ENABLE TRIGGER DBO.TRI_INVSTKBILL2_CALCCOST ON dbo.INVSTKBILL2_D;
ENABLE TRIGGER DBO.TRI_INVSTKBILL3_CALCCOST ON dbo.INVSTKBILL3_D;