24 Mayıs 2011 Salı

Sql'de İlişkili Tablolarda Güncelleme(Update-Join)

Sql'de update işlemleri yaparken, şu ana kadar hep tek tablo üzerinden yaptık. Peki, birbiriyle ilişkili birden fazla tabloda update işlemi yaparsak nasıl bir yol izleyeceğiz?

Cevap oldukça basit. Biz yine de daha anlaşılır olması bakımından, senaryo üzerinden gidelim. İki tablomuz olsun. Öğrenci tablosunda Numara ve Ad tutulsun, Not tablosunda da ÖgrenciNo ve Puan tutulsun.

create Table Ogrenci
(
       OgrenciNo int,
       OgrenciAd nvarchar(20)
)
create Table Puan
(
       OgrenciNo int,
       Puan int
)

OgrenciNo alanı, Ogrenci tablosunda PrimaryKey iken, Puan tablosunda ForeignKey'dir. Böylece iki tabloyu ilişkilendirmiş olduk.

Birkaç kayıt girdikten sonra senaryomuz şöyle olsun. İsmi Ahmet Demir olan öğrencinin Puanını 50 yapalım. Gördüğünüz gibi tek tabloda update işlemi yapıyor olmamıza rağmen, verilen koşul başka bir tabloda. Burada iki tabloyu join ile birleştirip, ardından update işlemini yapacağız. Yazmamız gereken kod şu şekilde olmalıdır.

update Puan set Puan=50 from Puan p join Ogrenci o on p.OgrenciNo=o.OgrenciNo where OgrenciAd='Ahmet Demir'

Gördüğünüz üzere, syntax olarak, select ile yapılan joinleme işlemine çok benzer. select * from Puan ile başlayan joinleme sorgumuz, burada update Puan set Puan=50 from Puan olmuştur. Sorgu sonucunda, ismi Ahmet Demir olan öğrenci/öğrenciler 'in aldığı puanlar 50 olarak güncellenmiştir.

18 Mayıs 2011 Çarşamba

Windows Formlarda Custom Control

Windows Formlar uzerinde uygulama gelistirirken, bazi durumlarda kendi kontrollerimizi oluşturmak isteriz. Örneğin, uygulamanızdaki tüm TextBox'lar sadece nümerik değerler girilmesi isteniyorsa, yapmamız gereken tüm textbox'lar için ayrı ayrı kod yazmak. Daha sonra değişiklik istendiğinde de 30 textbox varsa, 30'unda birden tekrar değişikliği gerçekleştirmek gerekecek. Bir kod kendini gereksiz yere, fazlasıyla tekrar ediyorsa şunu bilmeliyiz ki, o kod yanlıştır. Şimdi bu örnek için kendi TextBox'ımızı yaratıp, tüm sayfalarda bu TextBox'ı sürükleyip bırakarak, gereksiz kodlamanın önüne geçmiş olacağız.


Kodlamaya gelirsek, düşünmemiz gereken şey, oluşturucağımız TextBox'ın, TextBox sınıfından kalıtılması olmalıdır, çünkü tüm özellikleri normal TextBox ile aynı olacak. Sadece ekleyeceğimiz şeyler olacak. 


O zaman uygulamamıza yeni bir class ekleyip, onu TextBox sınıfından kalıtalım.


class NumericTextBox:TextBox

Daha sonra NumericTextBox sınıfının constructor'ında, senaryomuzu yerine getirecek eventi bulup, onu tetikliyoruz. Bu örnek için, nümerik karakter haricinde başka bir karakter girilmesin, sadece nümerik karakterlerin girişine izin verilmesini istiyorsak, kullanacağımız event KeyPress eventi olmalıdır. Bu eventi tetikledikten sonra, girilmesini istemediğimiz karakter kodlarını girip, programımızı çalıştıracağız. Yazacağımız kod şu şekilde olacaktır;

class NumericTextBox:TextBox

    {
        public NumericTextBox()
        {
            this.KeyPress += new KeyPressEventHandler(NumericTextBox_KeyPress);
        }

        void NumericTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !char.IsNumber(e.KeyChar) && !char.IsControl(e.KeyChar); //rakam degilse giris yapamasin ve backspace,delete tarzi kontrollere de izin verilmesin
        }
    }

Şunu da hatırlamakta fayda var. Oluşturacağımız bir class'ı, herhangi bir kontrolden kalıttığımız zaman, bu classın(yani yeni kontrolümüzün-custom control-) toolbox'da en yukarıda oluşacağını hatırlatmakta fayda var.



Uygulamamızı çalıştırdığımız zaman göreceğiz ki, oluşturduğumuz TextBox'ın, diğer TextBox'lardan görünüm ve görev bakımından hiçbir farkı yok, ekstra olarak sadece rakamlara ve delete,ctrl,backspace tarzı kontrollere izin verecektir. Artık, tüm sayfalarımızda, bu TextBox'ı sürükleyip bırakarak rahatça erişebileceğimiz gibi, değişiklik yapmak istediğimiz zaman da tek bir yerden düzeltmelerimizi yapabileceğiz.