1 Son düzenleyen, konuka (09.12.2009 12:23:25)

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.

SQL
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

VFP9 SP2

2

Re: SCAN .. ENDSCAN mantığını SQL de uygulama

tek komutta beceremediğim:

SQL
UPDATE tekstil SET sevkedilen = sevkedilen +

(SELECT sevk.adet FROM sevk
WHERE sevk.sevkid=3 AND iadet<0 AND sevk.teksid=tekstil.teksid )
WHERE tekstil.teksid IN (SELECT sevk.teksid FROM sevk LEFT OUTER JOIN tekstil ON sevk.teksid=tekstil.teksid
WHERE sevkid=3 AND sevk.teksid=tekstil.teksid)


ilk subdöngü doğru data seti veriyor -adetleri
ikinci subdöngü de doğru data seti veriyor  - hangi tekstillerin değiştirileceğini

SQL komut çalıştırılınca sevkiyat içerisinde ki tekstil hareketlerini doğru kaydediyor, ancak diğer bütün sevkiyatları da tekstillere en üstteki kayıt adedi olmak üzere işliyor ! yani çalışmıyor. (program başlığında yazdığım cursorlu doğru çalışıyor)

VFP9 SP2

3

Re: SCAN .. ENDSCAN mantığını SQL de uygulama

Ali abi, bir ipucu o halde:

SQL serverda bu tip işleri geçici tablolarda yapman bence  uygulamada en mantıklı bir çözüm:

Temporary(Geçici) tablolar
tempdb veritabanında geçici olarak oluşan tablolardır.

İki çeşit geçici tablo vardır:
1- Local Temporary tablolar: İsimlerinin başında '#' işareti olur
Sadece yaratıldıkları contextte(bağlamda)(prosedür,oturum vs)
da kullanılabilirler. Prosedürün çalışması bitince
veya Oturum kapatıldığında otomatik olarak silinirler
2- Global Temporary tablolar: İsimlerinin başında '##' işareti olur
yaratıldıkları oturum dışında başka oturumlarca da kullanılabilirler.
Hiç kullanıcı kalmayınca otomatik olarak silinirler.

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü