22 Şubat 2014 Cumartesi

Delphi XE5- ClientDataSet Veri Guruplanması ve Sade Görünüm


    Verilerimizi indexleme komutunu göstermiştik. İndexleme işlemi yaparken aynı zamanda da aslında verilerimizi guruplama da yapmış oluyoruz. Bu yazıda gurupladığımız verilerin daha sade görünmesi için bir yöntem göstereceğim. Böylece aynı değerdeki veriyi daha sade göstermiş olacağız.

   Bunu  göstermek için bakkal uygulamasının birazcık daha gelişmiş bir versiyonunu yaparak resimler üzerinden göstereceğim. Diyelim ki bir veri tabanımız var ve sürekli tekrar eden değerler var. Örneğin marketinize gelen bilindik bir müşterileriniz var ya işletmenize diyelim. Bu müşterilerin aldıkları şeyler tekrar etmesine karşın müşteri isimleri hep aynı kalacaktır. Eğer biz müşteri isimlerini indexlersek ve guruplanmış verilerin sadece en üsütünde ki isimlerin kalmasını istersek hem daha sade bir görünüm elde eder hemde karışıklıklardan kurtlmuş oluruz.

 Peki bu uygulamamız da neler var?

 Öncelikle ClientDataSet'i başka bilgisayarlarda kullanabilmek için uses kısmına midaslib kütüpanesini eklemeliyiz.

uses midaslib;

Şimdi de form elemanlarını koyalım:

2 adet Clientdataset
2 adet buton
2 adet combobox
2 adet dbgrid
2 adet dbnavigatör
1 adet edit


ClientDataSet1

müsterino : integer;
müsteriadi: string;
müsterisoyadi: string;
islemtarihi: datetime;
tutar: currency;

ClientDataSet2

müsterino : integer;
müsteriadi: string;
müsterisoyadi: string;


  Uygulama çıktısında da görüldüğü gibi aynı müşterinin farklı zamanlarda yaptığı harcamalar görünmektedir. Ve bir çok tekrar eden değer bulunmakta. Daha önceki bakkal uygulamasında yaptığımız gibi müşteriler için ayrı bir veritabanı oluşturarak müşteri bilgilerini o tablodan çekmekteyim. Ha diyebilirsiniz ne gerek vardi müşteriadi ve müşterisoyadi için sadece ComboBox kullansan olmazmıydı. Tabi ki olurdu fakat uygulamayı biraz daha geliştirirseniz müşteriveritabanında sadece müşteri adi ve soyadindan ziyade yaşı cinsiyeti doğum tarihi gibi demografik değerleri de kaydetip, bu iki tabloyu  Master/Detail yapısıyla bağladığımızda aslında yapmakla ne kadar doğru birşey yaptığımızı anlıcaksınız.

  Daha önceki yazılarımda anlattığım filtereleme metoduyla comboboxları filtreleyip sadece istediğim değerleri almasını sağladım. Bunu yapmadan önce Listeleme Fonksiyonunu kullanarak müşteri veritabanımdaki değerleri ComboBox 'lara aktardım. Bunun ayrıntısını  Filter İşlemleri ve 2 Kolono Göre filtreleme yazılarında bulabilirsiniz. Hazır kodları aşağıda veriyorum:

function listele (clientdataset:tclientdataset; fieldname:string; comboliste:tcombobox):boolean;
var
i:integer;
begin
  for i := 1 to clientdataset.RecordCount do
    begin
      clientdataset.RecNo := i ;
      comboliste.Items.Add(clientdataset.FieldByName(fieldname).Value);
    end;
  Result:= true;
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
var i:integer;
begin
     ClientDataSet2.Filtered := true;
     ClientDataSet2.Filter := '[müsteriadi] like' + QuotedStr(combobox1.text + '%');
     ComboBox2.Clear;
     listele(ClientDataSet2,'müsterisoyadi',ComboBox2);
end;

procedure TForm1.ComboBox2Select(Sender: TObject);
begin
      ClientDataSet2.Filtered := true;
      ClientDataSet2.Filter := '[müsterisoyadi] like' + QuotedStr(combobox2.text + '%');
end;


  Bu bilgileri artık ekle butonumla ana veritabanıma aktaracağım:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientDataSet1.Insert;
  ClientDataSet1müsterino.text := ClientDataSet2müsterino.text;
  ClientDataSet1müsteriadi.text := ClientDataSet2müsteriadi.text;
  ClientDataSet1müsterisoyadi.Value := ClientDataSet2müsterisoyadi.Value;
  ClientDataSet1islemtarihi.text := DateTimeToStr(now);
  ClientDataSet1tutar.Text := edit3.text;
  ClientDataSet1.Post;
end;

 Artık Guruplama(indexleme) işlemine geçebilirim. Bunu yapmak için daha önce kullandığım komut olan

ClientDataSet1.IndexFieldNames := 'müsteriadi';

kullanılabilir. Fakat biz burda menü tuşlarını kullanarak daha pratik bir çözüm yolu göstereceğim. Daha sonra anlatacağım  ClientDataSet Aggregates için de zemin hazırlamış olacağım.


   ClientDataSet1 'i tıklayarak İndexDefs sağ tıklıyoruz ve additem diyoruz.


 Fields: guruplamayı yapacağımız sütun
 GroupingLevel: 1
 Name: istediğiniz bir ismi verebilirsiniz.

 Şimdi bu indexi ClientDataSet 'e uygulatmalıyız.


  İndexleme işlemimiz tamamdır şimdide birden çok hakan ismini yada şahin isminden sadece bir tanesini göstermesini yapalım. Bunun için Field nesnesinin OnGetText olayını kullanacağız. OnGetText olayı ile Field 'ların içindeki değerleri istediğimiz bir şekilde değiştirme imkanına sahibiz. Ama bu değildirki veri kaybolur. Sadece o field' ın uygulama başladığındaki görüntüsünü değiştirir. Veriler halen orda ve orjinal halindedir.


  Olaya yazacağımız kod:

 if gbFirst in ClientDataSet1.GetGroupState(1) then
   text := sender.AsString
 else
   text := ' ';

 Yaptığımız olay çok basit aslında veri guruplanan verinin ilk değeriyse aynen kalsın değilse boş göstersin. Bunu diğer gruplanmış Field 'lere yaparsanız görünümü:



   Şeklinde olacaktır. DBGrid ' de çift tıklayıp. Field 'ların titlelarını değiştirebilirsiniz. Bir sonraki yazıda ClientDataSet Aggregates özelliğini anlatacağı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.



0 yorum:

Yorum Gönder