BilgiTeknoloji.net    
b i l g i   t e k n o l o j i   y a z ı l ı m

Ana Sayfa

Marjinal XML Access Pratik Uygulamalar Projeler Ekonometri Dilimiz Çetrefil İletişim
 

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)


http://BilgiTeknoloji.net