Чтобы применить замену {IIF(…)}
или {IF}…{FI}
на основе макропеременной, значение переменной не должно быть пустым. Это то, что говорится в документации для условной замены . Это буквально означает, что подстановка применяется, если макропеременная расширяется до непустой строки. Этот факт можно проверить, просмотрев исходный код FireDA C, в частности метод TFDPhysConnectionMetadata.TranslateEscapeSequence
в модуле FireDAC.Phys.Meta
. В случае eskIF
вы можете найти:
s := Trim(ASeq.FArgs[0]);
…
else if s <> '' then
Result := 'True';
Давайте посмотрим, что произойдет, когда вы Clear
макрос-переменную. Его Value
установлен на Null
, а его DataType
установлен на mdUnknown
. В этом случае переменная расширяется препроцессором до NULL
литерала, который не является пустой строкой. Значение AsRaw
не имеет значения, потому что препроцессор использует свойство SQL
для подстановки.
Кажется, нет другого способа расширить макропеременную до пустой строки, кроме установки AsRaw := ''
. В этом случае его DataType
установлено на mdRaw
, а свойство value SQL
равно AsRaw
.
Я не уверен, является ли это поведение ошибкой или функцией, но меняю его может сломать существующие базы кода, поэтому я не думаю, что это когда-нибудь будет исправлено. Я бы сказал, что в конечном итоге это стало функцией.
Помимо вышеизложенного, вы можете избежать макросов, используя простые параметры:
select * from (values(current_date-1), (current_date), (current_date+1)) as t(datetest)
where :Datevalue is null or datetest = :Datevalue
Таким образом вы можете очистить или установить значение параметра Datevalue
, как и следовало ожидать:
{ to bind null value }
fdqr.ParamByName('Datevalue').Clear;
{ to bind some value }
fdqr.ParamByName('Datevalue').AsDate := Today;