我需要使用 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中实现这一目标?或者,您是否有任何其他想法如何在内存中进行远程聚合?
答案 0 :(得分:8)
也许这个链接会有所帮助:Grouping and Aggregates
修改强>
我想我已经拥有它,它花了我很多时间,这是一个令人沮丧的经历;)
我做了一个示例项目。
首先,没有过滤的聚合:
第二,按下按钮后的聚合:
这是你想要的效果吗?
请注意,使用SetRange()无法实现此效果,我使用了Filter属性。
如何实现:
按下按钮后的代码:
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在过滤数据方面更快。
希望有所帮助:)