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