BASİT SU FATURASI ÖRNEĞİ - (Sorgu, hesaplamalar ve IIf fonksiyonu anlatımı amaçlı)
#1
[Resim: susayacbz1.gif]

Merhaba;

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 (“Parabirimi” veri türünde oluşturduğum bu alan bize sarfiyat miktarını hangi birimfiyatla çarpacağımızı gösterecek. Meskenler için su birimfiyatı 1,35 YTL olduğundan buranın varsayılan değerini 1,35 yaptım).

subedeli (sarfiyatla birimfiyatı çarpınca bulunacak bedel için oluşturduğum “Parabirimi” veri türündeki bu alandaki hesaplamayı da yine sorguda ve form üzerinde göstereceğiz).

kdv (“Parabirimi” veri türünde oluşturduğum bu alan, subedelinin %8’ini hesaplayarak bize KDV miktarını verecek. Buradaki hesaplamayı da sorguda ve form üzerinde göstereceğiz).

toplamtutar (subedeli 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 birimfiyatı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 birimfiyat ü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 birimfiyatı ç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 önizlemede 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 Önizlemek” 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…


Eklenti Dosyaları
.rar   SuFatura.rar (Boyut: 29,38 KB / İndirilme: 4.613)



  Alıntı
Bu mesajı beğenenler: avacado1959
#2
Sayın Gitarisyen;

Bu tür izahlı anlatımlarınızın çok faydalı olacağına inanıyor ve sizi tebrik ediyorum.

Selamlar.



  Alıntı
Bu mesajı beğenenler:
#3
Access yazarlarını kıskandıracak derecede özenli ve mükemmel anlatımınız için sizi kutluyorum..
Javascript
  1. this.setState({sign:"Here comes the sun...."})







  Alıntı
Bu mesajı beğenenler:
#4
Sayın gitarisyen;

Günaydın.

Bir konu ancak bu kadar güzel, özenle ve güzel Türkçe'miz ile anlatılabilir.

Tebrikler ve en içten teşekkürler.

Selam, sevgi ve saygılar.



  Alıntı
Bu mesajı beğenenler:
#5
Sayın İsmail Küçükşengün;

Sayın beab2005;

Sayın assenucler;

Mesajlarınız ve yorumlarınız için çok çok teşekkür ederim...

Access öğrenirken yaşanan en büyük sıkıntılardan birinin, konuların basit ve herkesin anlayabileceği şekilde anlatılmamasından kaynaklandığını düşünüyorum ve bunun sıkıntısını çok çektim. (Halâ da çekiyorum)... Bu konudaki kitaplar genelde ya çeviri ya da yazarları okurlarını düşünüp empati yapmadan konuları yazdıklarından Access'le ilgilenen herkes tarafından anlaşılması güç oluyor.

Ben de öğrendiğim, anladığım, kavradığım en küçük ayrıntıyı bile faydalı olabilmesi umuduyla olabildiğince basitleştirerek, sade bir dille anlatmaya çalışıyorum.

Sizlerin güzel, şevk verici ve itici güç olan mesajlarınızın desteğiyle inşallah bundan sonra da bu tarz anlatımları yapmaya çalışacağım...

Saygılarımla...



  Alıntı
Bu mesajı beğenenler:
#6
teşekkür ederim



  Alıntı
Bu mesajı beğenenler:


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  OKUL ARKADAŞLARI ÖRNEĞİ- Tablo/Form/Sorgu (Açıklamalı) gitarisyen 23 28.273 08-06-2022, 09:26
Son Mesaj: zago
  ADRES VE TELEFON REHBERİ ÖRNEĞİ - Tablo/Form (Açıklamalı) gitarisyen 30 58.152 23-05-2018, 09:09
Son Mesaj: ercens
  YAŞMATİK ("DateDiff" Fonksiyonu Anlatımı Amaçlı) ahmet114 1 2.067 02-12-2016, 22:26
Son Mesaj: dsezgin
  YAŞMATİK ("DateDiff" Fonksiyonu Anlatımı Amaçlı) gitarisyen 14 21.514 17-03-2016, 17:59
Son Mesaj: ayhanHX

Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi