|
Biraz Keşif Biraz Kuşku
Şöyle elle tutulur ipuçları vermek bu ay vacip oldu.
Access’in, sorgulama yeteneklerinin dışında, sorguları en umulmadık şekilde
kullanabilme gibi yetenekleri de var. Gelgelelim işin ucunda biraz keşif ve
biraz kuşku da var.
HAYAT AYRINTILARDA GİZLİ
Bazan en sıradan işlerde dikkat etmediğimiz bazı ayrıntılar birçok kolaylıklar
getirebiliyor. Mesela tablo tasarımlarında pek dikkat etmediğimiz Lookup adlı
bir özellik sayfası var. Bunu
kullanarak tablolara kayıt girerken forma gerek kalmadan açılır listelerden
seçim yaptırılabiliyor. Tablo görünümündeki süzme yetenekleri de cabası.
Tablo tasarımında iken bir alan tanımlayıp altta özellikler kısmındaki Lookup
sayfasından ComboBox’u (Açılan Liste Kutusu) seçin. Sonra RowSource (Satır
Kaynağı) kısmına gerekli SQL kodunu yazın. Yani seçim yaptırmak istediğiniz
listenin kaynağını.

Tablolara kayıt girerken değerlerin listeden seçilmesini sağlayabilirsiniz.
Lookup sayfasındaki diğer özelliklere de dikkat etmekte fayda var. Örneğin
Limit To List (Listeye Sınır) değerini YES olarak seçerseniz kayıt girişinde
listedeki elemanlardan başka birşey yazılamaz. List Width (Liste Genişliği)
içindeki Auto (Otomatik) değeri yerine bir sayı yazarsanız açılan listenin
genişliğini belirlemiş oluyorsunuz.
Oradaki diğer özelliklerin fazlalığı dikkatinizden kaçmadıysa daha başka şeyler
de anlatmamı bekliyor olmalısınız. ColumnCount (sütun sayısı) değerinin
varlığından Lookup işleminde birden fazla sütun gösterilebileceğini anlıyoruz.

Seçim listesinde istediğiniz sayıda sütunu gösterebilirsiniz. Tabii ki bunlar
SQL metni ile seçiliyor.
Resimde Column Widths (Sütun Genişlikleri) değerini “0cm;8cm” yapmamızın
sebebi ilk sütunun gösterilmemesini istememiz. (İlk sütunun genişliği 0,
ikincisininki 8 cm.) Çünkü bir listeden herhangi bir şehir seçtiğimizde aslında
onun numarası (yani görünmeyen kolondaki değer) kayıtlara girecektir.
BoundColumn değerine bakın. Onun 1 olması, SQL sorgusu ile gelen birinci sütunun
kayda gireceğini gösteriyor. Eğer bu sütun, SQL sorgusu içinde ikinci sırada
olsaydı BoundColumn değerini 2, sütun genişliklerini “8cm;0cm” olarak
değiştirecektik. Bu arada ListWidth (Liste Genişliği) değeri “Auto” olduğu için
açılan liste kutusunun genişliği aktif sütunun genişliği kadar olur. O yüzden sütun
genişliklerindeki diğer değerin fazla bir önemi yok şu durumda. ListRows
(Listedeki Satır Sayısı) ile de açılan listenin satır sayısı belirlenebiliyor.
Burada Access’çilerin koyduğu birkaç kural var. Mesela açılan listenin
BoundColumn sırasındaki alanı görünmez olursa LimitToList değerini YES
yapamıyoruz. ColumnHeads (Sütun Başlıkları) değerinin ne olduğunu da tahmin
ediyorsunuzdur artık.

