Delphi Can
Triger ile update - Baskı Önizleme

+- Delphi Can (http://www.delphican.com)
+-- Forum: Veri Tabanı (http://www.delphican.com/forumdisplay.php?fid=4)
+--- Forum: FireBird (http://www.delphican.com/forumdisplay.php?fid=13)
+--- Konu Başlığı: Triger ile update (/showthread.php?tid=4041)



Triger ile update - Aktolgali - 06-10-2019

Merhaba;
3 tablo var 
Cari(crid,crborc,cralacak),
Hareket(hrid,crid,hrtur,hrborc,hralacak),
HDetay(hdid,hrid,hdurun,hdtutar). 
Tablolarım arasındaki bağıntı bire çok.

Sp ile HDetay tablosuna giriş yaparken Hareket tablosuna da giriş yapılıyor.
Triggerla son girilen Hareket tablosunda hrborc veya hralacak alanı HDetaydaki hdtutar alanına girilen değere göre update yapılıyor.
Cari tablosunda crborc veya cralacak alanı da Hareket tablosunda ki hrborc veya hralacak alanına göre update ediliyor. Fakat HDetay tablosuna girilen ilk değer cari tablosunun crborc veya cralacak alanı update olmuyor ama Hareket tablosunun ilgili alanının toplamı tam ve doğru olarak update ediliyor. 

Hareket before insert triger
  if (inserting) then
 begin
       update tbl_cari set
       tbl_cari.cr_borc=tbl_cari.cr_borc+(new.hr_borc)
       where tbl_cari.cr_id=new.hr_crid;
 end

Hareket After Update trigger
    if (updating) then
   begin
       update tbl_cari set
       tbl_cari.cr_borc=tbl_cari.cr_borc+(new.hr_borc-old.hr_borc)
       where tbl_cari.cr_id=old.hr_crid;
  end

HDetay before insert trigger
 begin
         update tbl_hareket h set
         h.hr_alacak=h.hr_alacak+hdtutar,
         h.hr_tur=:tur,
         h.hr_belgeturu=:belge,
         h.hr_aciklama=:aciklama
         where h.hr_id=new.hd_hrid;
     end
     begin
       update tbl_stok s set
       s.stk_giris=s.stk_giris + new.hd_miktar
       where s.stk_id=new.hd_stokid;
     end
 end

Hdetay before update trigger
 
     begin
         update tbl_hareket h set
         h.hr_alacak=h.hr_alacak+(new.hdtutar-old.hdtutar)
         where h.hr_id=old.hd_hrid;
     end
     begin
       update tbl_stok s set
       s.stk_giris=s.stk_giris + (new.hd_miktar-old.hd_miktar)
       where s.stk_id=old.hd_stokid;
     end
 end


triggerların tablolardaki sonucu aşağıdaki gibi oluyor. Cari tablosu borc alacak toplamları eksik oluyor. Her defasında detaydaki ilk kayıtın tutarını toplama eklemiyor.

HDetay tablosu kayıtları
hdid            hrid          hdurun                 hdtutar
1                  1              Çikolata                 3,00 TL
2                  1              Kitap                     6,00 TL
3                  1              Defter                   7,00 TL
4                  1              kalem                   4,00 TL

Hareket tablosu kayıtları
hrid          crid           hrtur           hrborc              hralacak
1               4             satış            20,00TL             0
2               4             tahsilat          0                     20,00TL

Cari tablosu kayıtları
crid               crborc                     cralacak
4                   17,00TL                   20,00TL


Cvp: Triger ile update - serdar - 06-10-2019

Merhaba ben mssql kullanıyorum ama aklıma gelen şu;

Hareket before insert triger
 if (inserting) then
begin
      update tbl_cari set
      tbl_cari.cr_borc=tbl_cari.cr_borc+(new.hr_borc)
      where tbl_cari.cr_id=new.hr_crid;
end

tbl_cari.cr_borc=tbl_cari.cr_borc+(new.hr_borc)  bu satırda tbl_cari.cr_borc alanı NULL  değer içeriyorsa ilk kayıtta toplam yapmayıp 0 değerını atayabılır.
sonrakı işlemlerde 0 uzerıne ekleme yapıp toplam yapıyordur dıye dusunuyorum.

mssql de boyle durum için ISNULL fonksıyonunu kullanıyoruz.

tbl_cari.cr_borc=ISNULL(tbl_cari.cr_borc,0)+(new.hr_borc) .

yada tbl_cari.cr_borc alanını null deger kabul etmesını false yapıp, default degerıne 0 tanımlarsanız belkı duzelebılır

Firebird fonksiyonlarını ve syntax ını bılmıyorum ama mantık aynı olabılır


Cvp: Triger ile update - Aktolgali - 06-10-2019

(06-10-2019, Saat: 11:00)serdar Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba ben mssql kullanıyorum ama aklıma gelen şu;

Hareket before insert triger
 if (inserting) then
begin
      update tbl_cari set
      tbl_cari.cr_borc=tbl_cari.cr_borc+(new.hr_borc)
      where tbl_cari.cr_id=new.hr_crid;
end

tbl_cari.cr_borc=tbl_cari.cr_borc+(new.hr_borc)  bu satırda tbl_cari.cr_borc alanı NULL  değer içeriyorsa ilk kayıtta toplam yapmayıp 0 değerını atayabılır.
sonrakı işlemlerde 0 uzerıne ekleme yapıp toplam yapıyordur dıye dusunuyorum.

mssql de boyle durum için ISNULL fonksıyonunu kullanıyoruz.

tbl_cari.cr_borc=ISNULL(tbl_cari.cr_borc,0)+(new.hr_borc) .

yada tbl_cari.cr_borc alanını null deger kabul etmesını false yapıp, default degerıne 0 tanımlarsanız belkı duzelebılır

Firebird fonksiyonlarını ve syntax ını bılmıyorum ama mantık aynı olabılır

Yok hocam null kontrolü yapıyorum ki zaten cari tablosunun hem borç hem alacak alanında değerler var.


Triger ile update - serdar - 06-10-2019

Hocam hdetay tablosunun trigerlarina baktigimda hareket tablosunun hrborc alanina deger atanmasi yok. Acaba triger disindanmi deger veriyorsun


Cvp: Triger ile update - Aktolgali - 07-10-2019

(06-10-2019, Saat: 22:36)serdar Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Hocam hdetay tablosunun trigerlarina baktigimda hareket tablosunun hrborc alanina deger atanmasi yok. Acaba triger disindanmi deger veriyorsun

@serdar  Evet, değerleri SP'den veriyorum.

Çözüldü sonunda.
Bütün IBStoredProcedure bileşenlerini sildim ve yeniden ekledim. Her şey normale döndü. Sorun nedir bilmiyorum.