|
Bilindiği gibi Access’te veritabanının bütün yükünü
sırtlanan nesneler tablolardır ve iyi yapılmış bir tablo
tasarımı ve tabloda gereksiz fazlalıkların olmaması,
yapacağımız uygulamanın performansını artırır... Yine
hesaplanmış alanların veya hesaplamaların da tablolarda
tutulmaması gerekir. Zira bu alanlar tabloların
(dolayısıyla veritabanının) gereksiz yere şişmesine,
performansının düşmesine ve diğer aksaklık ve hatalara
neden olacaktır... Bu nedenle hesaplamalar formlar,
raporlar ve daha çok (özellikle) sorgular üzerinde
yapılır.
İşte ben de bugün tablomuzda tutulmaması gereken
hesaplamaların sorgularla nasıl oluşturulacağı, form
üzerinde nasıl gösterileceği, formdan rapora form
üzerindeki kaydın nasıl aktarılacağı, basit şekilde Iif
fonksiyonunun kullanımı gibi konuları basit şekilde
anlatabilmek amacıyla kendime göre bir Su Faturası
Çalışması hazırladım...
Elbette, benim yaptığım örnekteki hesaplamalar ve
yerleşimler, kodlarla, SQL ile veya farklı şekillerde de
yapılabilir. Amacım sadece basit bir örnekle (hiçbir
fazla ayrıntıya girmeden) form ve sorgu üzerinde
hesaplamaların nasıl ve ne şekilde yapılabileceğini
göstermek...
Şimdi gelelim örneği hazırlarken hangi aşamaları takip
ettiğime:
TABLO TASARIMI:
Öncelikle tasarım görünümünde tablomu açarak alan
isimlerini ve veri türlerini girdim.
Burada amacım; su sayacının son okuma tarihinden 15 gün
sonra son ödeme tarihi olacak şekilde; ilk endeks ile
son endeks arasındaki sarfiyat miktarını bulup, bunu
suyun birim (m3) fiyatı olan 1,35 ile çarparak su
bedelini bulmak, %8 KDV’sini hesaplamak ve su bedeli ile
KDV’yi toplayarak toplam tutarı bulmak olduğu için
tablomda şu alanları oluşturdum:
aboneno (Her
abonenin farklı bir numarası olmasını ve sırayla artarak
gitmesini istediğimden, bu alanın veri türünü “Otomatik
Sayı” yaptım.)
adsoyad
adres
turu (Burada
“mesken” veya “işyeri”nin birim fiyatının farklı
olacağını düşündüğümden, “Veri Türü” bölümünde arama
sihirbazıyla bir değerler listesi oluşturdum ve
varsayılan değerini =”MESKEN” yaptım. Formumda burası
açılan kutu şeklinde gözükecek ve kutu içinde varsayılan
değer olarak “MESKEN” ifadesi yer alacak.)
okumatarihi (Burada
veri türünü “Tarih/Saat” yaparak giriş maskesi ile bir
tarih biçimi oluşturdum ve -forma bilgileri girdiğim gün
sayacı okuduğumu farz ederek- varsayılan değeri -bugünün
tarihini göstermesi için- "=Date()" yaptım.)
ilkendeks (“Sayı”
veri türünde oluşturduğum bu alan, sayacın ilk endeksini
gösterecek.)
sonendeks (“Sayı”
veri türünde oluşturduğum bu alan, sayacın son endeksini
gösterecek.)
sarfiyat (sonendeks
ile ilkendeks arasındaki farkı alacağımız bu alandaki
fark hesaplamasını sorguyla yapacağız.)
birimfiyat (“Para
birimi” veri türünde oluşturduğum bu alan bize sarfiyat
miktarını hangi birim fiyatla çarpacağımızı gösterecek.
Meskenler için su birim fiyatı 1,35 YTL olduğundan
buranın varsayılan değerini 1,35 yaptım.)
subedeli (sarfiyatla
birim fiyatı çarpınca bulunacak bedel için oluşturduğum
“Para birimi” veri türündeki bu alandaki hesaplamayı da
yine sorguda ve form üzerinde göstereceğiz.)
kdv (“Para
birimi” veri türünde oluşturduğum bu alan, su bedelinin
%8’ini hesaplayarak bize KDV miktarını verecek. Buradaki
hesaplamayı da sorguda ve form üzerinde göstereceğiz.)
toplamtutar (Su
bedeli ile kdv’yi topladığımız zaman bulacağımız toplam
tutar için oluşturduğum bu alandaki hesaplamayı da sorgu
ve form üzerinde yapacağız.)
sonodemetarihi (“Tarih/Saat”
veri türünde oluşturduğum bu alanda sonokumatarihi’nden
15 gün sonra son ödeme tarihi olmasını istediğimden
varsayılan değerini "=Date()+15" yaptım.)
NOT: Burada önemle şunu söylemek isterim,
yukarıda oluşturmuş olduğumuz sarfiyat, birimfiyat,
subedeli ve kdv alanların veri türünü “Metin” olarak
bırakabileceğimiz gibi hatta (bu alanlar tabloda bir
işleme girmeyeceğinden ve bu alanların hesaplamaları
tabloya kaydedilmeyeceğinden) tablomuzda göstermemize de
gerek yoktur. Zira bu alanları sorgu veya form üzerinde
formüllerle tanımlayacağız ve hesaplamalarımızı orada
yapacağız. Ancak yine de, ben kolaylık olması, gelişimin
görünmesi ve tablodan sihirbazla form oluştururken basit
olması nedeniyle bu alanları da tabloma dahil ettim.
FORM TASARIMI:
Form oluşturma sihirbazıyla tablomdaki alanları form
üzerine aktardım ve formun şeklini şemalini verdikten
sonra form üzerinde hesap yapacağım metin kutuları
üzerinde formülleri yazmaya başladım. (Burada
yapacağımız işlemler, formüller bizim örneğimizde sadece
form üzerinde gözükecek, daha doğrusu formumuz için
geçerli. Raporda görebilmek için sorgu oluşturup, sorgu
üzerinde ayrıca işlem yapacağız.)
SARFİYAT (M3): Buradaki
metin kutusunun Veri sekmesinin Denetim Kaynağı satırına
=[sonendeks]-[ilkendeks] yazdım. (Amacım sonendeks
alanındaki değerden ilkendeks alanındaki değeri çıkarıp
sarfedilen su miktarını m3 cinsinden bu metin kutusunda
göstermek.)
BİRİMFİYAT: Hatırlanacağı
üzere yukarıda sarfiyatla çarpılacak olan birim fiyatın
meskenler için farklı, işyerleri için farklı olduğunu
söylemiştik. Meskenler için 1,35 YTL olan birimi de
varsayılan değer olarak atamıştık. (O yüzden formumuzda
yeni bir kayıt açtığımız zaman BİRİM FİYAT alanında 1,35
YTL gözükmekte.) İşte TÜRÜ açılan kutusundan İŞYERİ
seçeneğini seçtiğim zaman BİRİM FİYAT alanındaki bu
değerin 1,35 YTL değil de, (örneğin) 2,00 YTL
gözükmesini ve işyeriyle ilgili hesaplamaları bu birim
fiyat üzerinden yapmasını istiyorum. (İşyerlerinin birim
fiyatını bilmediğim için ben örnek olması bakımından 2
YTL dedim.) Bunun için Iif fonksiyonundan faydalandım ve
birimfiyat metin kutusunun özelliklerinden Veri
sekmesinin Denetim Kaynağına
=IIf([turu]="MESKEN";1,35;2) yazdım.
Burada şunu demek istedim: Eğer “turu” alanındaki değer
“MESKEN”e eşitse 1,35 olarak değilse 2 olarak göster.)
(Bu işlemi yaptıktan sonra formu form görünümünde açarak
TÜRÜ alanındaki açılan kutunun seçeneklerini
değiştirirseniz farkı görebilirsiniz.)
SU BEDELİ: Burada
sarfiyatla birim fiyatı çarparak su bedelini bulmayı
amaçladığımdan, Veri sekmesinin Denetim Kaynağı satırına
=[sarfiyat]*[birimfiyat] yazdım.
(Sarfiyat adı verilen metin kutusuyla birimfiyat adı
verilen –ve her ikisi içinde formül yazdığımız- metin
kutularındaki değerin birbiriyle çarpılarak su bedelinin
ne kadar olacağını hesaplatmaktı amacım.)
KDV (%8): Burada
da, su bedelinin %8’ini hesaplayarak YTL cinsinden
fiyatı göstermesi için metin kutusunun Veri sekmesinin
Denetim Kaynağı satırına
=[subedeli]*0,08 yazdım.
TOPLAM TUTAR: Son
olarak su bedeli ile kdv miktarını toplayarak toplam
tutarı bulmak amacıyla metin kutusunun Veri sekmesinin
Denetim Kaynağı satırına
=[subedeli]+[kdv] yazdım.
Formumuzu normal görünümde açtığımız ve ilk endeks ile
son endeks alanlarına değerleri girdiğimiz zaman
hesaplamaların form üzerinde otomatik olarak yapıldığını
görebiliriz.
SORGU TASARIMI:
Sorgular bölümünü açarak, “Tasarım görünümde sorgu
oluştur” dedikten sonra, Tbl_Sayac tablomu Sorgu
kılavuzuna ekledim. Daha sonra kılavuza eklenen bu
tablodan bütün alanları (tablonun başlık çubuğunu çift
tıklayarak ve bütün alanlar seçili hale gelince tasarım
kılavuzunun alttaki satırlarına sürükleyerek) sorguya
ekledim.
Form tasarımında uzun uzun anlattığım için burada
anlatmayacağım ancak örneği ve sorguyu incelediğiniz
zaman göreceğiniz gibi; sorgunun alan satırında
hesaplama yapacağım alanları formül yazarak tanımladım.
Burada form üzerinde yukarıda yaptığım formülleri bu
alanlara da yazdım. Ancak burada şöyle bir fark var:
Örneğin sarfiyat alanı satırında sorguya hesaplama
yaptırabilmek için
sarfiyat:
[sonendeks]-[ilkendeks] yazdım.
Diğer alan satırlarını da şu şekilde tanımladım:
birimfiyat:
IIf([turu]="MESKEN";1,35;2)
subedeli:
[sarfiyat]*[birimfiyat]
kdv:
[subedeli]*0,08
toplamtutar:
[subedeli]+[kdv]
Burada yukarıda değindiğim gibi aslında tablomuzda
olmasa bile örneğin [sonendeks]-[ilkendeks] formülünü
gerçekleştiren “sarfiyat” isimli bir alan tanımlamış
oldum.
RAPOR TASARIMI:
Yukarıda sorgumuzu oluşturduk ama, bu sorguyu güzel
şekilde bir raporda görüntülemek ve yazıcıdan çıktısını
da alabilmek gayet güzel olur herhalde.
Bunun için Raporlar bölümünde “Sihirbazı kullanarak
rapor oluştur” dedikten sonra yukarıda oluşturduğumuz
Srg_Sayac sorgusunu kaynak alan bir rapor oluşturdum.
Sorgudaki bütün alanlar rapora yerleşmiş oldu. (Artık
sorgunun yaptığı bütün hesaplamaları bu raporda
görebiliriz.) Raporun şekliyle şemaliyle (biçim
menüsüyle oynayarak) biraz uğraştıktan sonra, rapora son
şeklini verdim.
Artık form üzerine bir buton yerleştirerek ve bu butona
tıkladığımda raporu ön izlemede göstermesi için komut
düğmesi sihirbazından faydalanabilirim.
Ancak aklıma şöyle bir şey geldi: Ben form üzerinde bu
butona tıkladığım zaman, ne kadar abonenin kaydı varsa
raporda hepsini gösterecek… Bense sadece form üzerinde
hangi kayıttaysam raporda da o abonenin bilgilerini
göstermesini istiyorum. O halde sorguya öyle bir ölçüt
yazayım ki; form üzerinde hangi kayıttaysam formdaki
butona tıklayınca sorgu sadece o kaydın bilgilerini
görüntülesin ve raporda da bunu göstersin.
Bunun için Srg_Sayac sorgumu tasarım görünümünde açtım
ve “aboneno” alanının “Ölçüt” satırına
[Formlar]![Frm_Sayac]![aboneno] yazdım.
Bunun anlamı şudur: Sorgumda, ben Frm_Sayac formu
üzerindeyken hangi kaydın aboneno alanı gözüküyorsa o
kaydı sorgula…
Bunu örneğin;
[Formlar]![Frm_Sayac]![adsoyad] olarak
da yazabilirdik. O zaman da form üzerinde hangi adsoyad
değeri varsa ona göre o kaydı sorgulatmış olurduk.
Sorguma bu ölçütü yazdıktan sonra formumu tasarım
görünümde açıp, sihirbaz yardımıyla “Raporu Ön izlemek”
için bir komut düğmesi oluşturdum ve adına “FATURAYI
GÖR” dedim. Bu butona tıkladığım zaman, rapor açılacak
ve form üzerinde hangi abonenin kaydındaysam (sorgudaki
ölçüt nedeniyle o ölçüt sorgulanarak) raporda (kayıt
kaynağını sorgumuzdan aldığı için) o abonenin fatura
bilgileri görüntülenecektir…
Daha sonra raporumun özellikler penceresinden
faydalanarak önde ve ortada açılacak şekilde ayarladım.
Son olarak uygulamam açıldığı zaman doğrudan
oluşturduğum form gözüksün diye Araçlar>Başlangıç
yoluyla Form/Sayfa Görüntüle kısmında Frm_Sayac formunu
seçtim… Yine veritabanının şişmemesi ve uygulama kendini
her kapattığında veritabanının sıkıştırılıp onarılması
ve boyutunun küçülmesi için Araçlar > Seçenekler > Genel
yoluyla “Kapatırken Düzenle” onay kutusunu aktif hale
getirdim…
Örneğimi bu şekilde bitirmiş oldum.
Yukarıda da bahsettiğim gibi, bütün bunları oluşturmanın
tek yolu benim izlediğim bu yöntem değil elbette. Ancak
çabuk olması, pratik olması, Access’e yeni başlayanlara
bir fikir vermesi açılarından ben bu yolu tercih ettim.
Örnek ektedir.
Saygılarımla… |