Otomatik artan sayı değerini aşarsa nolur?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Otomatik artan sayı değerini aşarsa nolur?
Arkadaşlar yaptığım programda bir otomatik alan tanımlıycam integer tipinde veya bunu kodla da yapabilirim.Ama benim öğrenmek istediğim şu.Benim programımda hiçbir zaman 3 milyar kayıt olmayacak.Ama devamlı kayıt yapılacak silinecek, yapılacak silinecek.Belki aynı anda en fazla 100.000 kayıt olacak ama silinenleride sayarsak integerin kapasitesini aşacak.Silinen kayıtın numarasını otomatyik sayıda veremiyoruz ama bunu ben kddla yaparsam insertten önce son akydın numarasını aldırıp +1 yeni numarayı verdiriyorum.Eğer silinen kayıt son kayıt ise bu oluyor.Yani 1000 numaralı kayıt silinirse bu anlamda yeni kayıtın numarası 100 oluyor.Ama 999.kayıt silinirse son kayıtın numarası hala 1000 olduğu için yeni kayıta 1001 numarası veriliyor.Benim yapmak istediğim ise 999 u da kullanabilmek.Acaba bunu yapabilirmiyiz.Bir fonksiyon içinde çözmeye çalıştım ama başaramadım.Böyle bir şey mümkünmü.Çok teşekkürler.Herkese kolay gelsin.
Eğer Master / Detail bağlantı için kullanmıyorsanız, bu Field'i silip baştan create eder, rakamların 0'dan başlamasını sağlayabilirsiniz.
- Master/Detail ile ilgili bir ihtiyacınız olmasa böyle bir alana da ihtiyaç olmazdı gibi bir değerledirmem oluyor ki, bu durumda aklıma ilk gelen iki method:
1. Yeni bir veritabanı create edip düzenli bir şekilde buna aktarma yapmanız şeklindedir. SQL ile sandığınızdan hızlı olacaktır.
2. Mevcut veritabanındaki alanı edit ederek bunu sıralı hale getirmeniz.
- Her iki metodda da ortak işlem; karşılık tablosu oluşturarak sıralı rakamların hangi kayıtlara karşılık geldiğini not etmeniz ve sonra bu tablo güdümüyle ana veritabanını güncellemeniz.
- Yani Detail veritabanından Master'a doğru ters yönlü bir fonksiyon ile (örneğin son kayıt no 1.Milyon, ilk kayıt no ve takip eden kayıtlar 101, 108, 205, 1999 ...şeklinde atlayan şekilde gidiyorsa) Servis tarihi geldiğinde bunun için izin isteyip;
- 1.metoddaki gibi sıralı bir Master oluşturup değişen numaraları Karşılık tablosuna kaydedip, Detail kayıtları da aynı şekilde değiştirmeniz.
- 2.metoddaki gibi SQL ile bu deatil tablodaki key alanı gruplayıp bir döngü ile ana tablonunkileri 0,1,2,3...999 sıralı hale getirip, oluşturacağınız geçici bir karşılık tablosundan faydalanarak da tekrar detay tablodaki kayıtların bu bağlantı numaralarını değiştirebilirsiniz. Bu, çok riskli bir işlem olduğundan deneyecekseniz bile yedekli çalışıp sonuç başarılı ise disk operasyonu ile eski/yeni veritabanı değişikliği yapmanızı öneririm.
- Başka yöntem şimdilik aklıma gelmiyor...
- Master/Detail ile ilgili bir ihtiyacınız olmasa böyle bir alana da ihtiyaç olmazdı gibi bir değerledirmem oluyor ki, bu durumda aklıma ilk gelen iki method:
1. Yeni bir veritabanı create edip düzenli bir şekilde buna aktarma yapmanız şeklindedir. SQL ile sandığınızdan hızlı olacaktır.
2. Mevcut veritabanındaki alanı edit ederek bunu sıralı hale getirmeniz.
- Her iki metodda da ortak işlem; karşılık tablosu oluşturarak sıralı rakamların hangi kayıtlara karşılık geldiğini not etmeniz ve sonra bu tablo güdümüyle ana veritabanını güncellemeniz.
- Yani Detail veritabanından Master'a doğru ters yönlü bir fonksiyon ile (örneğin son kayıt no 1.Milyon, ilk kayıt no ve takip eden kayıtlar 101, 108, 205, 1999 ...şeklinde atlayan şekilde gidiyorsa) Servis tarihi geldiğinde bunun için izin isteyip;
- 1.metoddaki gibi sıralı bir Master oluşturup değişen numaraları Karşılık tablosuna kaydedip, Detail kayıtları da aynı şekilde değiştirmeniz.
- 2.metoddaki gibi SQL ile bu deatil tablodaki key alanı gruplayıp bir döngü ile ana tablonunkileri 0,1,2,3...999 sıralı hale getirip, oluşturacağınız geçici bir karşılık tablosundan faydalanarak da tekrar detay tablodaki kayıtların bu bağlantı numaralarını değiştirebilirsiniz. Bu, çok riskli bir işlem olduğundan deneyecekseniz bile yedekli çalışıp sonuç başarılı ise disk operasyonu ile eski/yeni veritabanı değişikliği yapmanızı öneririm.
- Başka yöntem şimdilik aklıma gelmiyor...

