INTERBASE-TRIGGER KULLANIMI ILE ILGILI...

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ı
recepgalip
Üye
Mesajlar: 60
Kayıt: 12 Haz 2003 04:50
Konum: Mersin/Rize
İletişim:

INTERBASE-TRIGGER KULLANIMI ILE ILGILI...

Mesaj gönderen recepgalip »

MERHABA DELPHIDAŞLARIM,
VALLA BU GUNLERDE ACAYIP SORUNLARLA KARSILASIYOM. YAW AŞAĞIDAKİ TRİĞĞERDE NE VAR ALLAHINIZI SEVERSENİZ YAWW. ANLAMADIM GİTTİ. DİYOM YENİ KAYIT OLUNCA GENERATORU 1 ARTTIR SIRA_NO AKTAR AMMA LAKIN EGER table.fieldbyname('SIRA_NO')=herhangi bir deger demezsem kesinlikle trigger çalışmıyor.

CREATE TRIGGER STOKTAKIP_TRIGGER FOR STOK_TAKIP
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
NEW.SIRA_NO = GEN_ID(STOKTAKIP_SIRANO, 1);
END
^

COMMIT WORK ^
SET TERM ;^


KULLANDIGIM COMP.
KULLANDIGIM VERI TABANI INTERBASE 6.1
VALLA KOMP. SORMANIZA GEREK YOK EGER INTERBASE KONSOLDAN GIRIYOM AMA YINE KAYIT YAPMIYO. YENI KAYIT DEYOM KAYDET DIYOM AMMA KAYDET BUTONU BI TURLU SONMUYO.AMA SIRA_NO ALANINA(PRIMARY KEY ALAN) HERHANGİ Bİ DEĞER YAZARSAM VALLA KABUL EDİYO. HEMİDE ORNEGIN TAKIP EDEN GENERATOR DIYELIM 3 TE AMA BEN SIRA NOYA 70 YAZIYOM BI BAKIYOM SIRA NO YU 3+1=4 YAPMIŞ.
YARDIMLARINIZ BEKLIYOM..
ALLAH NAMINA VER.. ALLAH NAMINA AL.. ALLAH NAMINA BAŞLA.. ALLAH NAMINA İŞLE VESSELAM
SAYGILARIMLA BEN...
sair
Kıdemli Üye
Mesajlar: 288
Kayıt: 16 Haz 2003 04:41
Konum: Kastamonu
İletişim:

Mesaj gönderen sair »

Aynı şeyi bende yaşadım recep. hemde bi kaç kez. IB 6 da zannımca bi sorun var. Vazgeçtim o yüzden. Delphi 7 kullanıyorsan zaten trigere ihtiyacın yok. Dataset bileşeninin generatorfiled alanından oluşturduğun generatoru seçmen yetiyor. Eski sürüm delphi kullanıyorsanda bi IB stored procedure oluştur. Aynen triger gibi. Bunu IBStoredProc nesnesi ile çağır ve autoinc olacak alanına kaydettir. Ben böyle yapıyordum.
Sevgiler...
Geçip gideriz bizde ağızsız,dilsiz ve sorgusuz
İstanbul gibi düşeriz iki kıtaya birden...
En aşağılık düş, en büyük sevdadan belki
Erkek ölümler; bir uzun iç çekişle büyür göğsümüz
Eolgun
Üye
Mesajlar: 4
Kayıt: 16 Haz 2003 06:31

Triger Oluşturma ve Kullanma

Mesaj gönderen Eolgun »

Triger oluşturma ile ilgili bir örnek verelim.

Bunun için TbAd adında bir tablonuz olduğunu varsayalım.
Anahtar Field'ınızın adınında Alan olduğunu varsayalım.
Generetor'ünüzün başlangıç numarasınıda BasNo değişkeni ile adlandıralım.

Önce Trigerda kullanacağımız Generator oluşturulmalı.
Buradaki bilgileri bir fonksiyon içine yerleştirip çağırabilirsiniz. Dolayısıyla böyle bir fonksiyonun 3 paremtresi olmalıdır:TbAd, Alan,BasNo ...

Query1.SQL.Clear;
Query1.SQL.Add('CREATE GENERATOR ' + TbAd + '_KOD_GEN');
Query1.ExecSQL;

Arkasından oluşturulan generatorun başlangıç numarasını set edelim.

Query1.SQL.Clear;
Query1.SQL.Add('SET GENERATOR ' + TbAd + '_KOD_GEN TO ' + Bas);
Query1.ExecSQL;

Şimdi bu Generatoru kullanan bir Triger Oluşturalım.

Query1.SQL.Clear;
Query1.SQL.Add('CREATE TRIGGER SET_'
+ TbAd + '_KOD FOR '
+ TbAd + ' BEFORE INSERT POSITION 0 AS');
Query1.SQL.Add('BEGIN');
Query1.SQL.Add('IF(NEW.' + Alan + ' IS NULL) THEN');
Query1.SQL.Add('NEW.' + Alan + ' = GEN_ID('
+ TbAd + '_KOD_GEN, 1);');
Query1.SQL.Add('END');
Query1.ExecSQL;

Bu Trigerda birşeyler dikkatinizi çekmeli. NEW.Alan IS NULL
Bu sizin kayıt yapmaya kalktığınız anahtar alanda eğer bir rakam yoksa triger'ın icra edilmesini sağlayacaktır. Yani Kod içinde önce bir procedure yardımı ile anahtar alan değeri alınıp bu fielda yazılırsa triger yeni baştan generator'ü çağırmayacak, fakat siz anahtar alanı boş bırakmışsanız generator çağrılacak demektir.

Peki bu durumda eğer biz kod içinden anahtar alan değerini almak istersek ne yapmalıyız.
Bu durumda bir procedure oluşturmalıyız.
Devam edelim:
Yalnız bu durumda Field'ınızın tipini ifade edecek bir değişken daha ilave etmelisiniz. Bu değişkenin alacağı değerlere örnek verelim: SMALLINT, INTEGER, DOUBLE PRECISSION

Query1.SQL.Clear;
Query1.SQL.Add('CREATE PROCEDURE ' + TbAd
+ '_KOD_AL RETURNS (KODU ' + Tip + ') AS');
Query1.SQL.Add('BEGIN');
Query1.SQL.Add('KODU = GEN_ID(' + TbAd + '_KOD_GEN, 1);');
Query1.SQL.Add('END');
Query1.ExecSQL;


Şimdi kod yazma sırasında dikkat edilmesi gereken noktaları açıklayalım.
1. Kayıt eklerken bu procedure yardımıyla önce Key Field'ınıza gelmesi gereken değeri alıp bu alanın değerini elle girebilirsiniz.
2. Key Field'ı boş bırakırsınız. Bu durumda kayıt sırasında database Triger'ı çağırarak kendisi değerini doldurur. Bunun için delphi'de dikkat etmeniz gereken bir nokta var... Table nesnesi veya Query nesnesi eklendiğinde Bu nesnelerin fieldlarını Field Editor kanalıyla eklemişseniz Key Field'ın Required properties'ını FALSE yapmalısınız. Aksi halde her yeni kayıt ekleyip kaydetmek istediğinizde hata mesajı alırsınız.

Görüşmek üzere...
Cevapla