Otomatik Sayı Değişmez

Katılım
22 Ekim 2005
Mesajlar
85
Excel Vers. ve Dili
Excel-2003
Otomatik Sayı (Autonumber) alanları ile ilgili birçok yerde hala aynı sorular soruluyor.
- Kayıtlar silindiğinde neden eski numaralar kullanılamaz oluyor?
- Bu alanı 1'den itibaren yeniden sıralayamaz mıyım?

Verilen cevaplar hep aynı. Herhalde bunu bilmeyen de kalmamıştır. Bu veri alanının temel özelliği her yeni kayıt anında otomatik artması. Ã?rneğin Access içinde iken yeni kayıt moduna geçildiği anda bu değer otomatik olarak artırılır. ADO ile SQL Server'a bağlanırken konumlandırıcı tipine göre ekleme komutu gönderildikten sonra bu değerler değişik seçeneklere göre artırılabilirler.(*)

Numaraları 1'den itibaren sıralamak için veri alanı silinip yeniden oluşturulabilir. Ama eğer bu alan başka bir veri alanı ile bağlantılıysa veritabanında karmaşa oluşacaktır.
Yandaki resme bakıp aldanmayın. Normal şartlarda Otomatik Sayı alanı değiştirilmez. Benim yaptığım şey sadece veritabanı dosyasına dışarıdan müdahale etmekti.



Bu işlemin nasıl yapıldığını anlatıyorum fakat kullanmanızı tavsiye etmiyorum ve problem çıkmayacağını garantilemiyorum.

Deneme amaçlı bir veritabanı ve bu veritabanı dosyasında otomatik sayı alanı içeren bir tablo oluşturdum. Bu tabloya 15 kayıt ekledim ve bazı kayıtları sildim. Bu durumdayken dosyanın bir yedeğini aldım.

Normal şartlarda Otomatik Sayı değerinin veritabanı dosyası içinde bir yerlerde tutulması gerekir. Bu durumda otomatik sayı ile ilgili bir işlem sonrasında veritabanı dosyasında bir yere bu bilgi yazılmalıdır.

Bu teoriden yola çıkarak tabloda yeni kayıt satırına gelip birşeyler yazdım ama sonra ESC tuşu ile kayıttan vazgeçtim. Böylelikle son kullanılan otomatik sayı değeri dosyanın bir yerine yazılmış olur.

Dosya kapatıp orjinal ve yeni dosyaların arasındaki farkları program kodu yazarak araştırdım.

Sub FarklariBul()
Open "c:\autonumber1.mdb" For Binary As #1
Open "c:\autonumber2.mdb" For Binary As #2
Dim i As Long
Dim deger1 As Byte, deger2 As Byte
For i = 1 To FileLen("c:\autonumber1.mdb")
Get #1, i, deger1
Get #2, i, deger2
If deger1 <> deger2 Then Debug.Print i, deger1, deger2
Next
Close #1
Close #2
End Sub


İlk denemelerimde birçok fark olduğunu gördüm. Bunun sebebi veritabanı penceresinde farklı sayfa ve nesnenin seçili olmasıydı. Bu durumda farkı daha iyi algılayabilmek için tablolar sayfasının açık olması ve de kontrol edeceğim tablonun üzerine konumlanmış olmam gerekiyordu. En son denememde sadece iki fark olduğunu gördüm.

Konum
(bayt) Birinci dosyadaki
ASCII kod İkinci dosyadaki
ASCII kod
3.587 1 2
106.517 15 16

Her iki satır için ayrı ayrı değer aramaya başlamak gerekiyor. Otomatik sayı değerimiz en son 16 olduğuna göre bu değeri oluşturan baytları bulmak gerekiyordu.

106517. bayttan sonraki 4 bayt (LONG tipinde), 16 sayısını yani son kullanılan otomatik sayı değerini veriyordu. Bunun yerine bizim istediğimiz yeni değeri yazmamız yeterli oluyor.

Sub Getir()
Open "c:\autonumber1.mdb" For Binary As #1
Dim deger As Long
Get #2, 106517, deger
MsgBox deger
Close #2
End Sub

Sub YenisiniYaz()
Open "c:\autonumber2.mdb" For Binary As #2
Dim deger As Long
deger = 0
Put #2, 106517, deger
Close #2
End Sub



Oraya ne yazılırsa otomatik sayı yeni değerini bu numaradan başlatıyordu. Burayı 0 olarak değiştirdikten sonra üst resimdeki gibi bir görüntü normaldi artık.

Bu işlemden sonra Veritabanı Düzenle (Compact) komutu kullanıldığında Otomatik Sayı normal hale dönecektir. Siz en iyisi bu değeri arkaplan işlemleri için kullanın ya da kullanıcıya herhangi bir kod değeriymiş gibi gösterin. Ben olsam ekran başındaki kişiyi resimde olduğu gibi kandırırdım. Nasıl mı oldu diyorsanız, tablonun tasarım görünümünde otomatik sayı alanının Format (Biçim) özelliğinin değerini tam olarak
“Kod “# şeklinde belirtmeniz yeterli.

Değiştirilmiş otomatik sayı değeri ile ilgili örnek dosyayı yükleyip inceleyebilirsiniz.
autonumber_mdb.zip (17 KB)
 
Katılım
1 Eylül 2007
Mesajlar
2
Excel Vers. ve Dili
office 2003 Türkçe
link yok

linki tekrar belirtir misiniz?
 
Üst