19 Şubat 2014 Çarşamba

Delphi XE5- ClientDataSet Kolona Göre Filtreleme


   ClientDataSette bazen sadece bir kolon için değilde birden çok kolon için filtre uygulamak isteyebilirsiniz. Bunun için gelin birlikte bir fonksiyon yazmaya çalışalım. Yine konunun daha iyi anlaşılması için ClientDataSet Filter İşlemleri yazısında kullandığımız kodları ve uygulamayı kullanıcam. Fakat tabikide bu uygulama birazcık daha gelişmiş bir filtreleme olmuş olacak. Uygulama basit bir kişisel kayıt uygulaması şimdi yapacağımız filtrelemeyle ister adina göre ister soyadina göre istersek şehrine göre arama yapabileceğiz.


   Uygulama için gerekli kurulumu yapmak için ClientDataSet Kur ve Yönet yazısına bakabilirsiniz. Şimdi gelelim filtrelemeyi oluşturmaya. Filtreleme mantığında yaptığımız olay 'kelime Like' + QuotedStr(edit1.text+'%')' kelime kolonunda edit teki yazan kelimeyi arayıp getirmesiydi. Bu işlemi her kolon için yapmak meşakatli olacağından bu gibi durumlar da fonksiyonlar imdadımıza yetişmektedir. Gelin beraber fonksiyonu oluşturmaya başlayalım.

  Öncelikle gereken fonksiyon kalıbının yazılması olacaktır.

Function ...............;
begin
Result:='.........';
end;

  Şimdi fonksiyonumuzun adini verelim fonksiyona listele adını verelim ve bu fonksiyonda kullanacağımız parametreleri(yani değişmeyecek bileşenleri) girelim. Filtreleme işlemi yaparken kullanacağımız üç bileşen var. Bunlar

Parametreler:

tclientdataset
tcombobox
tedit

Parametrelerimizi kullanmak için onlara bir isim verelim

clientdataset
combofiltre
aranacak

Şimdide bunları birleştirerek fonksiyonumuzda yerine yazalım;

Function filter( clientdataset:tclientdataset; combofiltre:tcombobox; aranacak:tedit ):String;

Fonksiyonumuzu oluşturduk. Bundan sonraki adımda fonksiyonumuzun neler yapacağını gireceğiz. Öncelikle ne yapmak istiyoruz bunları bir yazalım.

1. Ne arıyoruz (Edit);
2. Hangi kolonda (combobox) arıyoruz;
3. Nasıl Bulacağız (Filtre);

var
ne , kolon : string;

Gerekli değişkneleri tanımladıktan sonra ne yapmak istediğimizi algoritmik olarak tasarladıktan sonra artık bunları kodlamaya geçebiliriz.

 ne := edit.text;
 kolon := combobox.text;
   clientdataset.Filtered := true;
   clientdataset.Filter := kolon+' like' +QuotedStr(ne+'%');

Yukarda yazdığımız 3 adımı artık kodlamış bulunmaktayız bundan sonrası artık bütün kodları birleştirmek.

function filter(clientdataset:tclientdataset;combofiltre:tcombobox;aranacak:tedit):string;
var
ne,kolon:string;
begin
  kolon:=combofiltre.Text;
  ne:= aranacak.Text;
    clientdataset.Filtered := true;
    clientdataset.Filter := kolon+' like' +QuotedStr(ne+'%');
  result:='İşlem tammdır';
end;

İşlemimiz tabiki de bitmedi şimdi de hata yakalamamız gerekiyo eğer bu kodu böyle kullanırsak hiç değer bulmaması halinde hata ile karşılaşmış olacağız. Çünkü yazacağımız değer her zaman olmayacaktır. Bunun içinde try.....except metodunu kullanacağız.

Try.....Except metodu kısaca şunları yap şunu bekle, eğer beklediğin gerçekleşirse şunu yaptır. Bizde edit teki kelimeyi arayacağız ama bulamamsınıda bekleyeceğiz eğer bulmazsa bize bir uyarı mesajı versin.

try
.
.
.
except
  if   clientdataset.Filter <> kolon+' like' +QuotedStr(ne+'%') then 
        ShowMessage('İstenilen Değer Bulunmadı');
end;

   Şimdi bütün kodu yazacak olursak eğer:

function filter(clientdataset:tclientdataset;combofiltre:tcombobox;aranacak:tedit):string;
var
ne,kolon:string;
begin
try
    kolon:=combofiltre.Text;
    ne:= aranacak.Text;
      clientdataset.Filtered := true;
      clientdataset.Filter := kolon+' like' +QuotedStr(ne+'%');
except
       if clientdataset.Filter <> kolon+' like' +QuotedStr(ne+'%') then
               ShowMessage('İstenilen Değer Bulunmadı');
  result:='İşlem tammdır';
end;
end;

  Artık fonksiyonumuz hazır bunu uygulamamızda kullanabiliriz. Tek yapmamız gereken editin change olayına eskiden yazdığımız filter kodu yerine yeni tanımladığımız foksiyonu kullanmak olacaktır.

Örneğin:

procedure TForm1.Edit1Change(Sender: TObject);
begin
 filter(ClientDataSet1,ComboBox1,Edit1);
end;

  Yine bunu yazarsak belli bir tür hata ile karşılaşacağızdır. Çünkü eğer comboboxtan filtreleme türü seçmezsek vede arama yaparsak hata mesajı ile karşılacağızdır. Bunun önüne geçmek için önce editi kontrol edip sonra arama yapmamız gerekli.

procedure TForm1.Edit1Change(Sender: TObject);
begin
if ComboBox1.Text = 'Filtre'  then
begin
  ShowMessage('Filtreleme Türünü Seçiniz');
end
else
filter(ClientDataSet1,ComboBox1,Edit1);
end;

  Ben combobox1.text = 'Filtre' yazdım çünkü o yazmaktadır eğer boş bırakırsanız combobox'ın textini ' ' koymanız yeterli olacaktır.

 Son bir dipnot fonksiyon türünü string yaptığımızdan dolayı sinifi kolonunda arama yaparken sonucun string olmaması dolayısıyla hata mesajı gelmekte variant tipi değişken yaptığımda ise clientdatasetin hata verdiğini gördüm o yüzden sinifi kolonunu kullanamayabilrsiniz. Çözümü bulursam yine burdan yazarım.

Okuduğunuz İçin Teşekkür Ederim
Hakan UÇAR
İstatistikçi ve Amatör Programcı

Uygulamayı Yandex Diskimden indirebilirsiniz.

 ClientDataSet kolon filtreleme



0 yorum:

Yorum Gönder