В приложениях на Xafari (Ranet) иногда приходится писать критерии для фильтрации данных приврно такие по смыслу:

“Для текущего объекта типа А отфильтровать объекты типа В так чтобы B.StartDate = A. CurrentDate”

Такого рода критерий может встречаться, например, при описании плавающей панели фильтров.

В этом случае мы в строке критерия в модели пишем примерно такой критерий

 

StartDate = '{0:CurrentDate}'

 

Т.е. таким критерием мы фильтруем объекты B по полю StartDate, а в качестве параметра фильтрации передаем значение поля CurrentDate текущего объекта A.

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

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

 

StartDate = '15.11.2015 0:00:00'     (при условии что включены русские региональные настройки)

 

Тут есть две возможные потенциальные ошибки:

Мы видим, что идет сравнение  поля типа DateTime с константной строкового типа, соответственно нужно чтобы сервер БД поддерживал по умолчанию приведение строки в тип DateTime . SQL сервер и Oracle поддерживают такое приведение, но для надежности надо в выражении критерия формировать не строковую константу для даты, а использовать формат DevExpress для задания константы DateTime, писать дату в символах ##, вот так:

[StartDate] = #{0:CurrentDate}#

 

Но это еще не все.  Даже если мы напишем критерий в таком виде StartDate = #{0:CurrentDate}#, после обработки выражения может получиться запрос такого вида

StartDate = #15.11.2015 0:00:00#

Т.е. получается запрос, в котором представлено строковое представление  константы  для DateTime, при этом тут нет информации, в коком формате описана константа.

Если такой запрос будет выполняться на базах данных для которых заданы различные региональные настройки (Collation в SQL Server), то могут получаться либо не корректные результаты, либо вовсе ошибки (если например согласно настроек БД первое число трактуется как месяц)

 

Чтобы критерий не зависел от региональных настроек БД надо критерий писать так:

 

[StartDate] =  #{0:CurrentDate,MM/dd/yyyy}#

 

Т.е. передавать дату в формате “MM/dd/yyyy”, если дата передается в таком формате, то DevExpress как-то корректно передает ее на сервер СУБД, и она всегда корректно обрабатывается на любых БД, независимо от региональных настроек