|
Interbase'de Otomatik Artan alan Oluşturma
INTERBASE'DE OTOMATİK ARTAN (AUTOINC) ALAN OLUŞTURMA
Bismillah
İnterbase de otomatik olarak çalışan bi AUTOINC field yoktur.Fakat bunu kendimiz
bir kaç düzenleme ile yapabiliriz. Bunun için öncelikle interbase de bir kaç
işlem yapmamız gerekiyor. ilk önce bir GENERATE oluşturmakla işe başlayacağız.
GENERATE nedir onu öğrenelim önce GENERATE adınında yaptığı çağrışımdan da
anlaşılacağı üzere bir jenerator yani üreteç.
yani sayı üretiyor ve bir önce üretilmiş sayıyı saklıyor.
CREATE GENERATOR "KIMLIKOTOINC";
GENERATORu yukardaki komutla ıbConsole da ISQL ile üretebilirsiniz.
yukardaki "KIMLIKOTOINC" üretilmiş sayıyı tutan bir generator ün adıdır.
ve üretilmiş sayıyı tutar.
Peki sayıyı tutacak GENERATORU oluşturduk. Şimdi sırada bu tutalan sayıyı
interbase e ne yapacağını anlatmamız gerekiyor.
Bunun içinde 2 yolumuz var. Ya bir triger oluşturup her şeyi interbase e
bırakmak yada bir Stored Procedure yazıp olayı kendimiz kontrol etmek.
Ben hep ikinci yolu tercih ettim. Triger olayında bi kaç tökezledim o yüzden de
pek sağlıklı bulmadım nedense. Bu yüzden stored procedure hazırlayarak yapalım
bu işi. Böylelikle sayı artırma işinin biraz uzunda olsa kontrolü elimizde olur.
İkinci yapmamız gereken iş, Bir stored procedure oluşturmak. Bu iş içinde
interbasein ibConsolunu ve ısql ini kullanacağız. Şimdi aşağıdaki kodları
yazarak bir stored procedure oluşturalım.
CREATE PROCEDURE "PROC_KIMLIKAUTOINC"
RETURNS
(
"NUM" INTEGER
)
AS
BEGIN
NUM = GEN_ID(KIMLIKOTOINC,1);
END
Yukardaki koda dikkat edecek olursak procedure a "PROC_KIMLIKAUTOINC" ismini
verdik.Daha sonra "NUM" adında integer tipli bir variable (değişken)
tanımladık.Sonrada ınterbase in GEN_ID fonksiyonunu kullanarak KIMLIKOTOINC
generatorunden aldığımız sayıyı bir artırarak "NUM" değişkenine yüklemesini
söyledik. Interbase in GEN_ID fonksiyonu Oluşturduğumuz GENERATOR den aldığımız
sayıyı en sonunda verilen sayı kadar artırır tabi bu arada generatorde tutulan
sayıyı da güncelleyecektir.
Şayet artırma sayıyısını farklı verirsek GEN_ID fonksiyonu verilen sayı kadar
generatordeki sayıyı artıracaktır. Yani NUM = GEN_ID(KIMLIKOTOINC,1); bu satırın
en sonunda ki 1 sayısının yerine 2 verirsek sayılarımız 2 şer 2 şer artacaktır.
Şimdi İnterbase de işimiz bitti.İnterbase üzerinde yapılacak işlemler bu kadar.
Ha unutmadan generatordeki sayıyı set etmek, yani belli bir sayıdan sonra
artırmak istiyorsak bu da şu interbase komutu ile yapılır tabi gene isql den.
SET GENERATOR "KIMLIKOTOINC" TO 1000;
Bu komuttan sonra Generatorsun default sayısı 1000 olacak ve artırımlar 1001,
1002 diye gidecektir.
Şimdi gelelim ikinci aşamaya:
Bu aşamada oluşturduğumuz stored procedure nin delphi tarafından nasıl
tetikleneceğini göreceğiz. Öncelikle Bir DataModule ile ve IBX componentleri ile
çalıştığınızı,bir Database nesneniz olduğunu ve bağlantıların yapıldığını
varsayıyorum.
DataModulümüz üzerine bir IBStoredPoc nesnesi koyalım. Database özelliğini
IBDatabase e gösterecek şekilde ayarlayın. Database nesnenizin connect
özelliğini True yapın. Bu işlemden sonra IBStoredProc Nesnesinin Stored Proc
Name kısmına tıklarsanız Interbase Oluşturduğumuz "PROC_KIMLIKAUTOINC"
Proceduresinin orada göründüğünü göreceksiniz. Bu procedure yi seçin.
Ve projenizi kaydedin.
Şimdi gelelim Bu IBStoredProc nesnesini tetiklemeye :
Kimlik isminde bir table ımızın olduğunu ve Bu table da KAYIT isminde Primary
key ve not null olarak tanımlanmış bir fieldımız olduğunu varsayıyorum.
Tablenızın BeforePost olayına tıklayın ve aşağıdaki kodları kendinize uygun
olarak güncelleyerek yazın:
Tabi bu kod illaki table ın BeforePost olayında olmak zorunda AfterPost gibi bir
olaya yazarsanız Table kayıt işleminde hata verecektir.
IF (Kimlik.State=dsInsert) then
begin
KimlikKAYIT.AsCurrency:=0 ;
IbStoredProc1.Prepare;
IbStoredProc1.ExecProc;
KimlikKAYIT.AsCurrency:=IbStoredProc1.ParamByName('Num').AsCurrency;
end;
end;
Şimdi yukardaki kodu inceleyelim.
Öncelikle Tableımızın durumunu kontrol ediyoruz. Yani table sadece insert
modunda ise bu kod çalışmalı yoksa bir sürü hata alacağız..
IF (Kimlik.State=dsInsert) then // şayet table insert modunda ise
begin
KimlikKAYIT.AsCurrency:=0 ; //Table ın Kayıt Değişkenini boşalt
IbStoredProc1.Prepare; // StoredProc nesnesini hazırla
IbStoredProc1.ExecProc; // storedProc Nesnesini tetikle
KimlikKAYIT.AsCurrency:=IbStoredProc1.ParamByName('Num').AsCurrency; //
İnterbasein Stored Procedure'ünde
//oluşan ve "num" değişkenine aktarılan sayıyı kimlikKAYIT.AsCurrency
değişkenine aktar.
end;
İşte bu kadar dostlar.
Bu işlem Table ınıza her post işlemi gönderildiği anda henüz post işlemi
yapılmadan önce tetiklenecek ve artık interbase de sizinde bir AUTOINC fieldınız
olacaktır.
Bunun ikinci bir yöntemi ise TRIGGER ile autoinc işlemini yaptırmaktır. Onu da
anlatmak istiyordum ama Makale baya uzun oldu. Bir dahaki makaleye inşallah.
Sevgiler...
bimeks borland component database delphi delphi.net delphi dersleri firebird help interbase makale oracle
seminer software sybase veritabanı web
|
|
 |