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
 

Kod Yazmaya Geçiş


Access modüllerinde kullandığımız dil VBA, yani Visual Basic for Applications. Office’in hemen her yerinde kullanılabiliyor. Hatta başka uygulamalarda da kısmen yer edinmiş görünüyor. AutoCad gibi bazı programlarda VBA kullanılabiliyor örneğin.


KOD DENEMEK İÇİN EN KISA YOL

Veritabanı ana penceresinde iken (Database Window) modül (Modules) sayfasına geçip yeni (New) bir modül oluşturalım. (Resim – db1 Module1 code)


Yeni bir modül penceresi.

Herhangi bir kodu çalıştırmak için mutlaka “Sub” ile başlayan bir yordam oluşturmalıyız.


“Sub” ile “End Sub”un arasında herhangi bir yerde F5’e basın.

“Sub Deneme” yordamını aynen yazıp “Sub” ile “End Sub” arasında herhangi bir yerde F5 tuşuna basarsanız program çalışır ve iki kez mesaj gösterir. Bunun gibi End Sub’dan sonra yeni yordamlar ekleyebilirsiniz.

Ek olarak İşlev (Function) tanımından bahsetmek gerekiyor. Bu da “Sub” yerine “Function” yazılarak kullanılıyor ve “End Function” ile bitiyor. Tabii önemli bir farkı var. İşlevlerin asıl amacı geriye değer döndürmektir. Yani bir işlev çağrılırken bir şeye eşitlenir (istisna olabilir).

“Ortalama” adlı işlev örneğine bakın şimdi. Orada işlevi tanımladıktan sonra artık herhangi bir yerden bunu çağırıp kullanabiliyoruz. İsterseniz bunu sorgu yaparken SQL metinlerinizin içine de yazabilirsiniz.

İşlevler bir şart dışında, tek başlarına çalışmazlar. Eğer işlevlerin parametreleri yoksa bunlar “Sub” yordamları gibi çalışırlar.

Parametreler “Function” ya da “Sub” tanımlama başlığındaki parantezler arasında bulunan değerlerdir. İki parantezin arası boş ise parametre yoktur. Birden fazla parametre varsa aralarına virgül koyularak sırayla yazılırlar.

Şimdi varolan bir formunuzda düğme oluşturup “Tıklatıldığında” (OnClik) olay yordamına kod yazmak istiyoruz. Düğmenin ilgili özelliğini seçtiğinizde aşağıdaki gibi bir metin oluşturulur.

Option Compare Database
Option Explicit
Private Sub Buton_Click()
..
End Sub

“Private Sub” ile “End Sub” arasındaki kısma yazdığınız kodlar düğmeye basıldığında Access tarafından çalıştırılır. (“Private Sub” ve “Public Sub” deyimlerinden daha önce bahsetmiştik. Bu form için “Private Sub”un “Sub” kullanmaktan farkı yok şimdilik.)

Şimdi bu düğme formu kapatma görevi üstlensin ve siz onun kod bölümüne şunu yazın:

DoCmd.Close

İlk kısımda modüllerle ilgili bahsettiğimiz yazım kuralları burada da geçerli. İsterseniz “Ortalama” işlevini bu düğmenin içinde kullanabilir, isterseniz işlevin kendisini bu formun içine alabilirsiniz. Bir veritabanı içindeki Genel (Global) yordamların aynı adı alamayacaklarını ve formlarda olduğu gibi raporlarda da aynı şekilde kod yazabileceğinizi söyleyeyim.


İPİN UCUNDAN AZICIK

Eğer sıkça kod yazmaya başlamışsanız Tools/Options/Form-Reports (Araçlar/Seçenekler/Form-Rapor) menüsündeki “Always use event procedures” (Her zaman olay yordamlarını kullan) seçeneğini aktif hale getirmeniz faydalı olacaktır. Bu, örneğin bir düğmenin tıklama (click) yordamına bir kod yazmak istediğinizde karşınıza herhangi bir soru çıkmadan, doğrudan modül sayfasında ilgili olay yordamının açılmasını sağlar.


