|
Access'te Sınıf Modülleri
Class modülleri (Sınıf Modülleri) ayrı nesneler olarak
kullanır, onlara istediğimiz gibi işlemler yaptırabilir ve onları çağırıp tekrar
kullanabiliriz. Sıkça kullanacağımız bir işlemi sınıf modülüyle kolayca
yapabiliriz. Bu konunun aslında doğrudan Visual Basic (VBA) ile ilgili
olmasından dolayı biz biraz daha Access’e yaklaştırmaya çalışacağız. O yüzden
okuyucunun sınıf modüllerini temel olarak bildiğini, en azından bu yazıdan bunun
kısmen anlaşılabileceğini varsayıyorum.
Sıkça kullandığımız “Recordset” tanımı Sınıf yani bir Class’tır. Nesne
Gözatıcısı (Object Browser) öyle söylüyor:

Class Recordset
Member of DAO
A representation of the records in a base table or the records that result from
Dim RS As Recordset
Set RS = CurrentDb.OpenRecordset("tablo1", dbOpenDynaset)
RS.AddNew
RS.Fields("isim") = "Hasan Baltacı"
RS.Update
RS.Close
Dim ile RS adlı değişkenin Recordset sınıfından olmasını sağladık. Addnew bu
sınıfın metotlarından biri. Bu metot, RS’nin kayıt ekleme moduna geçmesini
sağlıyor.
Fields ise sınıfa ait bir özellik. Update ve Close ise diğer metotlardan.
LİSTE ÖZELLİKLİ BİR SINIF MODÜLÜ
Bizim sınıf modülümüz virgülle ayrılmış metinleri çözüp listeleyebiliyor ve
sıralayabiliyor.
Veritabanı penceresinde (Database Window) Modül (Module) sayfası açıkken Insert/
Class Module (Ekle/ Sınıf Modülü) menüsünü seçip ilk sınıf modülümüzü ekleyelim.
İlk bakışta herhangi bir modülden farkı yok.
Aşagıdaki kodu yeni bir sınıf modülü (Class Module) açıp yazın. Sonra bunu
MyListBoxComma adı ile kaydedin. Unutmayın, modülü her zaman bu adla
çağıracağız.
‘SINIF MODÜLÜ: MyListBoxComma
Option Compare Database
Option Explicit
Private Dizi() As String
Private Toplam As Integer
Private Ayirac As String * 1
Private Sub Class_Initialize() ‘Sınıf yükleniyor.
Toplam = 0
Ayirac = ","
End Sub
Public Sub AddItem(Strx As String) ‘Listeye eleman ekle.
Toplam = toplam + 1
ReDim Preserve dizi(1 To Toplam) As String
Dizi(Toplam) = Strx
End Sub
Public Property Get Seperator() As String ‘Ayıraç.
Seperator = Ayirac
End Property
Public Property Let Seperator(ByVal vNewValue As String)
Ayirac = vNewValue
End Property
Public Function Clear() ‘Listeyi temizle.
Erase Dizi
Toplam = 0
End Function
Public Property Get ListCount() As Integer ‘Listedeki eleman sayısı.
ListCount = toplam
End Property
Public Sub Sort() ‘Listeyi sırala.
...
...
End Sub
Private Function GetMin(sira As Integer) As Integer
‘Sıralamak için kullanılıyor. Sadece bu Class içinde
‘kullanılabilir. Çünkü Public olarak degil, Private olarak tanımlanmış.
...
...
End Function
Public Function SetComma(ByVal Strx As String)
‘CommaText olarak girilen metni listeye dönüştürür.
...
...
End Function
Public Function GetComma() As String
‘Tüm listeyi ayıraç kullanarak cümle haline getirir.
...
...
End Function |
Bu modülden örneğin şu şekilde faydalanabiliriz:
Sınıfı MyListBoxComma adı ile
kaydettiğimiz için bu adı kullanmalıyız.
‘New ekini de kendi yazdığımız sınıfları kullanabilmek için yazmak
zorundayız.
Dim Liste As New MyListBoxComma
Liste.AddItem "ocak"
Liste.AddItem "subat"
Liste.AddItem "mart" ‘... Tüm ayları yazın.
MsgBox liste.ListCount & " adet eleman:" & Chr(13) & liste.GetComma
Liste.Sort
Liste.Seperator = Chr(13) 'Satirsonu işaretini(13) koyunca altalta
listelenecek.
MsgBox "Listenin sirali hali:" & Chr(13) & liste.GetComma
Liste.Seperator = "-"
Liste.SetComma ("sonbahar-kis-ilkbahar-yaz")
MsgBox Liste.ListCount & " adet oldu simdi." |

