21 Şubat 2014 Cuma

Delphi XE5 - ClientDataSet İki Stun işlemelerini Tek Sütun'a Yazdırma


   ClientDataSet' te yapabileceklerinizden biride iki sutunun arasındaki 4 işlemi tek bir stuna yazdırabilme olanağınızın olması. Bu işlem basit kodlama ile çok kullanışlı uygulamalar geliştirebilirsiniz. Bu yazı ile birlikte bakkal uygulamasınında sonuna geleceğiz. Tabi ki ClientDataSet yazılarının sonuna değil. ClientDataSetle ilgili ilerleyen yazılarda daha pratik kodlamalar anlatacağım. İlk yazılar daha çok algoritma mantığını kavramak içindi. Şimdi ise bir üst levele geçebiliriz. Bileşenin bize hazır verdiği fonksiyonları kullanarak daha etkin kendi fonksiyonlarımızı üretebiliriz.


  Örneğin bu yazımızda toplama fonksiyonunun daha pratik bir versiyonunu göreceğiz. İsterseniz ilk önce bakkal uygulamamızın son haline bakarak neler yapacağımızı anlatayım.


 Uygulamaya bir adet toplam sütunu ekledim. Bu sütun da fiyat ve adetin çarpımları bulunuyor. Yeni tanımlayacağım toplama fonksiyonuyla bu kolonun toplamını label1.caption ' a yazdıracağım. İlk önce toplam sütununun oluşturulmasına gelelim. Bu sütun diğer sütunların işlemlerinden oluşacağı için sütun tipi data değilde calculated olacak.


  Daha sonra ClientDataSet sınıfının bize hazır olarak sunduğu OnCalculateFields olayını tetikleyeceğiz.


  Artık sütunlar arasında istediğimiz matematiksel işlemleri yaptırabiliriz. Örneğin ben iki sütunun çarpımını aldırdım.

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
   ClientDataSet1toplam.Value := ClientDataSet1fiyat.Value * ClientDataSet1adet.Value ;
end;

  Sizde istediğiniz bir işlemi yaptırarak verimli sonuçlar elde edebilirsiniz. Örneğin kdv li fiyat hesaplatabilir yada indirimli fiyatını buldurabilirsiniz. Şimdi de sütunun toplamını almak için yeni bir toplam fonksiyonu tanımlayacağım. Fonksiyon oluşturma kurallarını diğer yazılarda yazdığımdan buraları daha hızlı geçeceğim.

  Bu yeni fonksiyonda ClientDataSet 'in kendi fonksiyonu olan first komutunu kullanacağım böylece for döngüsü yerine while not ... eof do  döngüsünü kullanarak sonuca daha az kodlamayla ve daha hızlı gideceileceğim.

function topla2(clientdataset:tclientdataset; fieldname:string):real;
var
toplam: double;
begin
  toplam := 0;
   clientdataset.First;
    while not clientdataset.Eof do
     begin
        toplam := toplam + (clientdataset.FieldByName(fieldname).value);
        clientdataset.Next;
     end;
 Result := toplam ;
end; 

 Olası bir hata çıkmaması için hata kontrollerini yapmam lazım. Fonksiyona bakınca ne gibi bir hata ile karşılaşabilirim. Eğer ClientDataSet 'te hücre boş yani null değeri varsa fonksiyon bu değeri kullanamadığı ve toplayamadığı için bize hata verecektir. Bu yüzden hücre kontrolünü yaptıktan sonra toplama işlemini yaptırmalıyız.

 Bunun için if koşul metodunu kullanalım. Eğer hücre de istediğimiz değer de bir değişken varsa ya da null yani boş değilse toplama işlemini yapsın.

if not (clientdataset.FieldByName(fieldname).isnull) and (clientdataset.FieldByName(fieldname).Value <> 0) then

While not ... eof do döngüsünü arabul fonksiyonu içinde içinde tekrar düzenlersem

function arabul(clientdataset:tclientdataset;nerede:string; combobul:tcombobox):boolean;
begin
if not (combobul.Text = null) and (combobul.Text <> clientdataset.FieldByName(nerede).Value) then
begin
 clientdataset.First;
    while not clientdataset.Eof do begin
       repeat
         clientdataset.Next;
         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;
    end;
end
else
begin
   ShowMessage('Aranan ürün yok');
end;
 Result := true;
end;

Toplam fonksiyonu için düzenlersem

function topla2(clientdataset:tclientdataset; fieldname:string):real;
var
toplam: double;
begin
if not (clientdataset.FieldByName(fieldname).IsNull) and (clientdataset.FieldByName(fieldname).Value <> 0) then
begin
  toplam := 0;
   clientdataset.First;
    while not clientdataset.Eof do
     begin
        toplam := toplam + (clientdataset.FieldByName(fieldname).value);
        clientdataset.Next;
     end;
  end
else
begin
Result := 0;
end;
 Result := toplam ;
end;

Eğer ekle butonuna bastığımızda edit değeri integer olamdığı için hata versin istemiyorsak yine koşul metodu if ile bu hatayı istediğimiz yönde düzeltmeliyiz.

procedure TForm1.Button2Click(Sender: TObject);
var bosedit:string;
begin
if not (Edit1.Text <> null) and (edit1.Text = 'Adet')then
begin
ClientDataSet1.Insert;
ClientDataSet1ürün.Value := ComboBox1.Text;
ClientDataSet1fiyat.value := ClientDataSet2fiyati.Value;
ClientDataSet1adet.text := edit1.Text;
ClientDataSet1.Post;
end
else
edit1.Text := '1';
ClientDataSet1.Insert;
ClientDataSet1ürün.Value := ComboBox1.Text;
ClientDataSet1fiyat.value := ClientDataSet2fiyati.Value;
ClientDataSet1adet.text := edit1.Text;
ClientDataSet1.Post;
end;

  Artık uygulamamızın sonuna yaklaşmak üzereyiz şimdi de ürünlerimizi eklemek için ürün ekle formu oluşturalım ve popupmenü ile bu formu ana formumuza bağlayalım.



   Formların birbirini kullanabilmesi unitleri bağlamamız lazım. İsterseniz yukardaki resimdeki gibi direk bağlayabilirsiniz. İstersenizde Ana Formumuza

implementation

{$R *.dfm}

altına

uses ürün; //kodunu ekleyebilirsiniz.

  ürün formumuza da:

implementation

{$R *.dfm}

altına

uses bakal; //kodunu ekleyebilirsiniz.

Popmenümüzle formlar arasında geçiş yapalım.



procedure TForm1.rnEkle1Click(Sender: TObject);
begin
form2.ShowModal;
end;

  Popup menünün ekle butonuna form2 ye geçişide ekledikten sonra ürün formumuzdaki ClientDataSet bağlantılarını yapalım


  Artık hazır bakkal uygulamamız. Sizde bu küçük uygulamayı daha da geliştirerek yeni özellikler katabilirsiniz. Örneğin deterjanları kategoriklere ayırıp değişik deterjan markaları için değişik fiyat listeleri oluşturabilirsiniz. Yada veri tabanına ürün miktarlarını ekleyip her satış yapıldığında elde olan ürün miktarindan satılan miktari çıkararak ne kadar ürününüz kaldı hesaplayabilirsiniz. Yada tarih sütunu ekleyerek her satışı kaydedip, belli saatler arasını filtreleyerek satıraları saydırırsanız gün içinde yada hafta içinde en çok satışın olduğu zamanı ve en çok satışın sayısını bulabilirsiniz.

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