LİSTEDE YOKSA EKLEYİVER

Açılan Kutu (ComboBox) nesnesini kullanırken yeni yazdığınız değer listede yoksa eklenmesini istiyorsanız aşağıdaki kodu deneyin. Önce nesnenin “Listede Yokken” (NotInList) olayının çalışması için kod sayfasını açın. Karşınıza alttaki satırlar gelecektir:

Option Compare Database
Option Explicit
Private Sub AcilanKutu1_NotInList(NewData As String, Response As Integer)

End Sub

“Private Sub..” ile “End Sub” satırları arasına Tablo1’deki kodu ekleyin.

Tablo1
If MsgBox("Yazılan değer listede yok. Eklensin mi?") = vbNo then exit sub
Dim db As Database
Set db = CurrentDb
db.Execute "insert into TABLO1(ALAN1) values (" & AcilanKutu1.Text & ")"
'db.Execute "insert into TABLO1(ALAN1) values (' " & AcilanKutu1.Text & " ')"
'Eger kayit girilecek alan sayi degil de metin ise 2. satiri kullanin.
'Acilan kutudaki yeni metin ilgili tabloya eklenecek.
'TABLO1(ALAN1) yerine hangi tablonun hangi alanina ekleme yapilacaksa
'onlari yazin. KISILER(AdiSoyadi) gibi. tablo ya da alan isimleri
'hata verirse basina ve sonuna koseli parantez ekleyin.
'[kisi adlari tablosu]([adi soyadi]) gibi.

Dim deger
deger = AcilanKutu1.Text
AcilanKutu1.Undo
AcilanKutu1.Requery
Response = acDataErrAdded
'yeni kaydi ben simdi ekledim. hatayi yoksay.
AcilanKutu1.Value = deger

 


DEBUG WINDOW MU DESEM, HATA AYIKLAMA PENCERESİ Mİ DESEM...

Programı durdurup izlemek yapılan şeyleri gerektiğinde Locals Window ve Immediate Window’dan çokça faydalanabiliyoruz. Immediate Window programa ara verildiğinde (pause) o an çalıştırabileceğimiz kod satırları girmemizi sağlar. Tabii programın orjinal kodları değişmez, sadece o an için ayrı bir pencerede kod yazıp çalıştırma imkanımız oluyor.


LOCALS WINDOW İLE HERŞEYİ GÖRÜN

Şimdi herhangi bir veritabanı dosyamızı açıp içinde ne var ne yok, bakalım. Önce yeni bir modül sayfası açıp şu yordamı ekleyelim:

Sub Deneme()
Dim DB as Database
Set DB=CurrentDb()
End Sub
‘bu satıra gelip F9 tuşuna basın.

Locals Window’un amacı yereldeki aktif değişkenlerin (bellekteki bize ait bilgilerin) görüntülenmesini sağlamak. Bu durumda biz ne kadar değişken tanımlarsak, onu Locals Window’dan izleme olanağımız var. Öyleyse bir CurrentDB tanımlamak gerekiyor.

Locals Window’u ancak program çalıştığı durumda izleyebiliriz. Bunun için en son satırın üzerinde iken F9 tuşu ile bir “breakpoint” oluşturalım. Bunu yapınca satırın rengi değişecektir. (İptal etmek için yine F9’a basılıyor.)

F5 ile kodu çalıştıralım. F9 ile işaretlerdiğiniz satıra gelince program bekler. Breakpoint’lerin görevi bulunduğu satıra gelindiğinde programı durdurmaktır (pause). Şimdi View / Locals Window menüsünü açalım.

Benim örneğimde bellekte aktif olan iki nesne de pencerede görünüyor. Yanındaki (+) ile listeyi açarak FRM adıyla tanıttığım formun Caption değerini buluyorum. Orada “Form1” yazıyor.

