Delphi:如何仅聚合TClientDataset中的范围记录?

6

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

Select Sum(column1) from table1 where Date_Column < Date_Value

由于我需要在一个非常漫长的过程中获得更快的速度,而网络又非常缓慢,所以我想使用内存聚合而不是使用SQL。我的想法是向ClientDataset添加一个带有以下表达式的聚合:

Sum(column1)

把 Date_Column 设为索引,然后按照以下方式筛选 clientdataset:
myClientdataset.SetRang([value1],[value2]);

我原本期望看到这个范围的聚合结果,但是不幸的是聚合忽略了范围并且一直给出所有记录的结果!
所以,我的问题是:我如何在TClientdataset中实现这一点?或者,您有任何其他想法如何在内存中进行范围聚合?
1个回答

8
也许这个链接会有帮助:分组和聚合 编辑:
我想我已经懂了,它花费了我很长时间,让我感到非常沮丧 ;)
我做了一个示例项目。
首先,没有筛选的聚合: Aggregate without filtering 其次,在按下按钮后进行聚合: Aggregate with filtering 这是你想要的效果吗?
请注意,我无法使用 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);

请注意,在筛选器中,您可以轻松更改条件,以实现与SetRange相同的结果。然而,我已经阅读了SetRange在过滤数据方面更快的信息。希望这有所帮助 :)

1
谢谢,但是没什么用 :( 它没有提到如何“范围”和聚合该范围。 - Robin-Hood
所以如果我理解你的意思正确的话,你想先按某个条件过滤行,然后再对过滤后的行进行分组? - Wodzu
我想要聚合筛选后的行。 - Robin-Hood
有没有办法在内存中获取数据集字段的总和(Sum),而不使用for循环呢? - Robin-Hood
类似于 .Net 中的 LINQ,但仅针对数据集字段。 - Robin-Hood
1
啊哈!我没有尝试使用FILTER,它可以完成同样的工作并且运行良好,感谢您的帮助,非常感激 :) - Robin-Hood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接