TABLO KULLANMADAN DEĞER LİSTESİ OLUŞTURMAK
Hepsi bu kadar mı? Değil tabii. Access’çiler ayrıntıları artırıp bu yazının
uzaması için ellerinden geleni yapmışlar. RowSourceType (Satır Kaynağı Tipi)
özelliğine bakın şimdi.
Şimdiye kadar SQL sorgusu ile aldığımız verileri listeleyebiliyorduk. Şu halde
RowSourceType değerini “ValueList” (Değer Listesi) yapıp hemen altındaki
RowSource kısmına da “İstanbul;İzmir;Ankara” yazın. Böylelikle ille bir tablodan
veri alıp seçtirmeye gerek kalmıyor. Sütun sayısı ve genişliklerini de buna
kolayca uyarlayabilirsiniz. Yani iki sütun gösterip
“34;İstanbul;35;İzmir;06;Ankara” şeklinde bir listeyi kullanabilirsiniz. O zaman
genişliği “0;8” şeklinde ayarlamalısınız.
RowSourceType kısmındaki “FieldList” (Alan Listesi) seçeneğinin ne işe
yaradığını anlatmayacağım. Kolayca tahmin ettiğiniz şeyi isterseniz deneyin. Ya
da ne olduğunu zaten biliyorsanız boşverin.
KENDİ LİSTENİ KENDİN YAP
“Kendin pişir, kendin ye!” serimizin bu bölümünde Lookup ile ilgili ufak bir
ipucunu vermeden geçmeyeceğim.
Excel kullananlar bilirler. Uzunca bir listeyi yazarken listenin yukarısında
daha önce yazdıklarınız aktif hücrede önerilir. Belki aynı şeyi yazmak
istiyorsanız kolaylık olsun diye. Biz de bunun Access’çesini yapalım diyorum.
Mesela “Kisiler” adlı tablomuzun “Meslek” adlı bir alanı olsun. Ama ayrıca bir
“Meslekler” tablosu yapmak istemiyoruz. İstediğimiz şey tabloya kayıt girerken o
ana kadar girdiklerimizden seçim yapabileceğimiz bir liste oluşturmak.
Önce “Kisiler” tablosunu tasarım görünümünde açıp “Meslek” adlı alan için dizin
(indeks) oluşturalım. Ki, kayıt girişinde hızlı çalışsın. Sonra alttaki Lookup
sayfasına geçip DisplayControl değerini ComboBox (Açılan Liste Kutusu) yapın.
İki altındaki RowSource satırına “SELECT Meslek FROM Kisiler GROUP BY Meslek
HAVING (Meslek Is Not Null) ORDER BY Meslek;” yazın (tırnak işaretleri olmayacak
şekilde). Başka bir şey yapmadan kaydedin ve tabloyu kayıt listesi görünümünde
açın. Artık Meslek alanı üzerinde, eski yazdıklarınızı sıralı bir liste halinde
görüp onlardan seçim yapabilirsiniz. Fakat yeni girilen
kayıtlar listede yer almayıp tabloyu sonraki açışınızda görüntülenir.

Kendi listesini kendi kayıtlarından seçen bir veri alanı.
GEÇERSİZ VERİLERİ ANINDA KONTROL EDİN
Bütün bu özellikler form ve raporlarda da aynı şekilde kullanılabiliyor. Ek
olarak Validation Rule ve Validation Text yani geçerlilik kısıtlamalarından
bahsetmek gerek. Bir veri alanının alabileceği değerler bu özellikleri kullanarak
kısıtlanabiliyor. Mesela doğum tarihi bilgisini içeren bir alana 1900 yılından
önce doğmuş kimse kalmadığını düşündüğünüz için oraya girilen değerin çok saçma
olmamasını istiyorsunuz. Tarihin ille de 1900 yılından büyük olmasını sağlamak
istediğinizde Validation Rule (Geçerlilik Kuralı) değerine “>#1.1.1900#” (tırnak
işaretleri olmayacak şekilde) yazmalısınız. Uyarı mesajı olarak hemen alt
satırdaki ValidationText (Geçerlilik Kuralı Metni) değerine doğru dürüst bir
tarih değeri yazılmasını söyleyen bir uyarı metni ekliyorsunuz: “1900 tarihinden
önce bir doğum tarihi girdiniz, buna katlanamam!”.
Bu ayarları tablonun tasarım görünümünde yaptığımızı tekrar hatırlatayım. Tüm
alanlar için bu kuralı uygulayabilirsiniz. Ama benim asıl anlatmak istediğim bu
değil. Bir adet de olsa tablonun kendisine geçerlilik kuralı tanımlama imkanımız
var. Mesela kişinin cinsiyeti “Kadın” olarak seçildiğinde askerlik yapıldığına
ilişkin bilgi giriliyorsa ikaz etmek gerekir.
Tablo tasarımında iken View/Properties komutu ilen açılan Özellikler sayfasında
bu değerler tanımlanabiliyor. Önce geçerlilik kuralını tam anlamıyla formülize etmemiz
gerekiyor.
Bu işlemi kod ile yapmak istiyorsanız önce başvurular kısmında (Tools/References – Araçlar/Başvurular) Microsoft
DAO 3.6 Object Library
(DAO 3.6 ya da DAO 3.5) kütüphanesinin seçili olmasına dikkat edin. Herhangi bir modül
sayfasında alttaki kodu çalıştırın.
Dim db As Database
Set db = CurrentDb
Dim td As TableDef
Set td = db.TableDefs("Kisiler")
td.ValidationRule = "Cinsiyet<>'K' or Askerlik=FALSE"
td.ValidationText = "Cinsiyet KADIN olarak seçildiğinde ASKERLİK bilgisi
girilemez."
Tabloda birkaç alan arasında ortak geçerlilik kuralını bu
şekilde kolayca tanımlayabiliriz. Alanların kendilerinde ise sadece kendileri
için kural tanımlanabiliyor. Eğer tabloda yine kuralınız olacak ise onu da uygun
bir kural metni oluşturup bu şekilde kaydedebilirsiniz. Mesela işe giriş ve
işten çıkış tarihinin bir büyüklük sırası vardır. O halde bunun kuralını aynı
tablomuza şu şekilde ekleyebiliriz:
td.ValidationRule = "(Cinsiyet<>'K' or Askerlik=FALSE) and
(GirisTarihi<CikisTarihi)"
td.ValidationText = "Girilen değer kısıtlama kurallarına aykırı."
Ana koddaki son iki satırı bu şekilde değiştirmek yeterli. Sonrasında tabloya bu
kurallara aykırı olabilecek kayıtlar girmeyi deneyin.
ÇEK BİR TABLO, FİLTRELİ OLSUN!
Tablo tasarımındaki güzellikler dışında süzme ve sıralama seçenekleri de
yeterince cazip. Veri girişi görünümünde tabloyu istediğimiz gibi
evirip çevirmemize izin veriyor Access.

