|
Access Hikayeleri
Bu bölümde Access’le ilgili ipuçları, çözümler ve temel
kurallarla ilgili bilgilerle beraber gelişmiş programlamaya daha çok ağırlık
vermeye çalışacağız.
Başlıktaki ‘hikaye’ kelimesine gelince neden böyle bir başlık verdiğimi
söyleyeyim. Bu yazı uzunca bir süredir Access ile çalışırken aldığım notların
bir ürünü. Okuyuculardan gelen mesajlar doğrultusunda bu
dizinin geri kalan kısmını şekillendireceğiz. Çok rasladığımız bazı sorunlar ve
önemli ipuçları yazının devamında yer alıyor.
1. Otomasyon Hatası/ Derleme Hatası
(Otomation Error/ Compile Error)
Bu çokça raslanan bir sorun. Otomasyon Hatası daha çok modüllerin derlenemediği
durumlarda meydana çıkıyor. Bunun birçok sebebi olabilir. Bunları tam anlamıyla
bilmesem de karşılaşıp çözebildiklerimi anlatmayı yeğliyorum. Access'te kod
yazmaya yeni başlamışsak bazı işlevlerin neden hata verdiğini anlamak için
kendimizi epey yormamız gerekir. Mesela farklı dildeki (ya da konfigürasyondaki)
iki Access'ten birinde Mid, InStr vs. komutlar çalışıyorken diğerinde hata
oluşabiliyor. Sebebi çoğunlukla başvurulardaki bir eksikliktir.
References
(Başvurular)
Başvurular listesini herhangi bir modül açıkken "Tools/References"
menüsünden görebiliyoruz. Burada "Missing:" (Kayıp) olarak belirtilmiş
isimler arayın. Eğer varsa bunu kaldırıp yeniden yüklemeniz sorunu
çözebilir. Alttaki resimde başka bir bilgisayarda farklı klasör altında
bulunan DAO350.DLL dosyası bulunamadığı için hata oluşmuş ve bu başvuru
“MISSING:” olarak belirtilmiş. Daha sonra başvurulardan ayrıntılı olarak
bahsedeceğiz. |

DAO başvurusu bulunamadığı için dosya “MISSING:” (kayıp) olarak belirtilmiş.
2. Modül Penceresi Açılmıyor ve Kodlar Çalışmıyor
Bu problemin bazan doğrudan başvurularla ilgili olduğunu düşünebiliriz.
Bazan da projemizdeki bir kod hatası buna sebebiyet verir. Herhangi bir modül
sayfası açıkken “Debug/ Compile And Save All Modules” (Derle/ Tüm Modülleri
Derle Ve Kaydet) menüsünü çalıştıralım. Bu işlem nerede hata olabileceğini
birçok zaman gösterir. Eğer aynı adı taşıyan iki yordam varsa, ya da örneğin
bir IF satırının bitirilmemiş olması veya “END SUB” kullanılmaması gibi hataları
bu şekilde farkedebiliriz.
Bazı durumlarda derleme işlemi de sonuç vermeyebilir. O zaman bizim
yapabildiğimiz son şey yeni bir dosya oluşturup hatalı olan dosyadan tüm
modülleri, formları ve raporları kopyalamak. Bu esnada tüm modüller alınırken
hatalı olanlarda ekrana ileti çıkıyor. Tabii ondan önce hatalı dosyamızı başka
makinelerde test etmekte yarar var. Bazan başka bir yerde Compact (Veritabanı
Düzenle) ve Repair (Veritabanı Onar) işlemleri sorunu giderebiliyor.
Bunun dışında bir de Türkçe karakter içeren nesne isimlerine dikkat etmek
gerekli. Veritabanı içindeki nesne adlarında (Tablo, Sorgu, Form vs.) türkçe
karakterler kullanmaktan olabildiğince kaçınmanızı öneririm.
3. Trim() ve Mid() İşlevleri Çalışmıyor
Bu hata çoğunlukla başvurularla ilgili. Trim işlevi VBA
kütüphanesinin bir üyesi. Bunu Object Browser’dan (Nesne Yöneticisi)
öğreniyoruz.
Bu dosyayı başvurular listesine tekrar yüklemek gerekebilir. Object Browser
bileşeni ileride eklentiler yazarken bize epey yardımcı olacak. Gerekirse bunu
daha sonra ayrıntılı olarak ele alabiliriz.
Object Browser
(Nesne Yöneticisi)
Trim komutunun bulunduğu kütüphaneyi öğrenmek için Object Browser’ı açıp
Trim kelimesini aratıyoruz. Burada o an Access içinden kullanılabilecek tüm
işlevlerin ve bileşenlerin listesini bulabiliriz.
Aşağıda yer alan VBA yazısını tıklatınca VBA kütüphanesinin içeriğini
görüyoruz.
Bu kütüphanenin dosyası VBA332.DLL adlı dosya.
Library VBA
C:\Program Files\Common files\Microsoft Shared\Vba\Vba332.dll
Visual Basic For Applications

