Динамические фильтры в запросах для СУБД Oracle
Доброго времени суток, уважаемые коллеги!
Пишу отчёт, для которого требуется наличие большого количества [опциональных] фильтров. Реализую их динамическим добавлением строк в SQL-запрос. С фильтрами, значения которых выбираются из СУБД, всё понятно, возник вопрос по поводу фильтра по дате, вводимой через диалоговую форму.
Необходимо собрать следующую строку:
Значения Date1 и Date2 берутся из DateEditControlов. Вопрос в том, как получить текстовые 'Date1' и 'Date2' из DateEditControlов строго в формате DD.MM.YYYY на системе с произвольными региональными параметрами?
Пока пользуюсь функцией DateToStr, но нет гарантии, что, например, на американском компьютере строка будет собираться правильно. В Delphi есть функция DateTimeToString с явным указанием формата, однако FastReport на использование этой функции ругается.
Пишу отчёт, для которого требуется наличие большого количества [опциональных] фильтров. Реализую их динамическим добавлением строк в SQL-запрос. С фильтрами, значения которых выбираются из СУБД, всё понятно, возник вопрос по поводу фильтра по дате, вводимой через диалоговую форму.
Необходимо собрать следующую строку:
AND TO_DATE (date_livraison, 'DD.MM.YYYY') BETWEEN TO_DATE ('Date1', 'DD.MM.YYYY') AND TO_DATE ('Date2', 'DD.MM.YYYY').
Значения Date1 и Date2 берутся из DateEditControlов. Вопрос в том, как получить текстовые 'Date1' и 'Date2' из DateEditControlов строго в формате DD.MM.YYYY на системе с произвольными региональными параметрами?
Пока пользуюсь функцией DateToStr, но нет гарантии, что, например, на американском компьютере строка будет собираться правильно. В Delphi есть функция DateTimeToString с явным указанием формата, однако FastReport на использование этой функции ругается.
Комментарии
Настоятельно не советую так делать... Рано или поздно подобные действия приведут к тормозам в БД. Нужно использовать параметры, тогда не возникнет необходимости конвертации значений, да и сервер "спасибо" скажет, ему не нужно будет каждый раз разбирать запросы. Как вариант реализации изощрённой фильтрации - поцедура в пакете Oracle, которая в зависимости от входных параметров, заполняет временную таблицу. Или, если возвращаемых данных немного, табличную функцию.
На тему "жесткого" разбора и чем это грозит
Список тем
Лучше сразу сделать правильно, с проффесиональным подходом.
Согласен про профессиональный подход. Но
1. Как делать опциональные фильтры с параметрами? В Fast Report, как я понимаю, если ты задал в запросе параметр, так будь добр его ввести.
2. К сожалению, ситуация такая, что я не имею права изменять что-либо в СУБД, поэтому вариант с пакетами или временной таблицей не катит.
Эта проблема не Фаст репорта, программиста.
Например так:
если параметр заполнен, используется значение параметра, иначе выводятся все подразделения.