Otomatik Artan (AutoInc) Alan Oluşturma (Firebird)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

Otomatik Artan (AutoInc) Alan Oluşturma (Firebird)

Mesaj gönderen Fatih! »

İnterbase / Firebird 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.

Database Bölümünden Generators e sağ tıklayıp New Generator dediğinizde karşınıza aşağıdaki pencere gelecektir

Resim

+ ( 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.

Resim

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

Resim

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

Resim



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

Resim

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.

Resim

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
Kullanıcı avatarı
Ademkoysuren
Üye
Mesajlar: 83
Kayıt: 26 Ağu 2003 03:07
Konum: KIRŞEHİR
İletişim:

Mesaj gönderen Ademkoysuren »

FAOsoft çok teşekkür ederim çok güzel bilgiler yayınlamışın formda
benim bir sorum olacak
triggerde boş generator numaralarını nasıl bulurum mesala generatör id ye 1 attı bu tabloda var kendi tekrar 2 deneyecek bu da var 3 deneyecek boşu bulana kadar sonra boşu bulunca atıyacak. birdaha kayıt yaptığımdada kaçta kaldıysa ondan devam edecek tekrar deneyecek.
Cemre Bilgisayar Yazılım
KIRŞEHİR
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

Mesaj gönderen Fatih! »

bunları tetek kontrol etmek pekm sağlıklı olmaz. anladığım kadarıyla sıralı bir alan oluşturmak istiyorsun. bunun için projeler bölümündeki örneği incelemeni öneririm
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

boollean tipindeki alanlar

Mesaj gönderen baloglurecep »

Fatih hocam saygılar.....
ben yeni yeni öğreniyorum firibirdi. dotomatik artan sayı işini hallettim. önceden accesle yaptığım projelerin bazılarını fişribirde geçirmek isityorum. ama ben accesde bollean tipinde bir iki alanım var. onları firibirdde nasıl trgger oluştururum.
şöyleki
delphiden sql ile true yada false gönderdiğimde fibird true için 1 false için 0 olarak işlesin. anlatabildm mi bilmiyorum. çevirme işlemlerinde kodları fazlaca değiştirmek istemiyorum. o yüzden sordum bu soruyu.
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Re: boollean tipindeki alanlar

Mesaj gönderen vampir261 »

mussimsek yazdı:Boolean tipi yok, nasıl olacak?
Evet ama bir domain tanımlayarak Boolean tipini kolayca oluşturabilirsiniz. True ve False için 1 ve 0 değerlerini saklayacağız :

Kod:
create domain DMN_BOOLEAN as SMALLINT default 0 not null
check ( value in (0,1));

Yeni isen sitede arama yapmayı ihmal etme,:!: çünkü sorulmayan yada cevaplamayan soru kalmadı gibi bişey :P ve şu başlığı kesinlikle incele ve herzaman başvur tek mesajda birçok soruyu cevaplar yada cevaba link verir. Mustafa Hocamıza tekrar saygılar iyiki de bu siteyi kurmuş :) viewtopic.php?t=5800&highlight=firebird ... an+sorular
Anlatırsanız unuturum,
Gösterirseniz hatırlarım,
Yaptırırsanız anlarım.
Cevapla