Modülü biraz inceleyince Private ve Public şeklinde iki tanım görüyoruz.
Bildiğiniz gibi Private ve Public tanımlamaları yordamların dışardan
kullanılıp kullanılamayacağını belirliyorlar. Bilmeyenler için Public
kullanmadan dışarıdan okuma ya da değiştirme yapılamayacağını ve Private
kullanırsak sadece modülün kendi içinden okuma ve yazma yapabileceğimizi de
söyleyeyim.
Burada normal işlev (function) ve yordamlardan (sub) farklı olarak Property Get ve Property
Let tanımları da kullanılmış. Örneğin Seperator (Ayıraç) özelliği için hem Get
hem de Let yöntemi var. ListCount için ise sadece Property Get var. Bu durumda
ListCount özelliği sadece okunabilir, Seperator ise hem okunur hem de
değiştirilebilir olmuştur.
Class_Initialize yordamı da anlayacağınız üzere bu modülün ilk çalışmaya
başladığı yerdir. Fakat kullanılması zorunlu değildir. Aynı şekilde sınıflar
bellekten atılırken varsa Class_Terminate adlı yordam çağrılır.
RAPOR YAZDIRIRKEN KOPYA SAYISINI SEÇMEK
“Rapor1” adlı raporu 3 defa yazdırmak için şu kodu deneyin:
DoCmd.OpenReport "Rapor1", acViewPreview
DoCmd.PrintOut acPrintAll, , , , 3
Örneğin 6-8 arası sayfaları 3 kez yazdırmak için ikinci satırı şu şekilde
değiştirebilirsiniz:
DoCmd.PrintOut acPrintRange, 6, 8, , 3
PrintOut komutu aktif olan rapor, form ya da tabloyu yazdırır. Kullanmadan hemen
önce yazdırmak istediğiniz belgenin aktif olmasını sağlayın.
SINIRSIZ PARAMETRELİ İŞLEV (FONKSİYON) YAZMAK
Bazan öyle olur ki sınırsız parametre verebileceğimiz yordamlara ihtiyaç
duyarız. İşte örneği:
Function FormatStr(ByVal MainStr As String, ParamArray StrList() As Variant)
As String
‘ParamArray en son parametrenin değişken uzunluklu bir dizi olmasını sağlıyor.
If UBound(StrList) < 0 Then Exit Function
Dim i As Integer
For i = 0 To UBound(StrList)
MainStr = Replace(MainStr, "%" & i + 1, StrList(i))
Next
FormatStr = MainStr
End Function
Bunu şu şekilde kullanın:
MsgBox FormatStr("Burası %1. Şu an %2 ve hava %3.", "Türkiye", Now(), “çok
güzel.”)
‘Resimdeki mesaja aldırmayın siz :)

