Tüm Platformlar için Hızlı Uygulama Geliştirme Kitap Yayın Süreci
Kitap gözden geçirilmek üzere BTG (Bilgi ve Teknoloji Grubu) 'na gönderildi. 05.10.2018-14:10
BTG (Bilgi ve Teknoloji Grubu) tarafından iki sayfalık bir reklam tasarımı bekleniyor. 08.10.2018 - 15:30
Kitap basım talebi değerlendirilmek üzere matbaaya bildirildi. Matbaadan basım süreci hakkında bilgi bekleniyor. 15.10.2018 - 15:34
Kitap 1.000 adet basım talebi ile matbaaya gönderildi. 16.10.2018 - 16:50

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Firebird stok hareketleri ve maliyet hesaplanması, trigger, view ile
#1
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).

 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 Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol 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.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#2
O zaman size de teşekkürler Smile
There's no place like 127.0.0.1
WWW
Cevapla
#3
FireBird'den pek anlamam ama, SQL'de bir LEFT JOIN kullanımı söz konusu ise, LEFT JOIN'den hemen önce belirtilen tablonun(örneğinizde S_ISLEM I) ilgili alanlarının ISNULL, COALESCE vb. fonksiyonlar ile kontrol edilerek sunulması yerinde olur.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#4
(09-02-2017, Saat: 10:03)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlFireBird'den pek anlamam ama, SQL'de bir LEFT JOIN kullanımı söz konusu ise, LEFT JOIN'den hemen önce belirtilen tablonun(örneğinizde S_ISLEM I) ilgili alanlarının ISNULL, COALESCE vb. fonksiyonlar ile kontrol edilerek sunulması yerinde olur.

Selam hocam.
Hesaplama yaparken dediğinizi yapmazsak büyük sorun yaratır, fakat bu tip ekrana veri basan durumlarda (JOIN ile hesap kitap gerektiren bişi çekmediğimde) sorgu yavaşlamasın diye özellikle kullanmıyorum.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Firebird Yedekleme-Geri Yükleme Aracı ihalilcoban 0 125 14-10-2018, Saat: 22:33
Son Yorum: ihalilcoban
  Firebird External Table Storage anemos 4 214 05-10-2018, Saat: 22:04
Son Yorum: anemos
  Yeni Başlayanlar İçin Firebird Kurulumu ve Delphi FireDAC Ayarları DelphiCanR 18 2.465 12-09-2018, Saat: 11:54
Son Yorum: rmzgenius
  Firebird Pivot Sorgu klavye 6 1.162 14-08-2018, Saat: 22:39
Son Yorum: anemos
  FireBird Merge Into Kullanımı mcuyan 2 215 13-08-2018, Saat: 12:40
Son Yorum: mcuyan



Konuyu Okuyanlar: 1 Ziyaretçi