Delphi:如何只汇总TClientDataset中的远程记录?

时间:2011-07-06 08:37:22

标签: delphi tclientdataset

我需要使用 TClientdataset 制作一些聚合。在SQL中,这些聚合可以使用以下脚本完成:

Select Sum(column1) from table1 where Date_Column < Date_Value

因为我需要在很长的进程和非常慢的网络中获得更高的速度,所以我想使用内存中的聚合而不是使用sql。我的想法是使用Expression添加聚合到ClientDataset,如下所示:

Sum(column1)

制作Date_Column索引,然后像这样过滤clientdataset:

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

我期待看到这个范围的汇总结果,但是,不幸的是聚合忽略了范围并继续给出所有记录的结果!

所以,我的问题是:如何在TClientdataset中实现这一目标?或者,您是否有任何其他想法如何在内存中进行远程聚合?

1 个答案:

答案 0 :(得分:8)

也许这个链接会有所帮助:Grouping and Aggregates

修改

我想我已经拥有它,它花了我很多时间,这是一个令人沮丧的经历;)

我做了一个示例项目。

首先,没有过滤的聚合:

Aggregate without filtering

第二,按下按钮后的聚合:

Aggregate with filtering

这是你想要的效果吗?

请注意,使用SetRange()无法实现此效果,我使用了Filter属性。

如何实现:

  1. 在某个字段上创建索引,GroupingLevel必须为0.
  2. 将该索引设置为TClientDataset.IndexName的属性。
  3. 使用GroupingLevel = 0和像SUM(YourFieldName)这样的表达式创建聚合,在我的例子中,它是SUM(人口)。
  4. 在IndexName属性中写下您已创建的索引。
  5. 在设计时将聚合设置为活动状态(在运行时设置它似乎不起作用)。
  6. 按下按钮后的代码:

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

    请注意,在Filter中,您可以轻松更改条件以获得与SetRange相同的结果。但是,我已经读过SetRange在过滤数据方面更快。

    希望有所帮助:)