20 Şubat 2014 Perşembe

Delphi XE5- ClientDataSet Arama Bulma Fonksiyonu


   Fonksiyon yazmaya alıştıkça kendi işini artık kendiniz çok rahat görmeye başlayabilirsiniz. Birçok ücretli bileşen mevcut ama siz de küçük fonksiyonlarla ihtiyacınız olan özellikleri elde edebilirsiniz. Bu yazıda ClientDataSet içerisinde arama yapma fonksiyonunu anlatacağım. Bu fonksiyon algoritmasını anlayarak başka bileşenlere de entegre edebilirsiniz.



  Öncelikle bir önceki yazıdaki bakkal  uygulamsına neler eklemiştik bir bakalım. İkinci yaptığımız ClientDataSet ile artık ürünlerimizi form oluştuğu anda Combobox 'ta görebiliyoduk. Fakat bu değildirki ComboBox 'tan seçtiğimiz ürünü ClientDataSet 'te seçebiliyoruz. Henüz seçtiğimiz ürünü ve fiyatını veritabanından çağıramıyoruz fakat bunu Ara ve Bul getir fonksiyonu ile artık yapabilicez ve ana veritabanımıza bilgileri ekleyebileceğiz. Bu olay SQL de tabloları birbirine bağlamaya biraz benzeyebilir.


  Şimdi fonksiyonumuzu oluşturmaya başlayalım. Daha önceki yazılardan aşina olduğunuz gibi ilk önce fonksiyon kalıbımızı oluşturuyoruz. Daha sonra fonksiyonda kullanacağımız bileşenleri (parametreleri) tanımlıyoruz.

function arabul(clientdataset:tclientdataset; nerede:string; combobul:tcombobox):boolean;

  İkinci olarak ne yapacağını algoritmik olarak bir sıralayalım.

1. clientdatasettin sonuna kadar gezin (for döngüsü)
2. istediğim değeri ara (combobox.text)
3. eğer bulursan dur.
4. clientdatasetin sonuna kadar gittin bulamadın başa dön tekrar yap

 Eski yazıladan bu işlemlerin nasıl yapıldığını az çok anlamışsınızdır. Şimdide tam kodlamaya bir göz atalım.

function arabul(clientdataset:tclientdataset;nerede:string; combobul:tcombobox):boolean;
var i:integer;
begin
   for i := 1 to ClientDataSet.RecordCount do
     begin
       repeat
           ClientDataSet.Next;
           ClientDataSet.Edit;
           ClientDataSet.post;
         if ClientDataSet.RecNo = ClientDataSet.RecordCount  then ClientDataSet.RecNo := 1;
       until(ClientDataSet.FieldByName(nerede).Value = combobul.Text ) ;
     if ClientDataSet.FieldByName(nerede).Value = combobul.Text then break;
 Result := true;
 end;
end;

 Bu fonksiyonda daha öncekilerde olmayan

  ClientDataSet.Next;  //clientsette bir kayıt ilerlemek için
  ClientDataSet.Edit;  //bir kayıt ilerledin içeriğe ulaş gerekirse değiştir
  ClientDataSet.post;  //içeriği kabul et

 Eğer bu kodlamayı koymazsak fonksiyonumuz insert edit hatası verecektir. Hücre içinde işlem yapıyorsak bu kod bloğunu koymamız lazım.

 Bu fonksiyon da veritabanında gezinmek için for döngüsü yerine repeat ... until döngüsü kullandık çünkü gezintimiz koşulumuzu sağladığında bitmesi gerekmektedir.

 Artık fonksiyonumuz hazır bunu kullanacağımız örneğe bir göz atalım.

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
arabul(ClientDataSet2,'ürün',ComboBox1);
end;

Bu şekilde ComboBox 'ta girdiğimiz değeri clientdatasetimizde bulacaktır. Peki bunu uygulamada ne için kullandım derseniz. Yaptığım olay ürünümü veritabanında bulup fiyatını almak içindi. Şimdi Comboboxa ürünü girdiğimizde fiyatıda hemen dbEdit 'te gözükecektir.

 Bazılarınız bu olayı filtreleme yöntemi ile kolayca yapılabileceğini düşünebilir. Tabiki yapılabilir, fakat filtreleme yöntemi kullanıldığında karşımıza sadece tek bir değeri getirecektir. Bu da veritabanında başka işlem yapamamıza neden olacaktır. Yani eğer filtreleme olarak şöyle kullansaydık.

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
ClientDataSet2.Filtered:=true;
ClientDataSet2.Filter := 'ürün =' + QuotedStr(ComboBox1.Text+'%');
end;

 Filtrelemeyi tekrar false yapamadığımız için veritabanımızda sadece tek bir ürün seçili kalacaktı. Eğer Combobox' ın OnChangeClose olayı olsa belki oraya

ClientDataSet2.Filtered:=false;

ekleyebilirdir.

 Peki arabul yaptık şimdi sırada ne var?





 Ekle butonu ve temizle butonumuzu kodlayacağız. Ekle butonuyla artık ürün veritabanımızdan seçtiğimiz ürünü ve fiyatını anaveritabanımıza ekleyebiliriz. Ekle butonuna bastığımızda ürünü fiyatını ve adetini eklemek istiyoruz bunun için ilgili kodlar:

procedure TForm1.Button2Click(Sender: TObject);
begin
     ClientDataSet1.Insert;
     ClientDataSet1ürün.Value := ComboBox1.Text;
    ClientDataSet1fiyat.value := ClientDataSet2fiyati.Value;
    ClientDataSet1adet.text := edit1.Text;
    ClientDataSet1.Post;
end;


Temizle butonumuzu işe yine bir algoritma mantığıyla yapmak durumundayız. Çünkü ClientDataSet' te henüz bütün veritabanını demizleyecek kodu bulamadım. ClearField özelliği olmasına karşın sadece bir satırı temizliyor. Bende bütün satırları tek tek temizleme algoritması kullanmaya karar verdim.

procedure TForm1.Button3Click(Sender: TObject);
var
  i: Integer;
begin
for i := 1  to ClientDataSet1.RecordCount do
begin
ClientDataSet1.Edit;
ClientDataSet1.Delete;
ClientDataSet1.Post;
end;
end;

  Bir sonraki yazıda da iki kolon çarpımını tek kolona yazdırmayı anlatacağım. Böylece fiyat ve adeti çarpıp başka bir kolonda gösterebileceğim. Toplam ve Ortalama fonksiyonlarını da bu kolona uygulayıp bakkal programını sonlandıracağım.

Okuduğunuz İçin Teşekkür Ederim
Hakan UÇAR
İstatistikçi ve Amatör Programcı
İçerikler Tamamen Ücretsiz Olup Özgün Anlatımdır Paylaşırken Kaynak Belirtiniz Lütfen.

Uygulamayı Yandex Diskimden indirebilirsiniz.
 ClientDataSet Ara Bul algoritması





0 yorum:

Yorum Gönder