Как я могу использовать агрегатное поле в TClientDataSet, который является BIGINT (TLargeintField)? - PullRequest
3 голосов
/ 24 ноября 2011

Мне нужно вычислить значение Max поля, но у меня возникают проблемы при этом.Допустим, мое поле называется «VALUE0».Я хотел бы использовать агрегатные функции TClientDataSet для этого.Что мне делать?

Этот код не будет работать только с полями, которые являются БОЛЬШИМИ в моей таблице SQL:

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.

EDIT2

Изменен вопрос и некоторые части в тексте, потому что теперь я знаю, что проблема в BIGINT vs INTEGER в агрегатных функциях TClientDataSet.

Ответы [ 2 ]

1 голос
/ 17 мая 2017

В качестве обходного пути можно использовать 'MAX(VALUE0 * 1)' или 'MAX(VALUE0 + 0)' для Expression.Тогда ваш ResultType будет ftFloat.Только не забудьте округлить значение при доступе к нему: Max0 := Round(FieldMax0.Value); (у поплавков иногда бывает крошечный хвост:)

1 голос
/ 25 ноября 2011

Как отметил Сертак Акьюз, это невозможно сделать на Delphi 2010 и ниже. Кажется, это исправлено в Delphi XE, хотя я его не проверял.

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

...