"Generator by 0" yapınca DBGrid'e son girilen görü

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

"Generator by 0" yapınca DBGrid'e son girilen görü

Mesaj gönderen huseyinkucuk »

Arkadaşlar, merhaba...
Firebird 2.0 ve Delphi7 kullanıyorum. Veri Tabanına bağlanmak için de InterBase bileşen paletindeki bileşenleri kullanıyorum;


"DEMIRBAS_CESITLERI" adında 2 alanlı bir tablom var... Alanlar şunlar;
"DEMIRBAS_CESIDI_NO integer, DEMIRBAS_CESIDI_ADI varchar(50)"

Şimdi bu tabloma primary key olan"DEMIRBAS_CESIDI_NO" alanını şu şekilde yazdığım bir generator ve trigger ile arttırmak istedim;

Kod: Tümünü seç

CREATE TRIGGER TRG_DEMIRBAS_CESIDI_NO FOR DEMIRBAS_CESITLERI
ACTIVE BEFORE INSERT POSITION 0
as
begin
    new.DEMIRBAS_CESIDI_NO=gen_id(gen_demirbas_cesidi_no,1);
end
Delphi tarafında da IBDataSet'in GeneratorField özelliğinde de "increment by" değerini 0 olarak belirledim -ki hem firebird hem de delphi generatoru arttırırsa 2şer 2şer artmasın-. Apply Event'i de "on post" seçtim...

Problemim şu; DBGrid üzerinden yeni bir kayıt girdiğim zaman grid'in en alt satırında yeni girdiğim satır değil de bir önceden girmiş olduğum satır görünüyor. Başka bir kayıt girdiğim zaman bir önceden girmiş olduğum kayıt görünüyor. Yani girdiğim kaydı görmek için yeni bir kayıt girmem gerekiyor (veya IBDataSet'i kapatıp açmam gerekiyor -ki bu pek de teknik bir çözüm değil gibi geldi-).

Fakat IBDataSet'in GeneratorField'indeki "increment by" özelliğini 1 yaptığım zaman DEMIRBAS_CESIDI_NO 2şer 2şer artmasına rağmen yukarıdaki problem meydana gelmiyor, herşey normal çalışıyor... Bütün bunların sebebi ne olabilir? Yardım ederseniz sevinirim... Saygılar...

Not: ibdataset.selectSQL=select * from DEMIRBAS_CESITLERI

ibdataset.ModifySQL=update DEMIRBAS_CESITLERI
set
DEMIRBAS_CESIDI_NO = :DEMIRBAS_CESIDI_NO,
DEMIRBAS_CESIDI_ADI = :DEMIRBAS_CESIDI_ADI
where
DEMIRBAS_CESIDI_NO = :OLD_DEMIRBAS_CESIDI_NO

ibdataset.insertSQL=insert into DEMIRBAS_CESITLERI
(DEMIRBAS_CESIDI_NO, DEMIRBAS_CESIDI_ADI)
values
(:DEMIRBAS_CESIDI_NO, :DEMIRBAS_CESIDI_ADI)

ibdataset.refreshSQL=Select
DEMIRBAS_CESIDI_NO,
DEMIRBAS_CESIDI_ADI
from DEMIRBAS_CESITLERI
where
DEMIRBAS_CESIDI_NO = :DEMIRBAS_CESIDI_NO
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
ibdataset te incrementi 1 yaptığın zaman hem ibdataset hemde triger değeri 1 arttırdığı için id 2şer atlıyor. Bu durumda dbgridde pkey alanı gösterirsen aslında değerleri trigerdan aldığını görürsün. gene bu durumda yeni eklediğin bir kaydı silmeye çalıştığın zaman silinmiş gösterecek ancak kapatıp açtığın zaman silmediğini göreceksin.

bunu engellemek için trigera ufak bir if satırı ekliyoruz.

Kod: Tümünü seç

  if new.demirbas_cesidi_no is null then
  new.DEMIRBAS_CESIDI_NO=gen_id(gen_demirbas_cesidi_no,1); 
böylelike ibdatasetten aldığı değeri kullanır. eğer ibdatasetin generator fieldini set etmezsek (veya başka bir query ile veya v.b. bir şekilde kayıt girersek)
pkey null geleceği için generatorden değer alacak.
:wink:
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

@aslangeri hoca, olmadı :( yine 2şer 2şer artıyor...
Acaba diyorum; trigger "before insert" şeklinde diye mi öyle yapıyor? Olabilir mi acaba? FireBird insert olmadan hemen önce bakıyo ki bu alan null, o bir sayı koyuyo, üstüne bi de ibdataset koyuyo, yine 2 artıyor sanırım... Bu durumda "after insert" de yapamam, çünkü; Demirbas_Cesidi_No alanı, yani triggere konu olan alan "not null" şeklinde, o yüzden sanırım "after insert" de olmaz... (Aslında after insert yapmayı denedim ama firebird bir hata verdi ve kabul etmedi bu triggeri). Niye olmuyor acaba?
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

gözden kaçan bir nokta vardır. sıfır bir uygulamda test etsene
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla