Проблема с методом TFDQuery в Delphi Rio: некорректное поведение макроса IIF при очистке фильтраDelphi , Технологии , МакросыВ процессе работы с TFDQuery в Delphi Rio (10.3.3) был обнаружен баг, связанный с некорректным поведением макроса IIF при очистке фильтра. При использовании метода Clear для очистки значения макроса ожидалось, что скрипт будет интерпретирован так, чтобы фильтр был устранен, но этого не происходило. В результате получался некорректный запрос к базе данных, в котором фильтр оставался, несмотря на очистку макроса. Пример кода, демонстрирующий проблему:
В результате выполнения этого кода запрос к базе данных выглядел следующим образом:
Однако, если после очистки макроса присвоить значение переменной AsRaw, все работает как ожидалось, даже если предыдущее значение было пустой строкой и IsNull было True.
В результате выполнения этого кода запрос к базе данных выглядел следующим образом:
Это поведение макроса IIF в TFDQuery в Delphi Rio вызвало предположение, что это может быть баг в FireDAC. Однако, после тщательного изучения документации и исходного кода было выяснено, что это не баг, а особенность работы макросов в FireDAC. Подтвержденный ответ заключается в том, что для применения подстановки макроса {IIF(…)} или {IF}…{FI} на основе переменной макроса, значение переменной не должно быть пустым. Это прямо указано в документации по предварительной обработке командного текста в FireDAC. Это также можно проверить, изучив исходный код FireDAC, в частности метод TFDPhysConnectionMetadata.TranslateEscapeSequence в модуле FireDAC.Phys.Meta. В случае для eskIF можно найти:
Когда вы вызываете метод 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 |