Otomatik artan sayı değerini aşarsa nolur?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mhizar
Üye
Mesajlar: 78
Kayıt: 30 May 2005 11:06

Otomatik artan sayı değerini aşarsa nolur?

Mesaj gönderen mhizar »

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.
Kullanıcı avatarı
hbahadir
Kıdemli Üye
Mesajlar: 544
Kayıt: 06 Ara 2004 05:03
Konum: BURSA idi artık İST.
İletişim:

Mesaj gönderen hbahadir »

silinen kayıt id'lerini bir kütüğe yazdır ordan okut sonra sil.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

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... :oops:
Resim
Resim ....Resim
mhizar
Üye
Mesajlar: 78
Kayıt: 30 May 2005 11:06

Mesaj gönderen mhizar »

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.
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

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
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

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.

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
Offf saat yine geç olmuş :)

İ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.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Şu SQL daha kısa sanırım gözlerim kapanıyo sülüsyanlar görüyom :D
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
İyi Geceler...

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