yani sayı üretiyor ve bir önce üretilmiş sayıyı saklıyor.
Database Bölümünden Generators e sağ tıklayıp New Generator dediğinizde karşınıza aşağıdaki pencere gelecektir

+ ( Artı ) İşaretiyle Yeni Bir Generator Ekleyebilir - ( Eksi ) İşaretiyle Varolan Generatoru Silebilirsiniz.
Name Kısmına Generatorun ismi
Value Kısmına Artırımın kaçtan başlayacağını belirtin. 1000 yazarsanız 1001 den 0 yazarsanız 1 den başlar arttırım.
Değerleri Girdikten sonra ilk buttona ( şimşek iconu ) tıklayıp daha önce gördüğümüz pencere karşımıza çıkacaktır. Hata yoksa Commit'e tıklayıp Generatoru oluşturun.

Bundan sonra 3 yolumuz var. Ya bir triger oluşturup her şeyi interbase e bırakmak yada bir Stored Procedure yazıp olayı kendimiz kontrol etmek.
Trigger İle Oluştumak
Çıkan Pencerede trigger bölümüne geçip Create Trigger CheckBoxunu işaretleyin

Tek yapmanız gereken GEN_ID(BENIMGENERAOR,1); Bölümünde BENIMGENERAOR yerine kendi Generator isminizi , 1 yerinede Otomatik Artan (Autoınc) Alanın kaçar kaçar artacağını belirtmeniz. gerekiyor.2 yazarsanız ikişer ikişer artar. varsayılan 1 dir. ok'ledikten sonra tablonuzdaki şimşek iconuna tıklayıp çıkan pencerede Hata yoksa Commit'e tıklayıp değişikliği kaydedin
Procedure İle Oluştumak
Çıkan Pencerede Procedure bölümüne geçip Create Procedure CheckBoxunu işaretleyin

Yukardaki koda dikkat edecek olursak procedure a "SP_GEN_MUSTERI_ID" ismini verdik.Daha sonra "ID" adında integer tipli bir variable (değişken) tanımladık.Sonrada ınterbase / Firebird in GEN_ID fonksiyonunu kullanarak BENIMGENERAOR generatorunden aldığımız sayıyı bir artırarak "ID" değişkenine yüklemesini söyledik. ınterbase / Firebird 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 ID= GEN_ID(BENIMGENERAOR,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 / Firebird de işimiz bitti.ınterbase / Firebird üzerinde yapılacak işlemler bu kadar.
Ş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 ınterbase / Firebird Oluşturduğumuz "SP_GEN_MUSTERI_ID" Proceduresinin orada göründüğünü göreceksiniz. Bu procedure yi seçin Ve projenizi kaydedin.
Şimdi gelelim Bu IBStoredProc nesnesini tetiklemeye :
musteri isminde bir table ımızın olduğunu ve Bu table da SIRA_NO 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.
Kod: Tümünü seç
IF (MUSTERI.State=dsInsert) AND ( MUSTERISIRA_NO.IsNull) then
begin
MUSTERISIRA_NO.AsInteger:=0;
IbStoredProc1.Prepare;
IbStoredProc1.ExecProc;
MUSTERISIRA_NO.AsInteger:=IbStoredProc1.ParamByName('ID').As Integer;
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..
Kod: Tümünü seç
IF (MUSTERI.State=dsInsert) AND ( MUSTERISIRA_NO.IsNull) then // şayet table insert modunda ve Autoinc Alan Boş ise
begin
MUSTERISIRA_NO.AsInteger:=0; //Table ın Kayıt Değişkenini boşalt
IbStoredProc1.Prepare;// StoredProc nesnesini hazırla
IbStoredProc1.ExecProc;// storedProc Nesnesini tetikle
MUSTERISIRA_NO.AsInteger:=IbStoredProc1.ParamByName('ID').As Integer; //ınterbase / Firebirdün tored Procedure'ünde
//oluşan ve "ID" değişkenine aktarılan sayıyı MUSTERISIRA_NO.AsInteger: değişkenine aktar.
end;
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.
Delphi İle Oluştumak
Çıkan Pencerede Generator bölümüne geçiyoruz

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. Diyelim IBDataset kullanıyorsunuz. IBDataset seçip Object inspectordan GeneratorField'e tıklayın ( IBTable de yoktur ). Karşınıza aşağıdaki pencere gelecektir.

Penceredeki
Generator bölümünden Generatorunuzu Field bölümünfden otomatik artacak alanı Increment By kısmına kaçar kaçar artacağıını yazdıktan sonra On Post kutucuğunu Seçip OK leyin.
Not : Trigger Kullandıysanız Otomatik artan alan Not Null olarak ayarlanmışsa ( Not Null olduğuna eminim çünkü otomatik artan alanlar Primary key için kullanılır. ) Delphi'den IBTABLE,IBQUERY,IBDATASET datasetiniz her neyse Çift tıklayıp Fields Editörden Otomatik artan alanınızı seçip Object inspector'dan Required özelliğini false yapın. aksi taktirde tek kayıt işleyemezsiniz tabloya. Ayrıca Master Detail Tablolarda Detail Tabloya Kayıt Girmeden önce Master Tabloyu Kapatıp açın