2011-07-06 24 views
5

TClientdataset'u kullanarak bazı kümeler oluşturmam gerekiyor. SQL bu agrega böyle komut dosyası ile yapılabilir:Delphi: Sadece TClientDataset'te bulunan kayıtlar nasıl gruplanır?

Select Sum(column1) from table1 where Date_Column < Date_Value 

çok uzun süreç ve çok yavaş bir ağa sırasında daha fazla hıza ihtiyacımız Çünkü, hafıza in-yerine sql kullanmanın toplayan kullanmak istiyorum. Ben toplam sonucunu görmek için bekliyordum

myClientdataset.SetRang([value1],[value2]); 

: sonra böyle clientdataset filtre

Sum(column1) 

Ve Date_Column endeksi olun: Benim fikrim böyle İfade ile ClientDataset için bir toplamını eklemektir Bu menzil, ancak maalesef maalesef aralığı göz ardı ediyor ve tüm kayıtların sonuçlarını vermeye devam ediyor!

Yani, sorum şu: Bunu TClientdataset'te nasıl başarabilirim? Veya, bellekte aralıklı toplamaların nasıl yapılacağı konusunda başka bir fikriniz var mı?

cevap

7

Belki bu bağlantıyı yararlı olacaktır: Grouping and Aggregates

Düzenleme:;)

I ı bunu buldum

, bana oldukça zaman aldı ve sinir bozucu bir deneyim oldu örnek bir proje yaptı.

Birincisi, filtreleme olmadan bir agrega:

Aggregate without filtering

İkincisi, bir düğmeye bastırılarak sonra toplu:

Aggregate with filtering

bu mu istediğin etkiyi nedir?

SetRange() kullanımıyla bu etkiyi elde edemediğimi unutmayın, bunun yerine Filter özelliğini kullandım.

ulaşmak için:
  1. bazı alanında bulunan bir dizin oluşturun, GroupingLevel 0.
  2. Kurulum olması gerektiğini TClientDataset.IndexName bir özelliği olarak dizini.
  3. GroupingLevel = 0 ve SUM gibi ifade SUM (YourFieldName) ile bir grup oluşturun, benim durumumda SUM (Population) idi.
  4. DizinName özellikte, oluşturduğunuz dizini yazın.
  5. Agregatı çalışma zamanında etkin olarak ayarlayın, (çalışma zamanında ayarlama çalışmadığı görülüyordu). Bir düğmesine bastıktan sonra

Kodum:

cdsMain.Filter := 'Population <= 100'; 
    cdsMain.Filtered := True; 
    if not VarIsNull(cdsMain.Aggregates[0].Value) then 
    lblAggregatedPopulation.Caption := 'Aggregated population: ' + IntToStr(cdsMain.Aggregates[0].Value); 

tefriş SetRange için aynı sonucu elde etmek koşulu değiştirebilir Filtre unutmayınız.Ancak, SetRange'ın veri filtrelemede daha hızlı olduğunu okudum.

yardımcı olur :)

+0

teşekkür ederiz Umut, ancak çaresiz :(O nasıl “aralık” söz ve bazıları tarafından ilk filtre satırları o dizi –

+0

seni doğru anladıysam eğer Yani, istediğiniz toplamaz durum ve grup filteretd satırları? – Wodzu

+0

Ben filteretd satırları –