autoincrement

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
andronoid
Üye
Mesajlar: 35
Kayıt: 26 Tem 2004 06:44

autoincrement

Mesaj gönderen andronoid »

Slm. autoincrement yerine aşağıdaki gibi bir kod yazdım. ibexpertte çalışıyor.

Kod: Tümünü seç

CREATE TRIGGER NEW_TABLE_BI0 FOR NEW_TABLE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
   select max(islemno)+1 from new_table into new.islemno;
end

fakat delphi tarafında ise islemno adlı alanın aldığı değer gözükmüyor. dataset`in afterpost`undan sonra şu kodlar da var.

Kod: Tümünü seç

 IBTransaction.CommitRetaining;
 IBDataSet1.refresh;
1.si: değerin delphi de gözükmesi için ne yapılabilir?

2.si: bu tabloda 100.000 civarında kayıt tutulabilir. max fonksiyonunu kullanırsam hissedilir derecede yavaşlama olur mu?

3.sü: autoincremet`i kullanırsam, generatörün aldığı değeri kodla sıfırlayabilir miyim ? Sizce hangi yöntemi kullanmam daha verimli olur?


iyi çalışmalar...[/code]
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

generator kullan,digerleri sorun cıkartabilir.
istersen generatoru procedure icinden de tetikleyebilirsin
yani tablonun afterpost unda bu procedure u cagırarak hatta degerini alarak da sorunu cozebilirsin
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
1. tabloyu close open yaparsan görünür.
2. yavaşlama olacağı kesin ama ne kadar hissedilir bilemiyorum. tabloya otomatik kayıt ekletip bunu test edebilirsin.
3. evet.

Kod: Tümünü seç

 set generator gen_xxx_id to 0
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Arkadaşlar yanıtları vermişler ama ben ek bilgi vermek istiyorum.

Max aggregate'ler kullanacağınız zaman (özellikle Max) ilgili alan için DESC INDEX tanımlayın. O zaman hızınız hemen hemen hiç değişmez.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

en son eklediğin kayıta ait ID numarasını şu şekilde alabilirsin.

trigger aşağıdaki gibi

Kod: Tümünü seç

CREATE TRIGGER GIREN_BI FOR GIREN
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF ((NEW.ID IS NULL) or (NEW.ID = 0)) THEN
    NEW.ID = GEN_ID(GEN_GIREN_ID,1);
END
ibdataset1 --> sağ tuş --> dataset editör --> key field alanında sadece ID alanını seç --> update field alanında da ID haric diğer alanları seç -->generate sql --> Insert Sql bölümüne gel -->

Kod: Tümünü seç

insert into GIREN
  (CINS, TOPLAM, TUR)
values
  (:CINS, :TOPLAM, :TUR)
olarak yazılmış olan kodu

Kod: Tümünü seç

insert into GIREN
  (ID,CINS, TOPLAM, TUR)
values
  (GEN_ID(GEN_GIREN_ID,0),:CINS, :TOPLAM, :TUR)
olarak değiştir.
ibdataset bileşenin GeneratorField ozelligine tıkla

Generator = GEN_GIREN_ID
Field = ID
Increment By = 1
Apply event = On post
yap.

bu sayede

Kod: Tümünü seç

ibdataset1.insert;
//ibdatasetID.Asinteger := 0; gibi bir kod sakın yazma :)
.....
.....
.....
ibdataset1.post;
dersen kayıdın normal ID değerine ulaşabilirsin.

bu işin güzel tarafı tabloyu close/open etmeden en son eklediğin kayıt üzerinde silme ve düzenleme işlemlerini sorunsuz bir şekilde yapabiliyorsun.

bu yöntemde trigger hiç bir iş yapmıyor ben olesine kullanıyorum.
andronoid
Üye
Mesajlar: 35
Kayıt: 26 Tem 2004 06:44

Mesaj gönderen andronoid »

Verdiğiniz bilgiler için teşekkür ederim.
Kolay Gelsin...
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Kod: Tümünü seç

insert into GIREN 
  (ID,CINS, TOPLAM, TUR) 
values 
  (GEN_ID(GEN_GIREN_ID,0),:CINS, :TOPLAM, :TUR)  
yerine

Kod: Tümünü seç

insert into GIREN 
  (ID,CINS, TOPLAM, TUR) 
values 
  (0,:CINS, :TOPLAM, :TUR)  
da yazabilirsiniz. bu şekilde triggerda bir işe yaramış olur :)
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Öncelikle Her kod'un sizin projenizde çalışacak dierek düşünmeyelim. Bazı Otomatik Arttırma işlemleri Delphi kısmında Bazılarıda Database kısmında yaptırılmalıdır.

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Cevapla