evet master detail.Ama kayıtların tekrar sıralanması önemli değil.Şimdi aklıma geldi şöyle yapabiliriz heralde.Alan tipi gene integer olur ama rakamın ilk 4 karakteri yıl parametresi olur.Mesela 2005 ylında ilk kayıt 20051 olur.
2006 ylında ise ilkkayıt 20061 olur.İnsert denince table son kayda gider.Kayıt ID sini okur.Diyelimki 2005693 okudu.Şimdi burada ilk 4 karakterden sonrasını okur.Bunu integere çevirip +1 ekler.Sonra o yılın değerini alır eğer tarih 01.01.2006 değilse 2005 alacak ve 2005694 olarak kayıtıdsini tutan DBeditin içine yazacak.Burada boş veri tabanına kayıtta sorun çoıkabilir.Bunuda try exceptle aşarız.Sanırım bu böyle olur.Bir yıl içindede fazla bir şey olmayacağından bu sorun gider.
O zaman da kullanıcı sistem saatini yada trarihinle oynarsa sorun olabilir.O da try exceptten geçmez.Bence böyle olur.Ama bu konuda başka arkadaşlarında bilgi ihtiyacı olabilir diye yazdım..Sizce de bu yöntem olurmu?
Herkese kolay gelsin.
2006 ylında ise ilkkayıt 20061 olur.İnsert denince table son kayda gider.Kayıt ID sini okur.Diyelimki 2005693 okudu.Şimdi burada ilk 4 karakterden sonrasını okur.Bunu integere çevirip +1 ekler.Sonra o yılın değerini alır eğer tarih 01.01.2006 değilse 2005 alacak ve 2005694 olarak kayıtıdsini tutan DBeditin içine yazacak.Burada boş veri tabanına kayıtta sorun çoıkabilir.Bunuda try exceptle aşarız.Sanırım bu böyle olur.Bir yıl içindede fazla bir şey olmayacağından bu sorun gider.
O zaman da kullanıcı sistem saatini yada trarihinle oynarsa sorun olabilir.O da try exceptten geçmez.Bence böyle olur.Ama bu konuda başka arkadaşlarında bilgi ihtiyacı olabilir diye yazdım..Sizce de bu yöntem olurmu?
Herkese kolay gelsin.
- kadirkurtoglu
- Üye
- Mesajlar: 748
- Kayıt: 22 May 2005 01:20
- Konum: Uzakta Görünen Tepeden...
bu konu benide düşündürmüştü bir zamanlar ancak firebirde değişken çok integer değilde numeric kullan virgülden sonraki (scale) haneyi 0 yap 15 varsayılan hane sayısıdır 18 de yapabilirsin manuel olarak bu da yetmez dersen double kullan buda 64 btlik bir değişken çok büyük sayıları tutabiliyor
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.
Mevlana
OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
ışığında hiç bir şey kaybetmez.
Mevlana
OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Ben bunu düşündüm ve aklımdan şöyle bir SQL geçti ve denedim çalıştı bende sorun yok gibi sizlerde deneyip sonuçları yazarsanız memnun olurum.
SQL i Firebird standartları ile yazdım SQL in yaptığı arada boşluk olan ilk numarayı getirmek First ibaresini kaldırırsanız boşluklu bütün kayıtları geitiriyor.
mesala tablomuzda
91
92
93
100
101
105
106
buna göre çıkan sonuc
93 olacaktır.
First ibaresini kaldırırsanız
93
101
106 olacaktır.
Dediğim gibi bir deneme ama olumlu sonuç alıyorum.
Offf saat yine geç olmuş 
İyi Geceler.
SQL i Firebird standartları ile yazdım SQL in yaptığı arada boşluk olan ilk numarayı getirmek First ibaresini kaldırırsanız boşluklu bütün kayıtları geitiriyor.
mesala tablomuzda
91
92
93
100
101
105
106
buna göre çıkan sonuc
93 olacaktır.
First ibaresini kaldırırsanız
93
101
106 olacaktır.
Dediğim gibi bir deneme ama olumlu sonuç alıyorum.
Kod: Tümünü seç
select first 1 (cari_id)
from cari
where cari_id not in (Select
cari_id
from cari
where cari_id in (Select
(cari_id -1)
from cari))
order by cari_id

İyi Geceler.
Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Şu SQL daha kısa sanırım gözlerim kapanıyo sülüsyanlar görüyom 
Bunuda denerseniz sevinirim.
İyi Geceler...
Kolay Gelsin...

Bunuda denerseniz sevinirim.
Kod: Tümünü seç
select first 1 (cari_id)
from cari
where cari_id not in (Select
cari_id - 1
from cari)
order by cari_id
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.