Bu esnada yine View menüsünden Immediate Window’u açacağız. Oraya “? Frm.Caption” yazıp enter’a basın. Hemen altına Frm’nin başlığını yani “Form1” yazdı. Şimdi de ( Frm.Caption=”Forma yeni isim” ) yazın. Sonra yeniden “Frm.Caption”u yazdırmayı deneyin. Gördüğünüz gibi program durdurulmuş halde iken istediğimiz gibi müdahale yapabiliyoruz.
 

ADO GELDİ MERTLİK BOZULDU

Acces2000’de veritabanı işlemleri için ADO kütüphanesi kullanılıyor. Doğrudan bu seçili geldiği için biz babadan kalma DAO’muzu kullanacağız şimdilik. Referanslar kısmından ADO’yu kaldırıp DAO’yu seçin.

Örneğin dosyamızdaki tüm form ve raporları kodla listelemek istiyoruz. Şöyle bir yordam yazıp çalıştırın:

Sub Deneme()
Dim db As Database
Set db = CurrentDb()
End Sub ‘buraya gelip F9’a basın.

Şimdi Immediate Window’da şu satırları çalıştırın:

? db.containers("Forms").Documents.count
? db.containers("Forms").Documents(0).Name
Application.Assistant.Visible=True

Birincisinde dosyamda kaç adet form olduğunu, ikincisinde 1. formun adını öğrendim (0 numarası 1. formu işaret ediyor). Diğer nesnelerin de listesini bulmak istiyorsanız program bu halde dondurulmuş iken Locals Window’u kullanarak DB/Container/Documents öğelerini incelemelisiniz. Üçüncü satırı da siz tahmin edin artık.

Şimdi Immediate Window’da şu komutu çalıştırın:

MsgBox "F5 tuşuna basıp programı devam ettir."

Bu arada (?) işaretinin “print” anlamında kullandığını söyleyeyim. İsterseniz doğrudan “print” yazabilirsiniz. Değer değiştirmek için de Immediate Window’a gerek yok her zaman. Locals Window’da ilgili değeri bulup seçerek değerini değiştirmeyi deneyin.

Bu konuyla ilgili bir de Watch Window var. Onun içine kendimiz değer tanımı ekleyebiliyoruz. Örneğin biraz önceki örneğimizde bulunan DB değişkenini eklersek Locals Window’da olduğu gibi bunun tüm alt değerlerini görebiliyoruz. Yani bu, Locals Window’un bizim değiştirebildiğimiz hali sayılabilir. Ek olarak buna formül de eklenebiliyor.


HERKES İÇİN SORGULAR - TABLO OLMADAN SORGU YAPMAK

Tablo olmadan sorgu olur mu derseniz, olur. Hani daha önce her SQL cümlesinde mutlaka olması gereken iki bileşenden, “Select” ve “From” deyimlerinden bahsetmiştik. Sonra da SQL’in standart olanı ve standart olmayanı olduğunu söylemiştik. Bu da standart olmayan bir SQL kodu işte.

SELECT "Ali" AS Ad, "Kara" AS Soyad;


Tablo seçmeden de sorgu oluşturabilirsiniz.

 


ACCESS HİKAYELERİ
İLK ADD-IN’İMİZ

Access, add-inleri çalıştırmak için dosyada bir işlev arar ve onu çalıştırır. O işlevi biz hazırlarız ve içine programın başlaması için gereken komutları yazmalıyız. Tabii add-in’imizi de Access’e tanıtmak için ayarlar gerekiyor.

Önce “uSysRegInfo” adlı bir tablo oluşturulur. Haliyle add-in’in ilk yüklenmesi için Access’in bu tabloyu kullandığını söylemeliyim. Fakat Add-in’ler registry’de kayıtlı olduğu için bu zorunlu değil ama kolaylaştırıcı. Yani Access add-in yüklerken ya da kaldırırken registry’deki birkaç değeri düzeltmekten başka birşey yapmıyor.


Gelecek yazı Access'te eklenti (add-in) oluşturma ile ilgili.
 

Serkan Şahinoğlu
PC Magazine, Ekim 2000


http://BilgiTeknoloji.net