Konu: SCAN .. ENDSCAN mantığını SQL de uygulama
SCAN.. ENDSCAN mantığından biz VFPcular zor kurtulacağız, SQLde nasıl yaparız diye birşeyler yapmaya çalıştım : stored procedure içinden üretilen cursor ile oluyor.
Aşağıda çeşitli tekstillerin stok kaydını düzenleyen bir sevkiyat var. Sevk birçok tekstilden oluşuyor, sevk fiş numarasını verince stoklardaki sevkedilen alanını arttırıyor. Yanlarına bizm anladığımız kodları da uydurmaya çalıştım.
DECLARE @sevkid SMALLINT -- şimdilik,
SET @sevkid = 3 --3 nolu sevkiyat
-- esasında sevkiyat parametre olarak stored procedure geliyor
DECLARE @adet SMALLINT
, @teksid INT
-- aşağıdaki tablonun değişmeden önceki hali , kontrol için - konu ile ilgisi yok
SELECT sevk.adet,tekstil.teksid,teksad,sevk.sevkid,tekstil.sevkedilen,sevk.iadet
FROM irs..sevk LEFT OUTER JOIN irs..tekstil ON sevk.teksid=tekstil.teksid
WHERE sevkid=3 ORDER BY sira DESC, sevkid
DECLARE sevk_cursor CURSOR
FOR
SELECT sevk.adet,tekstil.teksid
FROM irs..sevk LEFT OUTER JOIN irs..tekstil ON sevk.teksid=tekstil.teksid
WHERE sevkid=3 ORDER BY sira DESC, sevkid
OPEN sevk_cursor
FETCH NEXT FROM sevk_cursor INTO @adet, @teksid -- bunu döngü öncesi giriyorsun
-- bizdeki SCATTER MEMVAR gibi
WHILE @@FETCH_STATUS=0 -- bizdeki SCAN WHILE ! EOF
BEGIN -- BEGIN ile birlikte döngü @@FETCH_STATUS - olana kadar
--esas tabloyu döngü içinde değiştiriyor
UPDATE irs..tekstil
SET sevkedilen=sevkedilen + @adet WHERE teksid=@teksid
FETCH NEXT FROM sevk_cursor INTO @adet, @teksid -- bizdeki SCATTER MEMVAR gibi
END -- döngü sonu
close sevk_cursor -- bu ikisi cursorun izlerini, siliyor
DEALLOCATE sevk_cursor -- yapılmazsa bizdeki gibi cursoru silmiyor, hata veriyor
-- aşağıdaki tablonun değiştikten sonraki hali , kontrol için
SELECT sevk.adet,tekstil.teksid ,teksad,sevk.sevkid,tekstil.sevkedilen,sevk.iadet
FROM irs..sevk LEFT OUTER JOIN irs..tekstil ON sevk.teksid=tekstil.teksid
sevkid=3 ORDER BY sira DESC, sevkid
umarım paylaşım işinize yaramıştır, daha önce sorduğum FIFO uygulamasını da böyle çözebileceğimi düşünüyorum.
bir sonraki gönderide konuyu tek SQL komutu ile haletmeye çalışıp nasıl beceremediğimi de yollayacağım