Birazdan Ad alanı içinde ‘ahm’ olan kayıtlar görünecek.
Ad alanı üzerine gelip süzgeç kısmına “*ahm*” yazdığımızda içinde “ahm” olan
isimlerin bulunduğu kayıtlar listelenecek. “*” işaretinin ve “Like” deyiminin
nasıl kullanıldığını biliyorsunuzdur. Bu yazdığımız aslında ‘ Like “*ahm*” ‘
şeklinde kullanılıyor
Ek olarak süzgeç içinde
birden fazla alan adını kullanabilirsiniz. Herhangi bir alanın üzerine gelin ve
süzgeç kutusuna şunu yazın:
[cinsiyet] = 'e'
Ya da Cinsiyet alanı üzerine gelip şunu yazabilirsiniz:
(='e') and ([askerlik]=false)
Veyahut da CikisTarihi üzerine gelip şirkette bir yıldan uzun süre çalışmış
kişileri şu şekilde kolayca bulabilirsiniz:
>=GirisTarihi + 365

Birden fazla veri alanı için süzleme yapılabiliyor.
Süzgeç menüsündeki diğer komutları da incelemenizi tavsiye ederim. “Filter By
Selection” (Seçime Göre Süz), “Filter Excluding Selection” (Seçim Dışında
Tutarak Süz), “Remove Filter/Sort” (Süzgeç/Sıralama Kaldır) komutlarını Türkçe
anlamlarını vermek dışında anlatmaya gerek yoktur herhalde. Aynı şekilde “Sort
Ascending” (Artan Sıralama) ve “Sort Descending” (Azalan Sıralama) seçenekleri
de sıralama yapıyor bildiğiniz gibi.
Bu işlemleri aynı anda birden fazla sutün için de yapmak mümkündür. Sütun
başlığından tutup birkaç alanı seçin. Fareyi seçili bölge içinde kalan verilerin
üzerine getirip fare menüsünü açın. Orada sıralama komutlarını kullanarak seçili
alanlara göre ardışık sıralama yaptırabilirsiniz. Menünün aşağısındaki
HideColumns, ColumnWidths komutlarını da seçili tüm alanlar için
uygulayabilirsiniz.

Birkaç alanı birden seçerek ardışık sıralama yaptırılabiliyor.
HideColumns (Sütunları Gizle) komutunu seçip de alanları gizleyip kaybedenler
için Format/UnhideColumns (Biçim/Sütunları Göster) menüsünün kullanılabileceğini
söyleyeyim.
Tablo tasarımlarında yapılan bu ayarlamaların bir faydası daha var. Zaten bütün
bunlar form tasarımlarında da yapılabildiği için sihirbaz ile formunu
hazırladığınız bir tabloda yaptığınız bu düzenlemeler forma aynı şekilde
yansıtılıyor. Mesela Lookup ile listesini başka bir yerden alan veri alanları
için aynı ayarların olduğu Combobox (Açılan Liste) yerleştiriliyor forma.
Hatırlarsanız geçen ay AutoNumber (Otomatik Sayı) hakkında bilgiler vermiştik.
İşte orada bir noktaya değinmedik. Otomatik Sayı alanları için yeni kayıt anında
vazgeçilmesi ile o numaranın bir daha kullanılmaması çok kullanıcılı ortamlarda
da gerekli. Yani aynı anda beş kişinin kayıt girdiği bir tabloda birinin
kayıttan vazgeçmesi otomatik sayının o anki değerinin bir daha kullanılmamasını
gerektirir. Aksi halde yönetmek daha masraflı olsa gerek.
HERKES İÇİN SORGULAR
Sıkça ihtiyaç duyulan bir sorgu türü, kayıtlar içinde belli bir değeri
gruplayarak herbirinin adedini olduğunu bulmak. Örneğin Kisiler tablosundaki Meslek bilgisini gruplayıp her bir meslekten
kaç adet olduğunu öğrenmek ve buna göre sıralamak istiyoruz. Önce yeni bir sorgu
oluşturup Kisiler tablomuzu ekleyelim. Sonra View (Görünüm) menüsünden Totals
(Toplamlar) komutunu seçelim. Bunu yapınca alttaki kısımda Totals (Toplamlar)
satırı gürüntülendi. Resimdeki gibi değerleri girip sorguyu çalıştırınca
mesleklerin listesini ve herbirinin adedini sıralı bir şekilde görebiliriz.

