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.
GDBde silme işlemelerden sonra kayıt ta IDnin yanlış gelmesi
- Yusuf AYDIN
- Üye
- Mesajlar: 69
- Kayıt: 02 Oca 2004 05:45
- Konum: Antalya
- Yusuf AYDIN
- Üye
- Mesajlar: 69
- Kayıt: 02 Oca 2004 05:45
- Konum: Antalya
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?
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?
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...
- Yusuf AYDIN
- Üye
- Mesajlar: 69
- Kayıt: 02 Oca 2004 05:45
- Konum: Antalya
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.
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.
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.
yukardaki kod lada isterseniz ayrıca generatörün ürettiği son en yüksek numarayı bulabilirsiniz.
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
saygılar