Mantigi kavrayamadim... :(

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Mantigi kavrayamadim... :(

Mesaj gönderen hi_selamlar »

merhaba arkadaslar,
yaw su trigger mantigini kavrayamadim.

2 tablom var. gerekli ayarlar tamam. procedure ler de tamam.
tablolarim stok kartlari digeri isi giris_cikis tablosu. giris cikis taki
islemlere göre procedure lari yaptim hata yok. stok kartlari tablosuna girilen degerleri toplaticam.

fakat triggger lari before/after = insert, update, delete hangilerine kaymam lazim ki , kullanici kaydi sildiginde düssün, yeni kayit eklediginde
eklesin, düzeltme yaptiginda düzeltsin. bu isi bir türlü anlamadim.

hangi ozelligi kullanmam lazim.

degerli arkadaslar konu hakkinda bilgilerinizi ve goruslerinizi bekliyorum..

:cry:
Herkes cahildir, bazi konularda.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

2 SP yapacaksın.

- after delete'te Stok'u azaltan SP çalışacak,
- after insert'te Stok'u artıran SP çalışacak,
- after update'te önce azaltan SP, sonra artıran SP çalışacak.

NOT : Bu olayın tıpkısının aynısını Fahrettin abi geçen seminerde çok detaylı anlatmıştı.

Kolay gelsin.
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Mesaj gönderen hi_selamlar »

tesekkurler mustafa abi

yaa anlatmisti ama hakikaten kafa artik almiyor.. :lol:
o kadar bos seyler ile dolu ki.

acaba beyin formatlama vaya ultra ddr ram takma sansimiz var mi ? :P

baska türlü olmuyor..

tesekkürler.
Herkes cahildir, bazi konularda.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

hocam bir kere okumayla, bir kere dinlemeyle olsaydı hepimiz Allamayi cihan olurduk. Bazı şeyler zamanla oturur...

Birkaç projede kullanın, kavramlar oturur yerine.

Kolay gelsin.
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Mesaj gönderen hi_selamlar »

yaa abi yine olmadi.

bu seferde 100 yaziyorum toplamayi 200 olarak aktariyor.

ya anlamadim gitti.

ne yapmam gerekli.

:?

yaptimm yaptimm..

Kod: Tümünü seç


begin
  select count(*) from isl_toplam
  where kod=:kods
  into kayit_sayisi;

  if (kayit_sayisi=0) then

    // insert yaparken 0,0 yerine degiskenleri atiyormusum..

    insert into isl_toplam (kod,borc,alacak) values (:kods, 0, 0);

    update isl_toplam set
    borc=borc+:borc,
    alacak=alacak+:alacak
    where kod=:kods;

  suspend;

tesekkur ettim...
Herkes cahildir, bazi konularda.
onaydin

Mesaj gönderen onaydin »

Merhaba
Seminerdeki veritabanına göre bir örnek koyuyorum

Kod: Tümünü seç

CREATE TRIGGER TR_GELEN_FATURA_URUN_STOK FOR GELEN_FATURA_URUN
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
declare variable temp integer;
declare variable  id integer;
begin
/*
temp ve id diye iki degisken olusturdum
temp artırmam veya eksiltmem gereken degeri
id de update edecegim stok numarasını belirtiyor

alt blokta inserting updating gibi olaya göre bu degerleri aliyor
delete de old kullaniyor (silindiginde neski kaydin no sunu aliyor
digerlerinde new i kullanıyor

en alttada update ifadesi var o da işlemi gerçekleştiriyor.
*/
  if (inserting) then
    begin
     id   = NEW.URUN_NO;
     temp = New.ADET;
    end
  if (updating) then
    begin
     id   = NEW.URUN_NO;
     temp = New.ADET - OLD.ADET   ;
    end
  if (deleting) then
  begin
     id   = OLD.URUN_NO;
     temp = Old.adet * -1   ;
  end
  update URUN_STOK set TOPLAM_GIRIS = TOPLAM_GIRIS + :temp where urun_stok.urun_no = :id ;
end
URUN_STOK tablosunda URUN_NO ile ilişkili bir satır ve degerininde başlangıçta 0 olması gerekiyor.
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Mesaj gönderen hi_selamlar »

Kod: Tümünü seç

begin 
  select count(*) from isl_toplam 
  where kod=:kods 
  into kayit_sayisi; 

  if (kayit_sayisi=0) then 

    insert into isl_toplam (kod,borc,alacak) values (:kods, 0, 0); 

    update isl_toplam set 
    borc=borc+:borc, 
    alacak=alacak+:alacak 
    where kod=:kods; 

  suspend; 
simdide soyle bir sorun var... :cry:

insert into isl_toplam (kod,borc,alacak) values (:kods, 0, 0);

yapinca eger borc,alacak sifir ise bu islemden sonra calisan trigger veya sp devreye giriyor fakat deger sifir oldugu icin toplama islemi yapilamiyor.
bunu nasil asabilirim. :cry:

sevgi ve sagilarimla,
Herkes cahildir, bazi konularda.
onaydin

Mesaj gönderen onaydin »

Trigger da suspend kullanmanıza gerek yok.
insert into işlemini gereksiz yere hareket tablosunun trigger ında kullanıp her seferinde kontrol ettirmenize gerek yok.
Urun tablonuzun insert trigger ına insert kodunuzu ekleyin
hareket tablonuzun trigger ı na da yukardaki trigger ı yazmanız yeterli.

if ifadenizi begin end arasına almayı unutmayalım
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Mesaj gönderen hi_selamlar »

sayin onaydin,

insert into kontrol etmemin bir sakincasi var mi ?

ikinci bir soru ise peki degerler null oldugunda neden toplama islemi yapilmiyor..

Kod: Tümünü seç

begin
  select count(*) from isl_toplam
  where kod=:kods
  into kayit_sayisi;

  if (kayit_sayisi=0) then
  begin
    insert into isl_toplam (kod,borc,alacak) values (:kods, :borc, :alacak);
  end
  else
  if (kayit_sayisi>0) then
  begin
    update isl_toplam set
    borc=borc+:borc,
    alacak=alacak+:alacak
    where kod=:kods;
  end

  suspend;
end
burada ne gibi bir hatam var....
Herkes cahildir, bazi konularda.
onaydin

Mesaj gönderen onaydin »

insert into kontrol etmemin bir sakincasi var mi
Neden gerek olmadığını yukarda yazdım
ikinci bir soru ise peki degerler null oldugunda neden toplama islemi yapilmiyor
Bende sadece null bir değerle toplama yapayamayacağımızı biliyorum
burda buna zaten gerek yok ama eğer null dönebileek bir sorgunuz varsa e bununda toplama katmak istiyorsanız NULLIF fonksiyonunu kullanmanız size yardım edebilir.

Bende bir soru sormak istiyorum
Ordaki suspend ne işe yarıyor?
Cevapla