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 Editörden Çetrefil İletişim
 

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)


http://BilgiTeknoloji.net