Wu50Feng

许多年以后,希望能看到自己留下的脚印

 

Delphi中运行期间在TClientDataSet中实现统计字段和计算字段

1、统计字段的实现
   第一步用如下格式创建TClientDataSet
      with ClientDataSet1 do
      Begin
           with FieldDefs.AddFieldDef do
    Begin
         DataType=ftInteger;
  Name='A';
    End;
           with FieldDefs.AddFieldDef do
    Begin
         DataType=ftInteger;
  Name='B';
    End;
           with FieldDefs.AddFieldDef do
    Begin
         DataType=ftInteger;
  Name='C';
    End;
    CreateDataSet;
    Active:=true;
      End;
    第二步、定义统计字段的计算方法
        Function GetAggVale(CDS:TClientDataSetp;const AggExpression:String;const AggField:String;
    const AggGroupLevel:Integer=0):Variant;
 var
    AddUp:TAggregate;
 Begin
    Addup:=TAggregate.Create(CDS.Aggregates,CDS);
    try   
       Addup.Expression:=Format(AggExpression,[AggField]);
       AddUp.GroupingLevel:=AggGroupLevel;
       Addup.active:=True;
       Result:=Addup.Value;
    Finally
       Addup.Free;
    End;
 End;
      在ClientDataSet1的AfterPost事件中实现
         ShowMessage(GetAddValue(ClientDataSet1,'Sum(%s)','A',0);
      以上是简单说明了一下统计字段的简单运用,实际上在Delphi中的TClientDataSet还可以实现很多中统计。譬如说分组等等。

2、运行期计算字段的实现
      建立如下关系
      DBGrid1.DataSource:=DataSource1;
      DataSource1.DataSet:=ClientDataSet1;
      ClientDataSet1.ProvideName:='DataSetProvider1';
      DataSetProvider1.DataSet:=ClientDataSet2;
      因为在ClientDataSet2的FieldsDefs中不能直接定义FieldKind所以用了一个ClientData1转接了一下
      在代码中实现
      with ClientDataSet2 do
      Begin
           with FieldDefs.AddFieldDef do
    Begin
         DataType=ftInteger;
  Name='A';
    End;
           with FieldDefs.AddFieldDef do
    Begin
         DataType=ftInteger;
  Name='B';
    End;
           with FieldDefs.AddFieldDef do
    Begin
         DataType=ftInteger;
  Name='C';
    End;
    CreateDataSet;
    Active:=true;
     End;
     with ClientDataSet1 do
     Begin
   tmpField:=TIntegerField.Create(ClientDataSet1);
   tmpField.FieldName:='A';
   tmpField.DataSet:=ClientDataSet1;
   tmpField.FieldKind:=fkData;

   tmpField:=TIntegerField.Create(ClientDataSet1);
   tmpField.FieldName:='B';
   tmpField.DataSet:=ClientDataSet1;
   tmpField.FieldKind:=fkData;

   tmpField:=TIntegerField.Create(ClientDataSet1);
   tmpField.FieldName:='C';
   tmpField.DataSet:=ClientDataSet1;
   tmpField.FieldKind:=fkCalculated;

   Active:=true;
     End;
     DBGrid1.Columns[0].FieldName:='A';
     DBGrid1.Columns[0].FieldName:='B';
     DBGrid1.Columns[0].FieldName:='C';

     接下来的就是在ClientDataSet1的OnCalcFields事件中实现计算算法了如下:
     ClientDataSet['C']:=ClientDataSet['A']+ClientDataSet['B'];

posted on 2005-11-22 10:01  Dany  阅读(2384)  评论(0编辑  收藏  举报

导航