SQL Server 2000のストアドプロシージャ(現在は更新できません)にカーソルがあり、すべてのテーブルが更新されますが、通常、完了するまでに数分かかります。もっと速くする必要があります。
一方、GDEPO:入口デポ、CDEPO:出口デポ、Adet:数量、使用されるE_CIKAN数量。
説明を記録する:
- 20ユニットがデポ01に入り、
- 10ユニットは01を残します。
- 5ユニットは01を離れます(最初のレコードのE_CIKANは15になります)
- さらに10ユニットがデポ01に入ります。
- 3ユニットは1番目のレコードから01を残します。1番目のレコードのE_CIKANが18に設定されていることに注意してください。
- ここで問題が発生します。3ユニットがデポ01を離れる必要があります。1番目のレコードから2ユニット、5番目のレコードから1ユニットかかります。私のSPは、本当に遅いことを除いて、写真に見られるようにこれをうまく処理できます。
これが英語に翻訳されたストアドプロシージャです。
CREATE PROC [dbo].[UpdateProductDetails]
as
UPDATE PRODUCTDETAILS SET E_CIKAN=0;
DECLARE @ID int
DECLARE @SK varchar(50),@DP varchar(50) --SK = STOKKODU = PRODUCTID, DP = DEPOT
DECLARE @DEMAND float --Demand=Quantity, We'll decrease it record by record
DECLARE @SUBID int
DECLARE @SUBQTY float,@SUBCK float,@REMAINS float
DECLARE SH CURSOR FAST_FORWARD FOR
SELECT [ID],PRODUCTID,QTY,EXITDEPOT FROM PRODUCTDETAILS WHERE (EXITDEPOT IS NOT NULL) ORDER BY [DATE] ASC
OPEN SH
FETCH NEXT FROM SH INTO @ID, @SK,@DEMAND,@DP
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE SA CURSOR FAST_FORWARD FOR
SELECT [ID],QTY,E_CIKAN FROM PRODUCTDETAILS WHERE (QTY>E_CIKAN) AND (PRODUCTID=@SK) AND (ENTRYDEPOT=@DP) ORDER BY [DATE] ASC
OPEN SA
FETCH NEXT FROM SA INTO @SUBID, @SUBQTY,@SUBCK
WHILE (@@FETCH_STATUS = 0) AND (@DEMAND>0)
BEGIN
SET @REMAINS=@SUBQTY-@SUBCK
IF @DEMAND>@REMAINS --current record isnt sufficient, use it and move on
BEGIN
UPDATE PRODUCTDETAILS SET E_CIKAN=QTY WHERE ID=@SUBID;
SET @DEMAND=@DEMAND-@REMAINS
END
ELSE
BEGIN
UPDATE PRODUCTDETAILS SET E_CIKAN=E_CIKAN+@DEMAND WHERE ID=@SUBID;
SET @DEMAND=0
END
FETCH NEXT FROM SA INTO @SUBID, @SUBAD,@SUBCK
END
CLOSE SA
DEALLOCATE SA
FETCH NEXT FROM SH INTO @ID, @SK,@DEMAND,@DP
END
CLOSE SH
DEALLOCATE SH