6

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

Select Sum(column1) from table1 where Date_Column < Date_Value

因为在很长的过程和很慢的网络中我需要更快的速度,所以我想使用内存聚合而不是使用 sql 。我的想法是使用如下表达式向 ClientDataset 添加聚合:

Sum(column1)

并创建 Date_Column 索引,然后像这样过滤客户端数据集:

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

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

所以,我的问题是:如何在 TClientdataset 中实现这一点?或者,您还有其他想法如何在内存中进行范围聚合?

4

1 回答 1

8

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

编辑:

我想我明白了,我花了很长时间,这是一次令人沮丧的经历;)

我做了一个示例项目。

首先,没有过滤的聚合:

聚合而不过滤

二、按下按钮后的聚合:

聚合过滤

这就是你想要的效果吗?

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

如何实现:

  1. 在某个字段上创建索引,GroupingLevel 必须为 0。
  2. 将该索引设置为 TClientDataset.IndexName 的属性。
  3. 创建一个 GroupingLevel = 0 和像 SUM(YourFieldName) 这样的表达式的聚合,在我的例子中是 SUM(Population)。
  4. 在 IndexName 属性中写入您创建的索引。
  5. 在设计时将聚合设置为活动,(在运行时设置它似乎不起作用)。

按下按钮后我的代码:

  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 过滤数据的速度更快。

希望能帮助到你:)

于 2011-07-06T08:45:24.493 回答