Установка фильтра данных в строковое поле, содержащее число>, чем переменная, содержащая число - PullRequest
1 голос
/ 05 января 2020

Я использую Delphi 10.2. Я пытаюсь отфильтровать ClientDataSet для создания отчета только о новых записях. «Idnm» - это строковое поле, содержащее число.

Следующий код завершается ошибкой, потому что Idnm выровнено по левому краю, а шесть цифр git, начинающихся с 6, отображаются как «5123456».

Var StartID : string;
... 
StartID := '5123456';
ClientDataSet1.Filter := 'Idnm > ' + StartID; 
ClientDataSet1.Filtered := true;

Как мне отформатировать Idnm или StartID , чтобы фильтр работал?

1 Ответ

3 голосов
/ 05 января 2020

К сожалению, использование свойства Filter фильтра TClientDataSet для сравнения целочисленных значений не работает должным образом, поскольку базовая обработка выражений не поддерживает преобразование типов из строковых представлений в целочисленные значения. Гораздо проще оставить свойство Filter пустым и использовать событие OnFilterRecord, чтобы определить, соответствуют ли записи вашему целочисленному критерию фильтра. Примерно так:

var
  iStartID : Integer;  //  a field of your form or datamodule

[...]

  StartID := 5123456;
  iStartID := StrToInt(StartID);

procedure TForm1.CDS1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
// set Accept to True if the current record matches the filter condition(s)
begin
  //  Set iStartID from your StartID value before activating the filter
  //  CDS1ID is a persistent field defined for the ID.  Otherwise, use
  //  CDS1.FieldByName('ID').AsInteger
  Accept := CDS1ID.AsInteger > iStartID;
end;

Когда вы хотите изменить StartID, выключите CDS1.Filtered (False), измените значения StartID / iStartID, а затем снова включите Filtered (True).

Обратите внимание, я использовал переменную iStartID, чтобы избежать снижения производительности при выполнении CDS.FieldByName для каждой строки в наборе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...