zoukankan      html  css  js  c++  java
  • TClientDataSet[11]: 分组统计


    设计时实现的分组统计:



    运行时实现的分组统计:

    //前期只需要添加 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.
    
  • 相关阅读:
    BZOJ3884 上帝与集合的正确用法 【欧拉定理】
    BZOJ4872 [六省联考2017]分手是祝愿 【期望dp】
    BZOJ4650 [NOI2016]优秀的拆分 【后缀数组】
    BZOJ1562 [NOI2009]变换序列 【KM算法】
    BZOJ2657 [Zjoi2012]旅游(journey) 【树的直径】
    BZOJ3999 [TJOI2015]旅游 【树剖 + 线段树】
    BZOJ3997 [TJOI2015]组合数学 【Dilworth定理】
    BZOJ4823 [Cqoi2017]老C的方块 【最小割】
    坐标系统
    利用键盘左右键使图像左右移动,上下键使图像的两个纹理可见度比例上下调整
  • 原文地址:https://www.cnblogs.com/del/p/1660612.html
Copyright © 2011-2022 走看看