【问题标题】:Delphi: How to aggregate just the ranged records in TClientDataset?Delphi:如何仅聚合 TClientDataset 中的范围记录?
【发布时间】:2011-09-29 10:24:30
【问题描述】:

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

Select Sum(column1) from table1 where Date_Column < Date_Value

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

Sum(column1)

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

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

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

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

【问题讨论】:

    标签: delphi tclientdataset


    【解决方案1】:

    也许这个链接会有所帮助: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);
    

    请注意,在过滤器中,您可以轻松更改条件以获得与 SetRange 相同的结果。不过,我听说 SetRange 过滤数据的速度更快。

    希望对你有帮助:)

    【讨论】:

    • 谢谢,但很无奈:(它没有提到如何“范围”和聚合该范围
    • 所以如果我理解正确的话,你想先按某些条件过滤行,然后对 filteretd 行进行分组?
    • 我想聚合 filteretd 行
    • 或任何想法如何获取内存中数据集字段的(总和)。当然不使用 for 循环。
    • 啊哈!我没有用 FILTER 尝试它,它可以做同样的工作,而且效果很好,感谢您的帮助,不胜感激 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多