Как использовать свойства RecsSkip и RecsMax TFDQuery во время выполнения

Я искал пропустить и принять выбор в TFDQuery. Я нашел следующие свойства.FetchOptions.RecsSkip и.FetchOptions.RecsMax. Я использую Токио 10.2.3 и базу данных Firebird 3

Я делаю запрос во время выполнения и хочу получить начальную запись в 5 и получить 8 следующих записей.

Я к чему-то вроде:

Результат не пропускает первые 5 записей

var
  qryTest: TFDQuery;
begin
 qryTest:= TFDQuery.Create(self);
 qryTest.Connection := self.FDConnection;

 qryTest.sql.Text:= ' select * from salutationdescriptions order by ID';
 qryTest.Disconnect();
 qryTest.FetchOptions.RecsSkip:= 5;
 qryTest.FetchOptions.RecsMax:= 8;
 qryTest.Open();

Но это дает в результате первые 8 записей. 5 первых записей не пропущены.

Хорошо, я к тому же, но теперь я устанавливаю TFQQuery во время разработки (компонент в форме) и добавляю выбор "select * from salutationdes описания по идентификатору" в компоненте.

Запустите код:

Это пропустить 5 записей

  qryItem.Close;
  qryItem.Disconnect();
  qryItem.FetchOptions.RecsSkip:= 5;
  qryItem.FetchOptions.RecsMax:= 8;
  qryItem.Open();

Результат, который я получаю, в порядке. Это пропустить первые 5 записей. Когда я добавляю qryItem.sql.text, он не пропускает первые 5 записей

Это не пропустить 5 записей

  qryItem.Close;
  qryItem.sql.Text:= ' select * from salutationdescriptions order by ID';
  qryItem.Disconnect();
  qryItem.FetchOptions.RecsSkip:= 5;
  qryItem.FetchOptions.RecsMax:= 8;
  qryItem.Open();

Это не пропускает 5 первых записей.

Должен ли я установить что-то в свойствах?

Я хочу использовать RecsSkip и RecsMax во время выполнения. Какие-либо предложения?

НАЙТИ проблему

в SQL.Text я должен начать с "Выбрать... без пробела" и выберите

1 ответ

Как вы уже выяснили, проблема в пробеле в команде SQL. Это связано с тем, что генератор команд не учитывает начальные пробелы команд. Вот такой код (измененный и значительно упрощенный для объяснения мной):

function TFDPhysCommandGenerator.GenerateLimitSelect(ASkip, ARows: Integer;
  AOneMore: Boolean; var AOptions: TFDPhysLimitOptions): string;
begin
  if (True) and (CompareText(Copy(FCommandText, 1, 6), 'SELECT') = 0) then
    Result := GetLimitSelect(FCommandText, ASkip, ARows, AOptions)
  else
    Result := FCommandText;
end;

Там вы можете увидеть проблему. Генератор команд возвращает собственную команду LIMIT СУБД только в том случае, если поле FCommandText, назначенное из текста команды запроса, начинается словом SELECT. Это не ваш случай (из-за начального пробела), поэтому генератор возвращает команду как есть.

Это ошибка FireDAC, о которой я сообщил как RSP-20403. Так как таких проверок больше, я думаю, что самым простым решением для этого было бы обрезать команду SQL непосредственно в ее конструкторе, например:

constructor TFDPhysCommandGenerator.Create(const ACommand: IFDPhysCommand);
begin
  ...
  FCommandText := Trim(ACommand.SQLText);
  ...
end;

Так что теперь на EMBT, как это исправить.

Другие вопросы по тегам