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
 

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 c.rar. 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)


http://BilgiTeknoloji.net