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 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.
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ı: 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.

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.
WWW
Cevapla
#5
@esistem hocam, konu epey eski ama yine de şansımı deneyeyim dedim Smile bu konu için örnek olarak verebileceğiniz ufak bir veritabanı var mı?  Blush Blush
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk

Eyvallah..
Cevapla
#6
Hocam ben de acemice oluşturduğum bir view ' de listeleme yapıyorum. View kodlarını aşağıda ekledim. Burada KONTROL_YILI değişebiliyor. Kullanıcı hangi yılı isterse o yılın verilerinin listelenmesi lazım. Delphi tarafından bu view ' i her seferinde alter view ile güncelleyerek kontrol yılı değerini güncelliyorum. Her seferinde view 'i güncellemek yerine delphi tarafından kontrol yılını view'e parametre olarak gönderebilir miyim?

create view URUNLER ( TCNO,ADI_SOYADI,EKILEN_URUN,TOPLAM_TESPIT )
as
SELECT S2.TCNO,S2.ADI_SOYADI,S2.EKILEN_URUN
,(
SELECT SUM(TESPIT_ALAN)
FROM tbl_yem M2 WHERE M2.KONTROL_YILI=2022 and M2.TASINMAZ_DURUMU='Aktif' and M2.DURUM = 'Onaylandı' and S2.TCNO=M2.TCNO
Group By M2.TCNO
) as TOPLAM_TESPIT
FROM tbl_yem S2
WHERE S2.KONTROL_YILI=2022 and S2.TASINMAZ_DURUMU='Aktif' and S2.DURUM = 'Onaylandı'
Group By S2.TCNO,S2.ADI_SOYADI,S2.EKILEN_URUN
Cevapla
#7
view i kontrol_yili olmadan oluşturup, sorgu ile çekerken kontrol_yili ni girebilirsiniz.

(13-01-2022, Saat: 20:10)Aktolgali Adlı Kullanıcıdan Alıntı: @esistem hocam, konu epey eski ama yine de şansımı deneyeyim dedim Smile bu konu için örnek olarak verebileceğiniz ufak bir veritabanı var mı?  Blush Blush

Hocam maalesef uzun bi zamandır giremiyorum, geç gördüm, maalesef örnek yok elimde.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  pardusda dbeaver ıle fırebırd kullanımı hakkında sadikacar60 8 611 29-02-2024, Saat: 17:50
Son Yorum: Hayati
  Firebird Sound_ex Kodu. COMMANDX 1 303 28-01-2024, Saat: 01:56
Son Yorum: maydin60
  Firebird ile FIFO Hesaplama Nasıl yapılır? klavye 0 363 17-08-2023, Saat: 12:33
Son Yorum: klavye
  IBExpert ile Firebird Veri Kurtarma DelphiCanR 6 7.506 19-07-2023, Saat: 14:42
Son Yorum: baloglurecep
  Firebird Bozuk Dosya Hk. dark12side 1 394 07-06-2023, Saat: 21:53
Son Yorum: mrmarman



Konuyu Okuyanlar: 1 Ziyaretçi