FIFO LIFO Procedure

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
lazymule
Üye
Mesajlar: 127
Kayıt: 16 Eki 2006 04:03
İletişim:

FIFO LIFO Procedure

Mesaj gönderen lazymule »

Merhabalar

Tarih----G_Miktar--G_Bfiyat--G_Tutar--------C_Miktar--C_Bfiyat--_Tutar
01.01--------10---------2------- 20
02.01----------------------------------------3---------3---------9 (kar 3)
03.01----------------------------------------6---------4---------24 (kar 12)
04.01--------5--------3--------15
05.01----------------------------------------4---------5---------20( kar 9)

Yukarıdakine benzer bir tablom var bu tablodan
fifo ve lifo göre kar zararı çıkarmam gerekiyor delphi de tamamda sql de nasıl yapılır bu tecrübesi olan varmıdır 2 gündür uğraşıyorum.
Evrende Ulaşılamayacak Tepe Yoktur !!!!
Yeterki İnsan Ulaşmak İstesin !!!!
http://www.maxiteknik.com
Kullanıcı avatarı
lazymule
Üye
Mesajlar: 127
Kayıt: 16 Eki 2006 04:03
İletişim:

Re: FIFO LIFO Procedure

Mesaj gönderen lazymule »

Kimse Yok mu ? :roll:
Evrende Ulaşılamayacak Tepe Yoktur !!!!
Yeterki İnsan Ulaşmak İstesin !!!!
http://www.maxiteknik.com
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: FIFO LIFO Procedure

Mesaj gönderen m_ekici »

bildiğim kadarıyla cevap vermeye çalışayım;

Direk tek query ile yapman zor. ama cursor ile bir döngü oluşturup normalde prg içerisinde nasıl yapıyosan sql ile de aynısını yapabilirsin.
Kullanıcı avatarı
lazymule
Üye
Mesajlar: 127
Kayıt: 16 Eki 2006 04:03
İletişim:

Re: FIFO LIFO Procedure

Mesaj gönderen lazymule »

m_ekici
cursor ile denedim fakat başarılı olmadım 2-3 gündür ara verdim sürekli uğraşınca insan hep aynı şeyleri denemeye başlıyor.
tecrübesi olan arkdaşlar varsa paylaşırlarsa sevinirimn
Evrende Ulaşılamayacak Tepe Yoktur !!!!
Yeterki İnsan Ulaşmak İstesin !!!!
http://www.maxiteknik.com
Kullanıcı avatarı
loribnaczo54
Üye
Mesajlar: 60
Kayıt: 24 Nis 2006 07:42
Konum: Bahçelievler/İst.

Re: FIFO LIFO Procedure

Mesaj gönderen loribnaczo54 »

lazymule yazdı:m_ekici
cursor ile denedim fakat başarılı olmadım 2-3 gündür ara verdim sürekli uğraşınca insan hep aynı şeyleri denemeye başlıyor.
tecrübesi olan arkdaşlar varsa paylaşırlarsa sevinirimn
forumda bu konu hayli konuşulmuştu, anlatımlı örneklerde mevcut sanıyorum.

şöyle bir örnek verebilirim. benim uyguladığım sistemde iki tablo var.
1. tablo stok hareket tablosu (giriş-çıkış hareketlerinin bulunduğu tablo)
2. tablo stok cıkış hareketi yardımcı tablosu
mantalitesi ; stok hareket tablosunda, bir çıkış kaydı işlendiğinde ( insert trigger) veya belirli çıkış hareketlerin ( bir form aracılığıyla kriter belirleyerek süzülebilir.) bilgilerini aşağıdaki stored procedure gönderiyoruz. procedure çıkan miktara göre giren miktarları listeliyor ve cursor yardımıyla döndürerek, ikinci tablomuza (cikis yardımcı tablosu)
giriş hareketinin id sini kaydediyor. böylelikle giriş hareketinin miktarı eritilmiş oluyor.

umarım bir fikir verebilir. kolay gelsin.

Kod: Tümünü seç

CREATE procedure spFIFO_DON
	@stok_kodu		varchar(30),
	@c_hareket_no		bigint,
	@c_gelis_karti		varchar(10),
	@c_miktar		float,
	@mikbrcarpan		float,
	@tarih			datetime,	
	@kayit_id		bigint
as
	set nocount on

declare 
	@maliyet_hesap_sekli	varchar(30)

----  burada farklı maliyetlendirme sistemi kullanmak istenildiğinde parametre formundan sorgulanabilir.
  if @maliyet_hesap_sekli = ''   set @maliyet_hesap_sekli='Fifo'


declare 
	@hes_giren	float,
	@fiyat		float,
	@tutar		float,
	@toplam	float,
	@kullanilabilir_mik	float,
	@cikan_mik	float,
	@tarih1		datetime,
	@hartar		datetime,
	@g_kayit_id	bigint

DELETE FROM M_stokHarCikisDetay WHERE c_kayit_id = @kayit_id 

declare FifoCursor cursor 
 for 


SELECT  DISTINCT  A.tarih, A.hartar, A.kayit_id, A.stok_kodu, A.hes_giren, 
                          (SELECT     SUM(miktar)
                            FROM          M_stokHarCikisDetay
                            WHERE      A.gelis_karti = g_gelis_karti AND A.hareket_no = g_hareket_no AND A.stok_kodu = stok_kodu)  AS CikanMik
FROM         M_stok_hareket_listesi A LEFT OUTER JOIN
                      M_stokHarCikisDetay B ON A.kayit_id=B.g_kayit_id
