我需要计算一个字段的最大值,但我遇到了麻烦。假设我的字段名为'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。
答案 0 :(得分:1)
正如Sertac Akyuz所指出的,在Delphi 2010及以下版本中不可能这样做。似乎在Delphi XE中修复了,虽然我还没有测试过它。
答案 1 :(得分:1)
作为一种解决方法,可以使用'MAX(VALUE0 + 0)'
或Expression
作为ResultType
。
然后,您的ftFloat
将为Max0 := Round(FieldMax0.Value);
。只是不要忘记在访问它时对值进行舍入:data(data: string) {
this.usersdata = data;
console.log(this.usersdata);
(浮点数往往有一条小尾巴:)