Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблема с методом TFDQuery в Delphi Rio: некорректное поведение макроса IIF при очистке фильтра

Delphi , Технологии , Макросы

В процессе работы с TFDQuery в Delphi Rio (10.3.3) был обнаружен баг, связанный с некорректным поведением макроса IIF при очистке фильтра. При использовании метода Clear для очистки значения макроса ожидалось, что скрипт будет интерпретирован так, чтобы фильтр был устранен, но этого не происходило. В результате получался некорректный запрос к базе данных, в котором фильтр оставался, несмотря на очистку макроса.

Пример кода, демонстрирующий проблему:

fdqr.SQL.Text :=
  'select * from (values (current_date-1), (current_date), (current_date + 1)) as t (datetest) ' +
  '{iif (! Datevalue, where datetest =! Datevalue)}';

fdqr.MacroByName('datevalue').Clear;
fdqr.Open;

В результате выполнения этого кода запрос к базе данных выглядел следующим образом:

select * from (values(current_date-1), (current_date), (current_date+1)) as t(datetest)
where datetest = NULL

Однако, если после очистки макроса присвоить значение переменной AsRaw, все работает как ожидалось, даже если предыдущее значение было пустой строкой и IsNull было True.

fdqr.MacroByName('datevalue').Clear;
{ at this point IsNull = True and AsRaw is '' }
fdqr.MacroByName('datevalue').AsRaw := '';
fdqr.Open;

В результате выполнения этого кода запрос к базе данных выглядел следующим образом:

select * from (values(current_date-1), (current_date), (current_date+1)) as t(datetest)

Это поведение макроса IIF в TFDQuery в Delphi Rio вызвало предположение, что это может быть баг в FireDAC. Однако, после тщательного изучения документации и исходного кода было выяснено, что это не баг, а особенность работы макросов в FireDAC.

Подтвержденный ответ заключается в том, что для применения подстановки макроса {IIF(…)} или {IF}…{FI} на основе переменной макроса, значение переменной не должно быть пустым. Это прямо указано в документации по предварительной обработке командного текста в FireDAC. Это также можно проверить, изучив исходный код FireDAC, в частности метод TFDPhysConnectionMetadata.TranslateEscapeSequence в модуле FireDAC.Phys.Meta. В случае для eskIF можно найти:

s := Trim(ASeq.FArgs[0]);
...
else if s <> '' then
  Result := 'True';

Когда вы вызываете метод Clear для переменной макроса, ее значение устанавливается в Null, а ее DataType устанавливается в mdUnknown. В этом случае переменная макроса расширяется до литерала NULL, что не является пустой строкой. Значение AsRaw не имеет значения, поскольку предварительный обработчик использует свойство SQL для подстановки.

Кажется, нет другого способа расширить переменную макроса до пустой строки, кроме как установить AsRaw в ''

Создано по материалам из источника по ссылке.

Проблема заключается в том, что в TFDQuery в Delphi Rio макрос IIF некорректно работает при очистке фильтра, что приводит к неверному запросу к базе данных.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Макросы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 03:17:47/0.0051460266113281/1