Normalleştirme ve Uygulaması Normalleştirme Neden Uygulanır: İlişkisel veritabanı oluşturmak için normalleştirmeyi bilmek çok önemlidir. Normalleştirme işlemini anlayabilmek için ise fonksiyonel bağımlılık kavramını iyi öğrenmek gerekir. Normalleştirme veri kayıplarını engellemek, verinin tekrarlanmamasını sağlamak ve yetersizliği önlemek için veritbanına uygulanır. Herhangi bir tablonun tekrarlı veriler içerdiği duruma birinci normal form denir. Birinci normal formu Aşağıdaki tablo ile ele alacağız. Dikkat edilecek olursa belirli alanlarda tekrarlar yer almaktadır. Satır Ekleme Sorunu: Böyle bir tabloda ancak yeni bir ürün satın alıdığında yeni bir müşteri eklenir eğer alış veriş yoksa mantıksal olarak müşteri eklemek boş kayıt eklemekle aynı anlama gelir. 1
Normalleştirme ve Uygulaması Satır Silme Sorunu: Eğer Müşteri bir defa alışveriş yapmışsa yapılan alışveriş silindiğinde tüm müşteri kaydı silineceğinden bu kayıttaki müşteri biliglerine birdaha ulaşılamaz. Güncelleştirme Sorunu: Eğer Müşterilerden birinin oturma adresi değişirse bu tablodaki bu müşteri ile ilgili tüm kayıtlar güncellenmelidir örneğimizde 5 kayıt olmasına rağmen büyük bir veri tabanında böyle küçük bir değişiklik için bile binlerce kayıdı güncellemek gerekir. İkinci Normal Form: Birinci normal formda tekrarların ne tür sorunlara neden olduğunu öğrendik şimdide bu sorunları çözmek için birinci normal formdaki tabloyu başka normal tablolara bölmeliyiz. Fonksiyonel bağımlılık göz önünde bulundurularak tablolar bölünmelidir. Bölünen tablolardan birinin birincil anahtarı ile bölünen diğer tablodaki birncil olamayan bir alan arasında bağımlık varsa buna tam bağımlılıkta denir; bu duruma ikinci normal form denilir. ikinci normal formda da satır ekleme ve silme sorunları ortaya çıkıyor. Satır ekleme sorunu: Müşteri tablosuna bir il eklemek istediğinizde mantıken bir müşteri eklemek gerekir. 2
Normalleştirme ve Uygulaması Satır Silme Sorunu: Müşteri silindiğinde (Örn: Gökmen İmamoğlu) müşterinin oturduğu şehir ve şehirle ilgili plaka verisi de silinebilir Bu sorunları Düzeltmek için Üçüncü Normal form uygulanır. Üçüncü Normal Form İkinci Normal Form yapısındaki Tabloların Fonksiyonel bağımlılık içermese de alt tablolara bölünmesinden elde edilir. 3
Master-Detail Form Oluşturmak: Beyaz eşya satışı yapan bir firmanın sattığı ürünler için fatura kesme işleminde kullanılacak bir veritabanı yapısı oluşturulmak istenmektedir aşağıdaki örnekte bu işe yarayan bir veritabanının nasıl hazırlanacağı adım adım anlatılmaktadır. İlgili veritabanının şematik yapısı ve ilişki diagramı Şekil 1. de gösterilmektedir. Şekil 1. Veritabanının Şematik Yapısı. Öncelikle veritabanında yer alan tabloları aşağıdaki bilgiler ışığında tanımlamamız gerekir 1) Müşteri Tablosu tblmusteri MusteriID Adi Text 25 Soyadi Text 25 Adresi Text 250 TelefonNumarası Text 15 InputMask: \(999") "000\ 00\ 00;;_ Eposta Text 50 Şekil 2. Müşteri Tablosu 4
Şekil 3. Müşteri Verileri 2) Ürün Tablosu tblurun UrunID Adi Text 50 Kodu Text 50 Fiyati Currency Format: #,##0.00" TL";-#,##0.00" TL" Şekil 4. Ürün Tablosu Şekil 5. Ürün Verileri 5
3) Fatura Tablosu tblfatura FaturaID MusteriID Adres Text 250 Tarih Date/Time InputMask: 00/00/0000;0;_ FaturaNumarasi Text 10 Şekil 6. Fatura Tablosu 4) Fatura Detay Tablosu tblfaturadetay FaturaDetayID FaturaID UrunID Adet 1) Birinci adımda master-detail türünde bir ilişkinin bulunduğu tblfatura ya müdahale edeceğiz. İlk değişikliği bu tablodaki MusteriID alanının, Caption (Başlık) ve Default Value (İlk değer) özelliklerinde yapıyoruz. MusteriID Caption ına Adı Soyadı bilgisini giriyoruz ve Default Value 0 ı siliyoruz ve bu sayede bir ilk değer görüntülenmesini engellemiş oluyoruz (Bknz: Şekil 7). 6
Şekil 7. Caption ve Default Value değişikliği MusteriID Caption ına Adı Soyadı bilgisinin girilmesi ile bundan sonra Tabloda MusteriID ifadesinin Görünmesi Yerine Adı Soyadı Bilgisinin Görünmesini Sağlamış oluyoruz ve Dolayısıyla bundan sonra yaratacağımız tüm Rapor, Form ve Sorgularda Listeleme Anında başlık olarak girdiğimiz Başlık Metni görüntülencektir. (Önemli not: Sorgularda başlıkta görülen değil Tablonun tanımında kullanılan hali ile alan ismi kullanılmalıdır Örneğin: Yanlış : SELECT Adı Soyadı, Adresi,Tarih FROM tblfatura Doğru: SELECT MusteriID, Adresi,Tarih FROM tblfatura ) 2) İkinci Adım olarak MusteriID alanında iken Lookup (Arama) tabına geçiyoruz. Bu alanda öncelikle Display Kontrol kutucuğundaki Text Box tanımını Combo Box haline getirmemiz gerekmektedir. 7
Daha sonra Row Source satırına SELECT Adi, Soyadi, MusteriID FROM tblmusteri SQL komutunu giriyoruz Yaptığımız bu işlemle Fatura tablosunda MusteriID alanına veri girmek istediğimizde müşterilerinin ID lerini (örn : 1, 5, 200) yazmak yerine yaptığımız tanım sayesinde Müşterinin İsmini açılan listeden Seçip bu isimle özdeş MüşteriID sayısal verisini yazdığımız SQL Komutunun üçüncü (3) kolonundan Şekil 8. Bound Column 8
alıyoruz ve Bound Column a (İlişkili Sütun) bu nedenle 3 sayısını giriyoruz. Bound Column a 3 değerini girdiğimizde veritabanına şu komutu vermiş oluyoruz; tabloya veri girerken ismini listeden seçtiğim kişinin ID sini bul ve bu ID değerini fatura tablosundaki MusteriID alanına sayısal olarak yaz. Ancak listeleme durumu için Column Counta 2 değerini verdiğimizde bu SQL Cümlesinden dönen sonuçlardan sadece ilk iki kolondaki verileri metin olarak yani Adı Soyadı olarak Listele demiş oluyoruz. Şekil 9. Veri Giriş ve Sonuç Listesi Dikkat edilecek olursa yukarıdaki Şekil 9 da veri girerken listeden isim soyad seçilmiş olmasına rağmen kayıt girildikten sonra tblonun genel listesinde sadece adı alanı görüntülenmektedir bu durumu düzeltmek için Fatura tablosundaki MusteriID alanında küçük bir değişiklik gerekmektedir. Bu değişiklik Şekil 10 da gösterilmektedir. Row source kutucuğundaki SQL cümlesinde bir alan birleştirme işlemi 9
Şekil 10. Alan Birleştirme uygulanmaktadır. Ancak bu işlem yapıdıktan sonra Adı ve Soyadı alanları tek bir alan haline gelmiş oldukları için listlenen kolon sayısı değişmiştir bu nedenle MuşteriID nin listelem sırası olan 2 Row Source alanına değer olarak verilmeli ve listelenecek kolon sayısı bilgisi içinse sadece ilk kolonu listelemek için 1 değeri girilmelidir.bu düzeltmeler yapıldıktan sonra Fatura tablosu durumu aşağıdaki şekilde verilmiştir. Şekil 11. Düzeltmeden Sonraki Durum 10
Form Oluşturmak: Form oluşturmak için öncelikle Form Tabına geçmeliyiz. Create Form by using wizard komutunu verin. Komutu verince aşağıdaki dialog kutusu karşınıza çıkacaktır. Table/Queries Listesinde tblfatura tablosu seçili iken Available Field Listesinden MusteriID, Adres, Tarih ve FaturaNumarası alanlarını sağ tarafa aktarın FaturaID solda kalsın. 11
işlemden sonra dialogun durumu yukaradaki gibidir. Bu işlemden sonra Tables/Queries alanında tblfaturadetay tablosunu seçin bu durumda dialog aşağıdaki gibi görünecektir. Burda bilinmesi gereken ilk seçilen tblfatura nın Master tblfaturadetay ın Detail olduğudur. Ayrıca tblfaturadetay dan alanları sağa atarken Master tablonun (bu örnekte tblfatura) Primary Key alanıyla aynı isimli alanı sağ tarafa aktarmamalıyız. Master tablonun Primary Key ile Detail Tablodaki Foreign Key arasında kurduğumuz ilişki nedeni ile bir bağlantı vardır. Bu nedenle eklediğimiz her detay veriye aktif faturanın FaturaID si otomatik olarak eklenir. İşlemi uyguladıktan sonra dialog aşağıdaki gibi görünmelidir. Ekran bu halde iken Next tuşuna basılır. Bu komut verildikten sonra dilaog aşağıdaki gibi görünür. 12
Ekran görüntüsü böyle iken Next tuşuna basılır. Ekran da seçenekler belirir datasheet bu işlem için uygun bir seçenektir. Bu durumda Next tuşuna basılır. Form için uygun bir stil seçilir ve Next tuşuna basılır. Aşağıdaki Dialog kutusunda Form alanında İsmi frmfatura ve Subform alanına frmfaturadetay Subform yazın ve Finish tuşuna basın. 13
Şonuç aşağıdaki gibidir. 14