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'];