GDBde silme işlemelerden sonra kayıt ta IDnin yanlış gelmesi

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
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

GDBde silme işlemelerden sonra kayıt ta IDnin yanlış gelmesi

Mesaj gönderen Yusuf AYDIN »

Selamünalleyküm,

Delphi 7 ve Interbase kullanıyorum.
GDB yi create ettikten normal kayıtlarımı yapıyorum. Ve

ID := DS_MSUTERI.DataSet.FieldByName('MUSTERI_ID').AsInteger;

kodu ile de keyimi (ID) normal olarak alabiliyorum. (Last kayıt olduğu için.)
Bilgiler içinden fazla sayıda kayıt silersem problemim başlıyor.
Program içinden yeni kayıt yaptığımda ID numaram 192 geliyor.
IBConsole veya IB Expert fark etmiyor. Table içinden bakınca son kayıtın 225 olduğunu görüyorum.
Sonra Sql (Select * from musteri) ile baktığımda ise 225 in aralara (sanırım silinmiş alanlara) yazıldığını gördüm.

Şimdilik Query ile ilgili ID yi aldım. Ama bana göre doğrusu bu değil.
Yada farklı bir bakış açısıyla kayıtları silmeyip ayrıca Record_Code alanı tutcağım (1. kayıt 2. silindi gibi)

Bu konuyla ilgili çözümü olan varsa paylaşmasını rica ediyorum.

Saygılarımla.

NOT :
- ID numarası Generator ile Triger kullanılarak otomatik olarak alınıyor.
- Kayıt işleminden sonra Applyupdates ve Refresh kullanıyorum. bunların etkisi olabilirmi.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Yusuf Bey acikcasi problemin tam olarak ne oldugunu anlayamadim.

silinen kayıtlara ait ID'lerin aralarda bos kalmasindan bahsediyorsanız bu gayet dogal ve cozulmesi gerektigini de pek dusunmuyorum.
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

Fahrettin bey ilginize Teşekkür Ederim.

Kayıtların silinmesinden dolayı yeni kayıtlar silinen yerlere yerleştiğinde, last record eski bir kayıtı gösteriyor. Bu bencede iyi bir özellik, hatta dosya boyutunuda büyütmemiş oluyor.

Benim esas problemim fazla kullanıcının kullandığı GDB'lerde aksama çıkmasından olan endişem.

son kayıta ulaşan Query
( Select max(record_ID) from musteri )
olması halinde başka kullanıcının yaptığı kayıtıda getirebilir.

Yani son kayıda ulaşmak istediğimde. Benden önce birisi kayıt yapmışsa onu görmüş olmazmıyım.

Değil mi?

Şuan aklıma gelen Triger bize verdiği ID döndüremez mi?
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

su an cikmak uzereyken bvi bakayim dedim foruma detayli bir cevap veremeyecegim su an ama benim uyguladigim yondemde tablonun ID alanının son degerini LAST isimli bir tabloda tutarim ve yeni bir insert islemi sirasinda LAST tablosundan bu degeri 1 arttirip yeni kayitta kullanırım. Bunu da kullandıgım table componentinin icine yazdiigmiz kodlar DElphi tarafinda otomatik olarak yapmakta dolayisiyla ID degeri delphi tarafindan verildigi icin de tespit etmede bir sorun olmamakta...
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

Anladığım kadarıyla siz triger ve generatorleri kullanmadan çözüm üretmişiniz.

Farklı bir yaklaşım göstermişiniz.
Id yi Unique tanımladınız.
Çift kayıt hatasında yeniden ID alınmasını sağlayarakta aynı andaki kayıtlarda oluşa biliecek hataların önüne geçtiniz....

Tebrikler ve teşekkürler

Allah razı olsun. bu yaklaşımı diğer projede değerlendireceğim. Şu aşamada geriye dönmek çok zor. Query ile hallettiğim şekli ile çalıştıracağım.
hakkus
Üye
Mesajlar: 160
Kayıt: 18 Haz 2003 12:02
Konum: Konya

Mesaj gönderen hakkus »

merhabalar,
eğer id için bir generatör kullanıyorsanız bir trigerla bunu insert esnasında artırabilirsiniz.
Sizden önce başka birinin insert etmesi durumu değiştirmez. id Generatörüne her gidildiğinde numara bir artar.
Aslında generatör de en yüksek numarayı tutan bir table olduğuna göre en kolay çözüm bu olabilir. Önemli olan unique bir numara almaksa bu sorunu çözer.

Kod: Tümünü seç

select gen_id(mus_no_id,0) from RDB$RELATIONS 
yukardaki kod lada isterseniz ayrıca generatörün ürettiği son en yüksek numarayı bulabilirsiniz.
saygılar
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Bu sirada eger kayit girisi icin Table componenti kullaniyorsaniz ya ad kullanirsaniz post isleminden sonra ilgili alanin degeri database den gelecektir. En fazla bir ferresh etmek yetecektir.
Kolay gelsin....
Cevapla