|
4. Program Penceresi Kapanmıyor
Bunun sebebi açılan kayıt kaynaklarının kapatılmaması ve kısmen de
düzensiz bellek kullanımı olur çoğunlukla. Mesela,
Sub RecordSetDeneme()
Dim RS as recordset
Set RS=CurrentDb.OpenRecordset(“Table1”, dbOpenDynaSet)
...
RS.Close
End Sub
Bu yordam devredışı kalmadan önce mutlaka RS.Close komutu ile açık olan kayıt
kaynağı serbest bırakılmalıdır. Eger Database bileşeni tanımlanmış ise o da Nothing
değerine eşitlenmeli.
Dim DB as Database
...
Set DB=Nothing
gibi. Aynı şekilde mantıksal değer ifade eden işlev parçacıklarının IF
komutu içinde mutlaka TRUE ya da FALSE değerlerinden birine eşitlenmesi
öneriliyor.
If DenemeFonksiyon() Then ... yerine
If DenemeFonksiyon()=True Then ... kullanılmalı.
Bu hatanın çözümüne The Access Web sitesinde rasladım. Her Accessçinin mutlaka
bakması gereken bir site olduğunu söyleyeyim. (http://mvps.org/access)
5. “(AutoNumber)” / “(Otomatik Sayı)” Metnini
Gizlemek
Veri türü otomatik değer olan bir veri alanını formdaki metin kutusuna
eklediğimizde yeni kayıt anında “(AutoNumber)/(OtomatikSayı)” metni görünüyor.
(Veri alanının adı “KayitNo” olsun.) Bunu engellemek için önce yeni bir form
açıp üzerinde bir metin kutusu nesnesi oluşturalım. Adı “txKayitNo” olsun. Şimdi bunun
içine veri alanının ismini “KayitNo” yerine şu şekilde yazıyoruz: "=[KayitNo]".
Burada dikkat etmemiz gereken şey, formda “KayitNo” adlı başka herhangi bir nesnenin
bulunmaması. Aksi halde kayıt verisi yerine aynı adlı nesnenin değeri
görüntülenir.
6. Label/Metin Etiketi Nesnesinde Yeni
Satır Kullanmak.
Label nesnelerinde başlığı yazarken yeni bir satıra başlamak için
<Enter> yerine <Ctrl+Enter> tuşlarını kullanın. Aynı şekilde tablo görünümünde
de bu tuş bileşimi yeni bir satıra başlamamızı sağlıyor. Bunu komut düğmeleri ve
diğer nesneler için de deneyebilirsiniz.
Normalde Label ve CommandButton başlıklarında kısayol komutu için harflere
altçizgi verirken "&" işaretini kullanıyoruz. Fakat bu işaretin kendisini nasıl
göstereceğiz? Bunun için de “&&” yazmak yeterli.
7. Nesneyi Kendi Olay Yordamında Gizlemek.
Örneğin bir düğmenin "Click" yordamı içinden kendi görünür özelliğini kaldırmak
istiyoruz (visible=false). Fakat odaklanılmış nesnelerde böyle bir işlemin
geçersiz olduğuna dair hata mesajı çıkıyor. Bu satırdan önce baska bir nesneye
odaklanmamız sorunu çözecektir. Yani;
Sub Button1_Click()
...
'Button1'in kendisini görünmez yapabilmek icin Button2'ye odaklanalım.
Button2.SetFocus
Button1.Visible=false
...
End Sub
8. Formlara Eklenen Resimler Dosya Botunu Çok
Büyütüyor
Form ya da raporlara özellikle büyük resimleri eklerken bunların
BMP formatında olmasına dikkat edin. Ayrıca yüksek kalitede resim kullanmak,
dosyanızın boyunun gereksiz yere artmasına neden olur. Daha önceden 300 KB'lik
bir JPEG (16milyon renkli, 72 dpi) resmini dosyama eklemek istediğimde dosyanın
boyutunun 2,5 MB arttığını gördüm. Aynı resmi aynı
kalitedeki BMP dosyasına dönüştürüp aktardığımda dosyanın boyu sadece 350 kb.
artmıştı.
9. SQL Kodlarında Tarih Kriterleri Sorun Çıkarıyor
Pekçoğumuz SQL kodlarında tarih arama kriterinin tanınmaması gibi bir sorunla
karşılaşmışızdır.
“SELECT * FROM Table1 WHERE Tarih=#4.1.2000#”
gibi bir cümlede hata olduğu mesajı ile karşı karşıya kalırız. Sorun tarih
ayıracının “.” yerine “/” olması gerektiğinden kaynaklanıyor olabilir. Ya da
veriler yanlış geliyorsa gün ile ay kısmının yer değiştirmesi gerektiğini
düşünebilirsiniz. Ve bunlar her bilgisayarda farklı olabiliyor. Bu sorunlardan
kurtulmak için aşağıdaki şekilde deneyebilirsiniz.
Format(Date(), "#") ‘=36617 1.4.2000 için
Eğer tarihi belirtmek gerekiyorsa gün ile ayın
hangisinin daha önce yazılacağında içimde hiç şüphe kalmadan şu komutu tercih
ederim:
Format(DateSerial(2000, 4, 1), "#") ‘=36617
Artık tarih değerinin açıkça yazılması yerine doğrudan aynı değere karşılık
gelen 36617 sayısı SQL cümlesi içinde yeralacak ve bizi sıkıntıdan
kurtaracaktır.
“SELECT * FROM Table1 WHERE Tarih=36617”
gibi. Bu, hemen hemen tüm SQL uygulamaları için geçerli. 31.12.1899 günü 1
olacak şekilde her tarihin mutlaka bir sayısal değeri vardır. Veritabanları da
tarih verilerini bu şekilde saklıyorlar, sadece gösterimde biçim uyguluyorlar.
Tarihin saat kısmı ise tahmin edeceğiniz üzere ondalık olarak kaydediliyor.
10. Query/Sorgu Yazımında Hata
Access'in Türkçe sürümünde sorgu yazarken “AND” ve “IS NULL” yerine “BETWEEN”,
“REPEAT SECTION” gibi metinler otomatik olarak ekleniyor ve hatalı sorgu
metinleri oluşuyor. Birçoğunuzun bildiği gibi bu hatalar
servis güncellemeleri ile giderilebiliyor. En azından sorgu yazımında bu tür
hataları önleyebiliyoruz. Sorgu yazarken Query Builder (Sorgu
Sihirbazı) yerine SQL görünümünü kullanırsak bu tür kod değişiklikleri
olmayacaktır. Fakat Query Builder ile yaptığımız ilk kayıtta bu değişiklikler
uygulanır.
Bu sayıda farklı birkaç konuyla ilgili bazı ipuçları vermeye çalıştık.
Okuyuculardan gelen istek ve öneriler doğrultusunda da diğer bazı konulara
değinmeye çalışacağız. İleriki aşamalarda Access’te başvuru kütüphaneleri,
içine-ekleler ve sihirbazlar yazmayı deneyeceğiz ve Access 2000’e geçmeyi
unutmayacağız...
Serkan ŞAHİNOĞLU
(PC Magazine,
Mayıs 2000) |