Konu: SQL Server FIFO Update
Sonunda verdigim sozu tutup SQL server'da FIFO update kodunu yazabildim:)
Once ornek data:
CREATE TABLE stock
(
id INT IDENTITY
PRIMARY KEY,
itemId INT,
inDate DATETIME default getDate(),
Qty INT
) ;
INSERT INTO stock ( itemId, inDate, Qty ) VALUES ( 1, '2009/1/1', 1000 ) ;
INSERT INTO stock ( itemId, inDate, Qty ) VALUES ( 1, '2009/1/2', 2000 ) ;
INSERT INTO stock ( itemId, inDate, Qty ) VALUES ( 1, '2009/1/3', 3000 ) ;
INSERT INTO stock ( itemId, inDate, Qty ) VALUES ( 2, '2009/1/1', 200 ) ;
INSERT INTO stock ( itemId, inDate, Qty ) VALUES ( 2, '2009/1/2', 100 ) ;
INSERT INTO stock ( itemId, inDate, Qty ) VALUES ( 2, '2009/1/3', 300 ) ;
INSERT INTO stock ( itemId, inDate, Qty ) VALUES ( 2, '2009/1/4', 100 ) ;
INSERT INTO stock ( itemId, inDate, Qty ) VALUES ( 2, '2009/1/5', 100 ) ;
INSERT INTO stock ( itemId, inDate, Qty ) VALUES ( 2, '2008/12/1', 100 ) ;
FIFO Update:
declare @itemId int, @qty int;
set @itemID = 2;
set @qty = 360;
UPDATE Stock
SET Qty = CASE
WHEN @qty >=
(SELECT sum(qty)
FROM stock stk
WHERE itemId=@itemID and stk.inDate <= Stock.inDate)
THEN 0
WHEN @qty <
(SELECT sum(qty)-Stock.qty
FROM stock stk
WHERE itemId=@itemID and stk.inDate <= Stock.inDate)
THEN Stock.Qty
ELSE
(SELECT sum(qty)
FROM stock stk
WHERE itemId=@itemID and stk.inDate <= Stock.inDate) - @qty
END
where itemId = @itemId;
select * from stock;
Not: Yukaridaki sekliyle aslinda SP yapilmaya uygun halde:
create procedure FIFOUpdate( @itemId int, @qty int ) As ...
SP olarak yazmamamin nedeni, bu haliyle hic SP yapmadan parametrik tek bir update komutu olarak ta VFP'den kullanilabilir:
text to lcUpdate noshow
UPDATE Stock
SET Qty = CASE
WHEN ?m.qty >=
(SELECT sum(qty)
FROM stock stk
WHERE itemId=?m.itemID and stk.inDate <= Stock.inDate)
THEN 0
WHEN ?m.qty <
(SELECT sum(qty)-Stock.qty
FROM stock stk
WHERE itemId=?m.itemID and stk.inDate <= Stock.inDate)
THEN Stock.Qty
ELSE
(SELECT sum(qty)
FROM stock stk
WHERE itemId=?m.itemID and stk.inDate <= Stock.inDate) - ?m.qty
END
where itemId = ?m.itemId;
endtext
qty = 360
itemId = 2
SQLExec(m.handle, m.lcUpdate)
Not: Joe Celko'nun FIFO/LIFO makalesinden yararlanilmistir.