3

我需要计算一个字段的最大值,但我在这样做时遇到了麻烦。假设我的字段名为“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 与 INTEGER 之间。

4

2 回答 2

1

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

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

于 2011-11-25T13:12:16.233 回答
1

作为一种解决方法,可以使用'MAX(VALUE0 * 1)''MAX(VALUE0 + 0)'用于Expression. 然后你ResultType会的ftFloat。只是不要忘记在访问它时对值进行四舍五入:(Max0 := Round(FieldMax0.Value);浮点数有时往往有一个小尾巴:)

于 2017-05-17T10:26:10.140 回答