2011-07-06 28 views
5

Tôi cần thực hiện một số tổng hợp bằng cách sử dụng TClientdataset. Trong SQL những uẩn có thể được thực hiện với kịch bản như thế này:Delphi: Làm thế nào để tổng hợp các bản ghi chỉ trong TClientDataset?

Select Sum(column1) from table1 where Date_Column < Date_Value 

Bởi vì tôi cần tốc độ nhanh hơn trong suốt một quá trình rất dài và một mạng lưới rất chậm, tôi muốn sử dụng trong bộ nhớ tập hợp thay vì sử dụng sql. Ý tưởng của tôi là thêm một tổng hợp để các ClientDataset với Expression như thế này:

Sum(column1) 

Và chắc Date_Column chỉ số, sau đó lọc clientdataset như thế này:

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

Tôi đã chờ đợi để xem kết quả tổng hợp của phạm vi này, nhưng, tiếc là tổng hợp bỏ qua phạm vi và tiếp tục đưa ra kết quả của tất cả các bản ghi!

Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể đạt được điều này trong TClientdataset? Hoặc, bạn có bất kỳ ý tưởng khác làm thế nào để làm ranged-aggregates trong bộ nhớ?

Trả lời

7

Có lẽ liên kết này sẽ rất hữu ích: Grouping and Aggregates

Edit:

Tôi nghĩ rằng tôi đã có nó, nó đã cho tôi khá thời gian và đó là một kinh nghiệm bực bội;)

tôi đã thực hiện một dự án mẫu.

Đầu tiên, một tổng hợp mà không cần lọc:

Aggregate without filtering

Thứ hai, một tổng hợp sau presing một nút:

Aggregate with filtering

Đây có phải là là hiệu ứng mà bạn muốn?

Xin lưu ý rằng tôi không thể đạt được hiệu ứng này khi sử dụng SetRange(), tôi đã sử dụng thuộc tính Bộ lọc thay thế.

Làm thế nào để đạt được:

  1. Tạo một chỉ mục trên một số lĩnh vực, GroupingLevel phải 0.
  2. cài đặt mà chỉ như một tài sản của TClientDataset.IndexName.
  3. Tạo tổng hợp với GroupingLevel = 0 và Expression như SUM (YourFieldName), trong trường hợp của tôi là SUM (Dân số).
  4. Trong thuộc tính IndexName ghi chỉ mục mà bạn đã tạo.
  5. Thiết lập tổng hợp thành hoạt động trong designtime, (thiết lập nó trong thời gian chạy dường như không hoạt động).

Mã của tôi sau khi nhấn một nút:

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

Xin lưu ý rằng trong Lọc bạn easly có thể thay đổi điều kiện để đạt được kết quả tương tự như đối với SetRange.Tuy nhiên, tôi đã đọc rằng SetRange nhanh hơn trong việc lọc dữ liệu.

Hy vọng nó sẽ giúp :)

+0

Cảm ơn bạn, nhưng nó không nơi nương tựa :(Nó không đề cập đến làm thế nào để “tầm” và tổng hợp mà phạm vi –

+0

Vì vậy, nếu tôi hiểu bạn một cách chính xác, bạn muốn để hàng lọc đầu tiên của một số điều kiện và nhóm các hàng filteretd – Wodzu

+0

Tôi muốn tổng hợp các hàng filteretd –

Các vấn đề liên quan