ParamArray olarak tanımladığınız parametreyi en sona yerleştirin. Aksi halde
hata oluşur.
DAHA GÜZEL KAYIT SİLME
Access’in kendi komut düğmesi sihirbazı ile gelen kayıt silme kodu ekrana
uyarı iletisi
çıkarıyor ve bu genelde iyi bir görüntü oluşturmuyor. Bunun yerine aşağıdaki
kodu kullanabilirsiniz.
Public Sub KayitSil(Optional ByVal
frm As Form, Optional ShowMsg As Boolean)
On Error Resume Next
If ShowMsg Then
If MsgBox("Kayit silinecek. Devam edilsin mi?", vbCritical + vbYesNo) = vbNo
Then Exit Sub
End If
If frm Is Nothing Then
DoCmd.SetWarnings False 'Uyari mesajlarini gosterme.
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70
DoCmd.SetWarnings True 'Sonraki uyari mesajlarini gosterebilirsin.
Exit Sub
Else
If frm.NewRecord And (Not frm.Dirty) Then Exit Sub
End If'Yeni kayit ya da kayit degisikligi ise önce UNDO yap.
If frm.Dirty Then DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, ,
acMenuVer70
If Not frm.NewRecord Then 'Eski kayit ise DELETE
With frm.RecordsetClone
.Bookmark = frm.Bookmark
.Delete
.MoveNext
If .EOF Then .MoveLast
frm.Bookmark = .Bookmark
End With
End If
End Sub |
Kullanımı şöyle:
Call KayitSil (Me,True)
Eğer ikinci parametreyi vermezseniz ya da False olarak verirseniz “Kayıt
silinsin mi?” mesajı görünmez.
Call KayitSil (Me)
Aslında “Me”yi yani formun kendisini parametre olarak yollamanıza her zaman
gerek yok.
Call KayitSil ()
ya da,
Call KayitSil ( , True)
Bu şekilde isterseniz bir formdan ya da bir tablodan kendi mesajınızı
göstererek kayıt silme işlemi yaptırabilirsiniz.
Gördüğünüz gibi bazı parametreleri vermemize her zaman gerek yok. Bunu
yordamın başlığındaki “Optional” seçeneği ile sağlıyoruz. Optional
belirttiğiniz ilk parametreden sonraki diğer parametrelerde de mutlaka aynısını
kullanmanız gerekiyor.
Önceki sayıda SQL kodlarında tarih kullanımıyla ilgili verilen ipucunun
Delphi’deki karşılığı soruluyor. VB’deki Format işlevi yerine FormatFloat bu
işi görür:
Tarih:= #05.23.2000#;
// ya da Tarih:=EncodeDate(2000,5,23); //23.05.2000
ShowMessage(FormatFloat('#',Tarih)); //36669
Query1.SQL.Text:='SELECT Table1.* FROM Table1 WHERE Table1.Tarih=36669';
Geçen ayki ipucuna bakmayanlar için Access ya da VB’de Format(Now,“#”) komutunun
kullanılabileceğini ve SQL kodlarında da bu şekilde belirtme yapılabileceğini
söyleyeyim.
Tüm örnekleri ve Access’te yapılmış ufak bir Sınıf modüllü oyunu Ailenizin Web
Sitesi’nde (http://www.pcmagazine.com.tr) Dergide Adı Geçen Dosyalar bölümünde bulabilirsiniz. Gelecek sefer
ilk başvuru kütüphanemizi (Reference Library) yazacağız.
ACCESS HİKAYELERİ
HİKAYE BU YA...
Bazan Access’in son üç sürümünü aynı anda kullanmak gerekiyor.
Office’in en sevdiğim özelliklerinden biri yeni kurulumlarda eski sürümlere
acıyıp onlara kıymaması. Yapmamız gereken tek şey yeni kurulacak klasörü
eskisinden farklı belirlemek.
Daha önce Access2’de yapılmış programlarımızı Access97’ye dönüştürmemiz
gerekiyor. Ağdaki makinaların bir kısmında MS’nin binbir programlı özel
paketinden çıkan Office97 Türkçe sürümü yüklü. Bir kısmı ise mecburen aldığımız
ingilizce sürüm.
Access’le çalışan tüm tanıdıklarım malum Türkçe meselesinden yakınıyor.
Bizimkilerin sorunu da nedir bir bilseniz! Form adlarında yumuşak g ve diğer
Türkçe karakterler var diye hiçbir kod çalışmıyor. Neyse ki farklı dildeki bir
Windows’ta bunu düzeltebildik.
Şimdi gelgelerim yüzlerce sorgu (query), form, kod içinde bu formun adı
kullanıldığı için arkadaşlar başlarının kısmen belada olduğunu düşünmeye
başladılar. Bazan bu işler imkansız gibi görünse de Access’teki gizli
yardımcılarımız yine yardımımıza koşuyor.
Tools/Analyze/Documenter menüsünü çalıştırdık. Documenter, dosyamızın içinde ne
var ne yok bir bir gösteriyor. Bilmem hangi formun hangi düğmesinin başlığı
nedir, hangi sorgunun sql kodu nasıldır gibisinden herşey var. Böylelikle
Access dosyamızın içerisinde Türkçe karakter olan tüm değerleri kolay yoldan
bulacağız.
İşin sırrı nerede? File menüsündeki “Save As Table” komutunu çalıştırmak
gerekiyor ki o kadar zamanımızı alan bu raporu heba etmeyelim. Gerisi “Object
Definitions” adlı tabloyu incelememize kalmış.
Baştaki konuya dönersek MDB dosyalarının çift tıklatılmasıyla hangi sürümün
açılması gerektiği önceden bilinmeli. Bu durumda dosyaların açılma seçeneklerine
bunları yerleştirmek lazım. Bir de bizim kendi programlarımız için verdiğimiz
uzantının da aynı şekilde ayarlanması gerekiyor.
DAX uzantılı dosyamız bir şekilde HKEY_CLASSES_ROOT\DAX_auto_file dizinine
yerleşmiş. Windows Gezgini’nde sağ tuşla tıklatınca Aç komutu doğrudan Access2’yi
açıyor. Şimdi biz buraya Access97 ve Access2000’i ekliyoruz.
HKEY_CLASSES_ROOT\DAX_auto_file\shell\open\command anahtarının değeri Access2’yi
gösteriyor. Yeni değerler oluşturduk:
HKEY_CLASSES_ROOT\DAX_auto_file\shell\Access97 İle Aç\command
HKEY_CLASSES_ROOT\DAX_auto_file\shell\Access2000’le Aç\command
Her ikisinin Default değerine msaccess.exe dosyalarının yolunu yazdık.
Tabii bunun çalışması için HKEY_CLASSES_ROOT\.dax anahtarında “DAX_Auto_File”
yazıyor olmalı.
Eğer dosya Auto_File olarak tanımlı değilse daha kolay bir yolla aynı şeyleri
yapmamıza izin veriyor Windows. Bildiğiniz gibi Windows Gezgini’nde
Görünüm/Seçenekler/DosyaTürleri menüsünden yapılabiliyor bu.

Sonuçta resimdeki gibi bir sağ fare tuşu menüsü hiç fena değil bence.
DOSYA:
AccessHaziran2000.zip
Serkan Şahinoğlu
(PC Magazine,
Haziran 2000)
|