TClientDataSet[11]: 分组统计_weixin_33795093的博客-程序员宝宝

技术标签: 数据结构与算法  


设计时实现的分组统计:

26153925_oAEN.gif

运行时实现的分组统计:

//前期只需要添加 ClientDataSet1、DataSource1、DBGrid1; 事件只需要关联窗体的 OnCreate

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, DBClient;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ClientDataSet1: TClientDataSet;
    procedure FormCreate(Sender: TObject);
  private
    procedure OnGetText_Agg1(Sender: TField; var Text: string;
      DisplayText: Boolean);
    procedure OnGetText_Agg2(Sender: TField; var Text: string;
      DisplayText: Boolean);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  { 关联数据控件 }
  DBGrid1.DataSource := DataSource1;
  DataSource1.DataSet := ClientDataSet1;

  { 先打开前面例子中留下的测试文件 }
  ClientDataSet1.LoadFromFile('C:\Temp\Test.xml');

  { 添加索引, 其中分组级别是 2 }
  ClientDataSet1.AddIndex('Index1', '班级;年龄', [], '', '', 2);
  { 给数据集指定此索引 }
  ClientDataSet1.IndexName := 'Index1';

  { 数据结构变化时一般需要先关闭数据集 }
  ClientDataSet1.Close;

  { 添加统计字段 Agg1: 按班分组统计语文总成绩 }
  with TAggregateField.Create(Self) do begin
    FieldName := 'Agg1';
    Expression := 'Sum(语文成绩)';
    IndexName := 'Index1';
    GroupingLevel := 1;
    Active := True;
    OnGetText := OnGetText_Agg1;
    DataSet := ClientDataSet1;
  end;
  { 添加统计字段 Agg2: 各班分别按年龄分组统计语文总成绩 }
  with TAggregateField.Create(Self) do begin
    FieldName := 'Agg2';
    Expression := 'Sum(语文成绩)';
    IndexName := 'Index1';
    GroupingLevel := 2;
    Active := True;
    OnGetText := OnGetText_Agg2;
    DataSet := ClientDataSet1;
  end;

  { 需要在 DBGrid 中显示的字段 }
  with DBGrid1.Columns do begin
    Add.FieldName := '班级';
    Add.FieldName := '姓名';
    Add.FieldName := '年龄';
    Add.FieldName := '语文成绩';
    Add.FieldName := 'Agg1';
    Add.FieldName := 'Agg2';
  end;

  { 打开数据集并激活统计 }
  ClientDataSet1.Open;
  ClientDataSet1.AggregatesActive := True;
end;

procedure TForm1.OnGetText_Agg1(Sender: TField; var Text: string; DisplayText: Boolean);
begin
  if gbLast in ClientDataSet1.GetGroupState(1) then
    Text := Sender.AsString else Text := '';
end;

procedure TForm1.OnGetText_Agg2(Sender: TField; var Text: string; DisplayText: Boolean);
begin
  if gbLast in ClientDataSet1.GetGroupState(2) then
    Text := Sender.AsString else Text := '';
end;

end.

 
 
 
 
 

 

 

  

转载于:https://my.oschina.net/hermer/blog/320824

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33795093/article/details/91787872

智能推荐

6G技术长啥样?5大趋势,13个核心技术2030年落地_人工智能学家的博客-程序员宝宝

来源:智东西5G已经展开了全面商用,随着5G在垂直行业的不断渗透,人们对于6G的设想也逐步提上日程。面向2030+, 6G将在5G基础上全面支持整个世界的数字化,并结合人工智能等技术的发展...

使用jsDelivr加速GitHub静态资源_JunYu_coding的博客-程序员宝宝

CDN解释CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。——百度百科为什么要使用他GitHub静态资源访问很慢,利用jsDelivr来加速它!由于各种因素,GitHub的速度总是差强人意。使用国内对象储存需要收费和备案,对非盈利性站点

hibernate一对多外键双向关联_一对多关联关系外键_aunlee的博客-程序员宝宝

public class Person { private Integer id; private String name; private String password; private Date birthday; private Set addressSet; get and set...}

Android项目---笑笑生活(生活休闲类)_菜鸟先飞1314的博客-程序员宝宝

一个Android 实战项目:项目集成了 新闻类数据,让用户可以在休闲之时可以浏览新闻,并且通过SharedSdk 实现了新闻数据的分享,同时还集成了笑话数据,让用户可以浏览一些小笑话。同时还包含了 天气预报以及 心灵鸡汤等功能。效果图:    基本框架搭建: 使用ViewPager+Fragment 搭建整个框架   BaseFragment:packag

Node.js后端开发 - 基础篇 #1 课程介绍与开发环境搭建_node 写后端 课程_华哥折腾历险记的博客-程序员宝宝

文章目录一、前言二、nodejs基础介绍三、nodejs进阶介绍四、nodejs理论介绍1、官网简单介绍2、JavaScript、V8引擎简单介绍3、现在我们来说说nodejs是怎么创造出来的?五、nodejs的安装六、编辑器visual studio code简单输出效果七、相关下载地址一、前言nodejs现在非常流行,作为一个懂前端的javaSc...

学习jquery插件Qtip(一)_weixin_30906701的博客-程序员宝宝

关于Qtip,网络上的资料已经很多了。在这里,我把自己学习Qtip的写下来,方便自己以后查阅。Qtip是基于Jquery框架一个功能强大的提示插件,目前已经升级为Qtip2。链接地址:http://craigsworks.com/projects/qtip2/1. 信息提示框:2. 确认框: 3. 弹出登录框等等,这些提示框、...

随便推点

python学习——Counter计数方法_geerniya的博客-程序员宝宝

1、统计一个序列中元素的次数:from collections import Countera = [10, 8, 6, 7, 2, 8, 4, 10, 3, 7, 8, 4, 5, 7, 2, 2, 3, 8, 8, 9, 6, 2, 2, 7, 8, 7, 4, 8, 5, 2]b = Counter(a)print(b)得到结果:Counter({8: 7, 2: 6, 7: 5, 4: 3

李宏毅2020机器学习作业3——Convolutional Neural Network_科研鬼才的博客-程序员宝宝

开始之前声明:本文参考了李宏毅机器学习作业说明(需翻墙),基本上是将代码复现了一遍,说明中用的是google colab(由谷歌提供的免费的云平台),我用的是Jupyter Notebook本文用到的资料在百度网盘自取点击下载,提取码:zdth。请将所需资料下载解压,确保资料中有6个文件,并保存到自己的目录当中。【博主的环境:Anaconda3+Jupyter Notebook,pyth...

linux shell ls xargs rm 组合删除文件_whatday的博客-程序员宝宝

通常ls列出的文件,想直接管道通过rm -rf删除是无效的.这时就要配合命令xargs使用了:例如:按时间排序,删除最后的10个文件ls -t | tail -10 | xargs rm -rf 当然,也可以用ls -lt | tail -100 | awk '{ print $9 }' | xargs rm -rf两者效果是相同的同理,如果想按时间倒序排列,...

java.lang.NoSuchMethodError: org.springframework.core.KotlinDetector.isKotlinReflectPresent_weixin_30292745的博客-程序员宝宝

java.lang.NoSuchMethodError: org.springframework.core.KotlinDetector.isKotlinReflectPresent解决方案:因为pom.xml中引入了spring-boot-starter-web,同时pom.xml也引入了spring-core,spring-beans,这里去掉spring-core,spri...

推荐文章

热门文章

相关标签