GROUP BY ve COUNT seçenekleri ile her bir
Meslek grubunun sayısını
öğrenebiliyoruz.
KOD İLE FORM VE RAPOR TASARLAMAK
Aslında bu başlık kod ile tasarım yapma konusunu anlatmak için biraz yetersiz
kalıyor. Zira kod ile sadece formlar ve raporlar değil, makrolar, kodlar
değiştirilebiliyor ve hatta veritabanının bütünü başaşağı edilebiliyor.
Bir formu (yani nesneyi) değiştirip kaydedebilmek için normalden farklı olarak
yapacağımız tek şey onu normal görüntüleme modunda değil de tasarım modunda
açmak ve işimiz bitince kapamak.
Dim f As Form
'Tasarım modunda aç.
DoCmd.OpenForm "form1", acDesign
Set f = Forms("form1")
'Gerekli değişiklikleri yap.
f.Caption = "Kisilerle ilgili deneme formu"
f.RecordSource = "Kisiler"
f!text1.ControlSource = "ad"
f!text2.ControlSource = "soyad"
f!text1.Top = 100
f!command0.Left = 10
f!text2.Visible = False
'Değişiklikleri kaydederek kapat.
DoCmd.Close acForm, "form1", acSaveYes
MDE olarak derlenmiş dosyalarda bu şekilde tasarım yapılamıyor.
Dim Frm As Form, Buton As CommandButton
Set Frm = CreateForm
Set Buton = CreateControl(Frm.Name, acCommandButton, , , , 200, 200, 2000, 500)
Buton.Name = "Buton1"
Buton.Caption = "Yeni Buton"
Frm.Caption = "Yeni Form"
DoCmd.Close acForm, Frm.Name, acSaveYes
‘MsgBox Frm.Name & " adlı form oluşturuldu."
‘Hatalı. Başına açıklama işareti koyduk.
Örnekteki gibi kolaylıkla yeni bir form da üretebiliyoruz. Bunu hem tasarım
modunda hem de çalışma modunda yapma olanağımız var. Rapor yapmak için de
CreateReport kullanılıyor.

Gelelim örnekteki hataya. Kodu çalıştırırken son satırda açık olmayan
nesneye başvuru yapılamayacağına dair bir hata mesajı çıkıyor. Tanımlanmış
olsalar da formlar kapatıldıkları anda kullanılamaz olurlar. Yani formu
kapattığımız an Frm adlı değişken kaybolur. O halde son satırdaki “frm.Name”
kısmını silmek gerekiyor.
İPİN UCUNDAN
Eğer bir formu ya da raporu gizli olarak açmak istiyorsanız DoCmd.OpenForm
"Form1", acDesign, , , , acHidden gibi altıncı parametrede acHidden değerini
kullanın. Böylelikle kullanıcıya hiç göstermeden formu tasarım modunda açıp
üzerinde istediğiniz değişiklikleri yaptıktan sonra kaydedip kapayabilirsiniz.
ASİSTAN ASİSTAN NERDESİN!
Office asistanından hoşlanıyorsanız onu programlamak da hoşunuza
gidecektir. Öncelikle başvurular listesinden “Microsoft Office 9.0 Object
Library” kütüphanesini seçmek gerekiyor. Ayrıca asistan da sistemde kurulu
olmalı.
Application.Assistant.Visible = True
Application.Assistant.Animation = msoAnimationLookUpRight
Bu şekilde asistanı gösterip onu hareketlendirebilirsiniz. Asistanın Office’te
yaptığı herşeyi kodla da yaptırabilirsiniz.

Asistana sağ yukarı bakmasını söyledim. Hep itaatkardır :-)
BANA PROSEDÜRÜNÜ SÖYLE...
Diyelim ki DENEME adlı bir yordamımız var. Bunu normalde Call Deneme(...) ile
çalıştırabiliriz. Ama RUN komutu bakın bunu nasıl yapıyor:
Sub Deneme(deger1 As String)
MsgBox deger1
End Sub
Sub RunIleCalistir()
Dim x
x = Run("Deneme", "Run ile deneme")
’Run komutu max 30 adet parametre alır.
End Sub
Serkan Şahinoğlu
(PC Magazine,
Eylül 2000) |