如何在作为BIGINT(TLargeintField)的TClientDataSet中使用聚合字段?

时间:2011-11-24 13:58:15

标签: delphi aggregate tclientdataset

我需要计算一个字段的最大值,但我遇到了麻烦。假设我的字段名为'VALUE0'。我想使用TClientDataSet的聚合函数来做到这一点。我该怎么办?

此代码只会在我的SQL表中使用BIGINT字段失败:

function TFrmIo.GetMaxY(): Integer;
var
  Max0: Integer;
  FieldMax0: TAggregateField;
begin
  if cds.Active then cds.Close;

  FieldMax0 := TAggregateField.Create(cds);
  FieldMax0.FieldName := 'MAX0';
  FieldMax0.Calculated := true;
  FieldMax0.ResultType := ftLargeint;
  FieldMax0.FieldKind := fkAggregate;
  FieldMax0.DataSet := cds;
  FieldMax0.Expression := 'MAX(VALUE0)';
  FieldMax0.Active := true;

  cds.Open;

  Max0 := Integer(FieldMax0.Value);
end;

我在“cds.Open”行上得到了这个例外:

Exception class EDBClient with message 'Type mismatch in expression.'

修改

根据评论的要求,VALUE0字段的类名是TLargeintField,FieldKind是fkData。

编辑2

更改了问题和文本中的一些部分,因为现在我知道问题是关于TClientDataSet聚合函数中的BIGINT vs INTEGER。

2 个答案:

答案 0 :(得分:1)

正如Sertac Akyuz所指出的,在Delphi 2010及以下版本中不可能这样做。似乎在Delphi XE中修复了,虽然我还没有测试过它。

http://qc.embarcadero.com/wc/qcmain.aspx?d=83610

答案 1 :(得分:1)

作为一种解决方法,可以使用'MAX(VALUE0 + 0)'Expression作为ResultType。 然后,您的ftFloat将为Max0 := Round(FieldMax0.Value);。只是不要忘记在访问它时对值进行舍入:data(data: string) { this.usersdata = data; console.log(this.usersdata); (浮点数往往有一条小尾巴:)