【问题标题】:How do I use an aggregate field in a TClientDataSet that is a BIGINT (TLargeintField)?如何在 BIGINT (TLargeintField) 的 TClientDataSet 中使用聚合字段?
【发布时间】:2011-11-24 13:58:15
【问题描述】:

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

【问题讨论】:

  • 告诉我们您尝试过的一些事情以及遇到的问题。
  • ClientDataset中的Value0是什么类型的字段? FieldKind 的价值呢?
  • @ArjenvanderSpek BIGINT。它适用于整数。 :(
  • @Haole 我用整数对其进行了测试,它按预期工作,但你能用: showmessage(cds.FieldByName('value0').ClassName) 验证吗? cds.FieldByName('value0').FieldKind 的值是多少?
  • @ArjenvanderSpek 我将它们添加到问题中。

标签: delphi aggregate tclientdataset


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多