08-02-2017, Saat: 18:44
Selam arkadaşlar, hazır birkaç arkadaş paylaşım yapıyorken bende biraz vakit bulduğum için kendi programımda kullandığım bir kaç yapıyı anlatayım istedim ki Cari-stok,cek,senet,fatura vs.vs. takip programı yazmak isteyen arkadaşlara belki yardımımız dokunur.
Stok hareketleri ve stok maliyet hesaplamasını nasıl yaptığımı basitçe anlatmaya çalışayım.
Öncelikle Cari hesap yada Stok için Ayrı hareket tablolarım var. Yani Herhangi bir cari hesaba ait bir işlem (Fatura, Çek, Senet, Sevkiyat, İrsaliye, Sipariş işlemi harici) gireceksem bu tabloya kayıt yapıyorum. Parantez içindeki hareketler kendi tablolarında kalıyor Cari ve Stok hareket tablolarına tekrardan girdi yapmıyorum (Daha önce o şekilde idi fakat bu foruma girince değişti ).
Cari için; Nakit, Kredi Kartı, Banka Yolu ile Tahsilat ve Ödeme işlemlerini,
Stok içinse Sadece Sair Giriş ve Çıkış işlemlerini Hareket tablolarına kaydediyorum.
Bu arada her stok kaydının altında Stok hareketlerini yürüyen bakiye şeklinde gösteriyorum, bunuda View kullanarak yapıyorum. Aşağıda stok işlemlerinde gösterdiğim view in örneği var (Bu arada kodlarda birçok şeyi temizliyorum zira karmaşık bir yapı var kolay anlaşılsın istedim).
Şimdi gelelim stok maliyet hesaplamasına; View lar da aynı normal tablolarınız gibi işlem görür, yani insert delete update işlemleri onlar üzerinde de çalışır, dolayısı ile trigger işlemlerini rahatlıkla yapabilirsiniz. Ben IBExpert kullanıyorum oldukça rahat yazılabiliyor. Stok maliyetlerini Stok_Maliyet isimli bir tabloda her stok için yılın her ayının ayrı ayrı maliyetini tutuyorum bunu hesaplarken de yine view kullanıyorum. Aşağıda maliyet hesaplama için kullandığım view var. Stok işlem tablosu ada fatura tablosunda bir hareket olduğunda bu view e kayıt yapılıyor yada siliniyor.
Daha sonra bu view in ilgili triggerlarına da aşağıdaki kodları yazarak STOK_MALIYET tablomu güncelliyorum.
STMALIYET_AI (After_Insert)
STMALIYET_AU (After_Update)
STMALIYET_AD (After_Delete)
Böylece her stok için yılın her ayı için ayrı ayrı maliyet hesaplanmış oluyor, maliyeti de Ağırlıklı Ortalama Birim Maliyet hesabına göre yapıyorum.
Stok hareketleri ve stok maliyet hesaplamasını nasıl yaptığımı basitçe anlatmaya çalışayım.
Öncelikle Cari hesap yada Stok için Ayrı hareket tablolarım var. Yani Herhangi bir cari hesaba ait bir işlem (Fatura, Çek, Senet, Sevkiyat, İrsaliye, Sipariş işlemi harici) gireceksem bu tabloya kayıt yapıyorum. Parantez içindeki hareketler kendi tablolarında kalıyor Cari ve Stok hareket tablolarına tekrardan girdi yapmıyorum (Daha önce o şekilde idi fakat bu foruma girince değişti ).
Cari için; Nakit, Kredi Kartı, Banka Yolu ile Tahsilat ve Ödeme işlemlerini,
Stok içinse Sadece Sair Giriş ve Çıkış işlemlerini Hareket tablolarına kaydediyorum.
Bu arada her stok kaydının altında Stok hareketlerini yürüyen bakiye şeklinde gösteriyorum, bunuda View kullanarak yapıyorum. Aşağıda stok işlemlerinde gösterdiğim view in örneği var (Bu arada kodlarda birçok şeyi temizliyorum zira karmaşık bir yapı var kolay anlaşılsın istedim).
CREATE VIEW S_ISLEM( KOD, STOKKODU, TURU, CARIKODU, TARIH, BELGENO, FIYAT, GIREN, CIKAN) AS select KOD, STOKKODU, TURU, CARIKODU, TARIH, BELGENO, FIYAT, GIREN, CIKAN from ( SELECT KOD, STOKKODU, CASE WHEN ALISSATIS=0 AND NORMIADE=0 THEN 'Alis Ft.' WHEN ALISSATIS=0 AND NORMIADE=1 THEN 'Alis Iade Ft.' WHEN ALISSATIS=1 AND NORMIADE=0 THEN 'Satis Ft.' WHEN ALISSATIS=1 AND NORMIADE=1 THEN 'Satis Iade Ft.' END AS TURU, CARIKODU, TARIH, FATNO AS BELGENO, ISK6K AS FIYAT, GIREN, CIKAN FROM FAT2 /*FATURALAR (Faturadaki stokların kayıt edildiği tablom)*/ WHERE BAYIKODU<=0 /*Bayi kodu 0 girildi ise ana bayiden (depodan) çıktı demektir bende ana bayi stoklarını göstereceğim için bayi kodu 0 olanları çekiyorum sadece, eğer bayi stokları istenirse onun için ayrı bir view var*/ UNION ALL SELECT KOD, STOKKODU, CASE WHEN ISLEMTURU=0 THEN 'Devir' WHEN ISLEMTURU=1 THEN 'Sair Giris' WHEN ISLEMTURU=2 THEN 'Sair Cikis' END AS TURU, IIF (KOD>=0,0,1) AS CARIKODU, /*Cari hareketi olmadığı için 0 basıyorum*/ TARIH, IIF (KOD>=0,'.','') AS BELGENO, /*Belge no diye bir alanım olmadığı için . (nokta) basıyorum*/ FIYAT, GIREN, CIKAN FROM STOK_ISLEM /*STOK ISLEMLERI*/ ) ORDER BY STOKKODU ;Stok hareketlerini yürüyen bakiye şeklinde aşağıdaki sql sorgusu ile gösteriyorum. Bu arada aşağıdaki yürüyen bakiye kodu http://www.boreas.gen.tr/2013/03/firebir...nning-sum/ sitesinden alıntıdır, yıllardır sorunsuz kullanıyorum kendisine buradan tekrar teşekkür ederim.
SELECT I.KOD, I.STOKKODU, I.TURU, I.CARIKODU, I.TARIH, I.BELGENO, C.UNVAN AS CUNVAN, I.FIYAT, I.GIREN, I.CIKAN, coalesce(CAST(rdb$get_context('USER_TRANSACTION','stk#') AS decimal(15,4) ),0) as KALAN, CAST(rdb$set_context('USER_TRANSACTION','stk#',coalesce(CAST(rdb$get_context('USER_TRANSACTION','stk#' )AS decimal(15,4) ),0)+ I.GIREN - I.CIKAN) AS decimal(15,2) ) as Set_Bakiye FROM S_ISLEM I LEFT JOIN CARI C ON C.KOD=I.CARIKODU WHERE I.STOKKODU=:KOD ORDER BY I.TARIH
Şimdi gelelim stok maliyet hesaplamasına; View lar da aynı normal tablolarınız gibi işlem görür, yani insert delete update işlemleri onlar üzerinde de çalışır, dolayısı ile trigger işlemlerini rahatlıkla yapabilirsiniz. Ben IBExpert kullanıyorum oldukça rahat yazılabiliyor. Stok maliyetlerini Stok_Maliyet isimli bir tabloda her stok için yılın her ayının ayrı ayrı maliyetini tutuyorum bunu hesaplarken de yine view kullanıyorum. Aşağıda maliyet hesaplama için kullandığım view var. Stok işlem tablosu ada fatura tablosunda bir hareket olduğunda bu view e kayıt yapılıyor yada siliniyor.
CREATE VIEW STMALIYET( STOKKODU, TARIH, GIREN, CIKAN, FIYAT) AS select STOKKODU, TARIH, GIREN, CIKAN ,FIYAT from ( SELECT STOKKODU, TARIH, GIREN, CIKAN ,FIYAT FROM STOK_ISLEM WHERE (ISLEMTURU=0 or ISLEMTURU=1) AND FIYAT>0 /*STOK ISLEM Devir ve Sair giriş ve fiyatlı giriş ise*/ UNION ALL SELECT STOKKODU, TARIH, GIREN, CIKAN ,ISK6K AS FIYAT FROM FAT2 WHERE ALISSATIS=0 AND NORMIADE=0 AND ISK6K>0 /*FATURA faturalı normal stok alışı ve fiyatlı ise (fatura tablosundan)*/ ) ORDER BY STOKKODU, TARIH ;
Daha sonra bu view in ilgili triggerlarına da aşağıdaki kodları yazarak STOK_MALIYET tablomu güncelliyorum.
STMALIYET_AI (After_Insert)
STMALIYET_AU (After_Update)
STMALIYET_AD (After_Delete)
declare variable maliyet decimal(15,4); declare variable AY SMALLINT; declare variable YIL SMALLINT; declare variable T1 DATE; declare variable T2 DATE; begin AY = substring(NEW.tarih from 6 for 2); YIL = substring(NEW.tarih from 1 for 4); if (AY<12) then BEGIN T1='01.'||:AY||'.'||:YIL; T2='01.'||(:AY+1)||'.'||:YIL; END ELSE BEGIN T1='01.'||:AY||'.'||:YIL; T2='01.01.'||(:YIL+1); END maliyet = 0; select sum(GIREN*FIYAT)/SUM(GIREN) from STMALIYET WHERE STOKKODU=NEW.stokkodu AND TARIH>=:T1 AND TARIH<:T2 into :maliyet; UPDATE OR INSERT INTO STOK_MALIYET (STOKKODU, AY, MALIYET) VALUES (NEW.STOKKODU, :AY, :MALIYET) MATCHING (STOKKODU, AY);
Böylece her stok için yılın her ayı için ayrı ayrı maliyet hesaplanmış oluyor, maliyeti de Ağırlıklı Ortalama Birim Maliyet hesabına göre yapıyorum.