Access İpuçları



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. İlk konumuzdan sonra doğrudan bu konulara geçmek istiyorum. Bilgisayar dergilerinde genelde bir uygulamaya belirli aralıklarla tekrar baştan başlanıldığını gördüm. Bizim amacımız her şeyi yeniden anlatmak yerine başka konulara değinip, gerekirse tekrarlanabilecek bilgileri konu aralarına sıkıştırmak.

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ü. Access bizi o kadar yordu ki bu notların bir hikaye kadar olduğunu düşündüm.
Access97’den başlayacağız. Ağırlıklı olarak problemlerden bahsediliyor ve bazı ufak ipuçlarına ihtiyaç oluyor. Okuyuculardan gelen mesajlar doğrultusunda bu dizinin geri kalan kısmını şekillendireceğiz. Şimdi çok rastladığımız bazı sorunlara ve önemli ipuçlarına geçiyoruz.
Otomasyon Hatası/ Derleme Hatası
(Otomation Error/ Compile Error)
Bu çokça rastlanan 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ı fonksiyonların 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 referanslardaki bir eksikliktir.

***Kutu***

References (Başvurular)

Referans 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. Yandaki resimde başka bir bilgisayarda farklı klasör altında bulunan DAO350.DLL dosyası bulunamadığı için hata oluşmuş ve bu referans “MISSING:” olarak belirtilmiş. Daha sonra referanslardan ayrıntılı olarak bahsedeceğiz.

***KutuSonu***

 

Modül Penceresi Açılmıyor ve Kodlar Çalışmıyor

Bu problemin bazen doğrudan referanslarla ilgili olduğunu düşünebiliriz. Bazen de 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 prosedür varsa, ya da örneğin bir IF satırının bitirilmemiş olması veya “END SUB” kullanılmaması gibi hataları bu şeklide farkedebiliriz.
Bazı durumlarda COMPILE 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 mesaj çıkıyor. Tabii ondan önce hatalı dosyamızı başka makinelerde test etmekte yarar var. Bazen başka bir yerde Compact (Veritabanı Düzenle) ve Repair (Veritabanı Onar) işlemleri sorunu kısmen giderebiliyor.
Bunun dışında bir de Türkçe karakter içeren nesne isimlerine de dikkat etmek gerekli. Veritabanı içindeki nesne adlarında (Tablo, Sorgu, Form vs.) Türkçe karakterler kullanmaktan olabildiğince kaçınmanızı öneririm.
Trim() ve Mid() Fonksiyonları Çalışmıyor
Bu hata çoğunlukla referanslarla ilgili. Trim fonksiyonu VBA kütüphanesinin bir üyesi. Bunu Object Browser’dan (Nesne Yöneticisi) öğreniyoruz.
Bu dosyayı referans 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 fonksiyonların ve diğer bileşenlerin listesini bulabiliriz.
Aşağıda yer alan VBA yazısını tıklayı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
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 prosedür devre dışı kalmadan önce mutlaka RS.Close komutu ile açık olan kayıt kaynağı serbest bırakılmalıdır. Eğer Database 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 fonksiyon parçacıklarının IF komutu içinde mutlaka TRUE ya da FALSE değeri ile eşitlenmesi öneriliyor. Yani şu şekilde:
                If DenemeFonksiyon() Then ... yerine
                If DenemeFonksiyon()=True Then ... kullanılmalı.
Bu hatanın çözümüne The Access Web adlı bir sitede rastladım. Eğer burada adres linki verememe gibi bir kısıtlama yoksa her Access’çinin mutlaka bakması gereken bu sitenin adresini aşağıda veriyorum.
 “(AutoNumber)” / “(Otomatik Sayı)” Metnini Gizlemek
Veri türü Otomatik Artan olan bir veri alanını formdaki metin kutusuna eklediğimizde yeni kayıt anında “(AutoNumber)/(OtomatikSayı)” metni görünüyor. Bunu engelleyebiliriz. Veri alanının adı “KayitNo” olsun. Önce yeni bir form açıp 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, formda “KayitNo” adlı başka herhangi bir nesnenin bulunmaması. Aksi halde kayıt verisi yerine aynı adlı nesnenin değeri görüntülenir.
Label/Metin Etiketi Nesnesinde Yeni Satır/Paragraf 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 butonları 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.
Nesneyi Kendi Olay Yordamında Gizlemek
Örneğin bir butonun "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 başka 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
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  fazla kalitede resim kullanmak, dosyanızın boyutunun 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 bir resim editörü ile aynı kalitedeki BMP dosyasına dönüştürüp aktardığımda dosyanın boyu sadece 350 KB artmıştı.
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 TABLE1.* 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. Bütün bunlardan kurtulmak için başka bir yol öneriyorum.
Format(Date(), "#")                           ‘=36617   1.4.2000 için.
komutunu kullanmayı deneyin. 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 TABLE1.* 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.
Query/Sorgu Yazımında Hata
Daha çok Türkçe versiyonunda sorgu yazarken “AND” ve “IS NULL” yerine “BETWEEN”, “REPEAT SECTION” gibi metinler ekleniyor. Birçoğunuzun bildiği gibi bu hatalar servis güncellemeleri ile gideriliyor. En azından sorgu yazımında bu tür hataları bu paket olmadan önleyebiliyoruz. Query 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. 4 numaralı bölümde The Access Web sitesinden aldığımız bilgileri aktardık. Bu siteye www.mvps.org/access adresinden ulaşabilirsiniz. Okuyuculardan gelen istek ve öneriler doğrultusunda da diğer bazı konulara değinmeye çalışacağız. İleriki aşamalarda Access’te Referans Kütüphaneleri, Add-In ve Built-in Wizard’lar yazmayı deneyeceğiz ve Access 2000’e geçmeyi unutmayacağız...

Disiplin: Access
ACCESS HİKAYELERİ
Serkan Şahinoğlu
ssahinoglu@hotmail.com

xxxxxx