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

Rob*_*ood 6 delphi tclientdataset

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

Select Sum(column1) from table1 where Date_Column < Date_Value
Run Code Online (Sandbox Code Playgroud)

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

Sum(column1)
Run Code Online (Sandbox Code Playgroud)

并生成Date_Column索引,然后像这样过滤clientdataset:

myClientdataset.SetRang([value1],[value2]);
Run Code Online (Sandbox Code Playgroud)

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

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

Wod*_*dzu 8

也许这个链接会有所帮助:分组和聚合

编辑:

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

我做了一个示例项目.

首先,没有过滤的聚合:

聚合而不过滤

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

通过过滤进行聚合

这是你想要的效果吗?

请注意,我无法通过使用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);
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助到你:)