WHERE     (A.stok_kodu = @stok_kodu) AND (A.hes_giren > 0) 
ORDER BY A.tarih, A.hartar


	open FifoCursor
	fetch next from FifoCursor into @tarih1, @hartar, @g_kayit_id, @stok_kodu, @hes_giren, @cikan_mik
	while (@@FETCH_STATUS = 0) begin

	
	 if isnumeric(@c_miktar)		= 0 begin set @c_miktar 		= 0 end
	 if isnumeric(@cikan_mik)	= 0 begin set @cikan_mik	= 0 end
	set @kullanilabilir_mik = @hes_giren - @cikan_mik
	  if @c_miktar > 0 
	   begin		
		if @kullanilabilir_mik > 0 
		 begin
			if @kullanilabilir_mik > @c_miktar  
			 begin
	 			INSERT INTO M_stokHarCikisDetay
				    	(c_hareket_no, c_gelis_karti, stok_kodu, miktar, mikbr_carpan, tarih, c_kayit_id, g_kayit_id)
				VALUES     
				    	(@c_hareket_no, @c_gelis_karti, @stok_kodu, @c_miktar, @mikbrcarpan, @tarih, @kayit_id, @g_kayit_id)
			   set @c_miktar = 0
			 end
			if @kullanilabilir_mik <= @c_miktar  
			 begin
	 			INSERT INTO M_stokHarCikisDetay
				    	(c_hareket_no, c_gelis_karti, stok_kodu, miktar, mikbr_carpan, tarih, c_kayit_id, g_kayit_id)
				VALUES     
				    	(@c_hareket_no, @c_gelis_karti, @stok_kodu, @kullanilabilir_mik, @mikbrcarpan, @tarih, @kayit_id, @g_kayit_id)
			   set @c_miktar = @c_miktar - @kullanilabilir_mik
			 end

		 end
	   end
	  fetch next from FifoCursor into @tarih1, @hartar, @g_kayit_id, @stok_kodu, @hes_giren, @cikan_mik
	end
	close FifoCursor
deallocate FifoCursor

GO

Kullanıcı avatarı
lazymule
Üye
Mesajlar: 127
Kayıt: 16 Eki 2006 04:03
İletişim:

Re: FIFO LIFO Procedure

Mesaj gönderen lazymule »

loribnaczo54
3 kere okudum ama anlamadım. :(
ilgin için teşekkürler hafta sonu bir daha rüyasına yatayım :)
2 tane cursor gerekmezmi biri girişlerde dönerken diğeri çıkışlarda dönmesi için
20 gelmiş 5 bir çıkmış 10 bir daha çıkmış ?
kağıt üzerinde çok basit lakin sql ye geçince kafa çalışmadı.
en yakın bulduğum örnek lakin inglizcem yetmedi.
http://ask.sqlservercentral.com/questio ... oblem/1099
Evrende Ulaşılamayacak Tepe Yoktur !!!!
Yeterki İnsan Ulaşmak İstesin !!!!
http://www.maxiteknik.com
Kullanıcı avatarı
loribnaczo54
Üye
Mesajlar: 60
Kayıt: 24 Nis 2006 07:42
Konum: Bahçelievler/İst.

Re: FIFO LIFO Procedure

Mesaj gönderen loribnaczo54 »

lazymule yazdı:loribnaczo54
3 kere okudum ama anlamadım. :(
ilgin için teşekkürler hafta sonu bir daha rüyasına yatayım :)
2 tane cursor gerekmezmi biri girişlerde dönerken diğeri çıkışlarda dönmesi için
20 gelmiş 5 bir çıkmış 10 bir daha çıkmış ?
kağıt üzerinde çok basit lakin sql ye geçince kafa çalışmadı.
en yakın bulduğum örnek lakin inglizcem yetmedi.
http://ask.sqlservercentral.com/questio ... oblem/1099
mrb. ben biraz karışık anlatmış olabilirim. (zaman darlığından).
şöyle özetlemeye çalışayım. örneğin stok_hareket_tablo suna 1 kayit işlendiğinde buradaki insert trigger i çalışır ve FIFO strored procedure ne değer yollar.
örneğin; (cikis_id, cikis_mik, stok_id, cikis_tarihi...vb gibi).
top şimdi procedure de.
Procedure cikan stok id sinin aktif girenlerini tarih sırasına göre listeler. ve bir döngü içinde miktarlarını eriterek, eriyen giriş hareketini yardımcı tablo olan cikis_detay tablosuna kaydeder.
örneğin; cikis_detay_tablosu alanları -> (cikis_id, cikis_mik, giris_id, giristen_kullanilan_mik, giris_tar...) vs...
Not: cikan stok_id sinin aktif girenlerini cümlesinden kastım. döngüyü başlatırken bir select cümleciği oluşur. amacı aynı stok_id sine ait giriş hareketlerinin henüz kullanılmamış miktarlarını tespit eder. örneğin;

Kod: Tümünü seç

SELECT  DISTINCT  A.tarih, A.kayit_id, A.stok_kodu, A.giren_mik,
                          (SELECT     SUM(miktar)
                            FROM          M_stokHarCikisDetay
                            WHERE      A.gelis_karti = g_gelis_karti AND A.hareket_no = g_hareket_no AND A.stok_kodu = stok_kodu)  AS CikanMik
FROM         M_stok_hareket_listesi A LEFT OUTER JOIN
                      M_stokHarCikisDetay B ON A.kayit_id = B.g_kayit_id
WHERE     (A.stok_kodu = @stok_kodu) 
ORDER BY A.tarih


trigger+procedure olması biraz kafa karıştırıcı olmuş olabilir ama ben bu sistemin perfonmansından oldukça memnumum.
Cevapla