Динамические фильтры в запросах для СУБД Oracle

отредактировано 22:43 Раздел: FastReport 4.0
Доброго времени суток, уважаемые коллеги!

Пишу отчёт, для которого требуется наличие большого количества [опциональных] фильтров. Реализую их динамическим добавлением строк в 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 на использование этой функции ругается.

Комментарии

  • gpigpi
    отредактировано 22:43
    Используйте функцию FormatDateTime
  • Lizard~Lizard~ Тольятти
    отредактировано 22:43
    написал: »
    Доброго времени суток, уважаемые коллеги!

    Пишу отчёт, для которого требуется наличие большого количества [опциональных] фильтров. Реализую их динамическим добавлением строк в SQL-запрос. С фильтрами, значения которых выбираются из СУБД, всё понятно, возник вопрос по поводу фильтра по дате, вводимой через диалоговую форму.

    Необходимо собрать следующую строку:
    AND TO_DATE (date_livraison, 'DD.MM.YYYY') BETWEEN TO_DATE ('Date1', 'DD.MM.YYYY') AND TO_DATE ('Date2', 'DD.MM.YYYY').
    

    Настоятельно не советую так делать... Рано или поздно подобные действия приведут к тормозам в БД. Нужно использовать параметры, тогда не возникнет необходимости конвертации значений, да и сервер "спасибо" скажет, ему не нужно будет каждый раз разбирать запросы. Как вариант реализации изощрённой фильтрации - поцедура в пакете Oracle, которая в зависимости от входных параметров, заполняет временную таблицу. Или, если возвращаемых данных немного, табличную функцию.
    На тему "жесткого" разбора и чем это грозит
    Список тем
    Лучше сразу сделать правильно, с проффесиональным подходом.
  • отредактировано 22:43
    LizarD написал: »
    Настоятельно не советую так делать... Рано или поздно подобные действия приведут к тормозам в БД. Нужно использовать параметры, тогда не возникнет необходимости конвертации значений, да и сервер "спасибо" скажет, ему не нужно будет каждый раз разбирать запросы. Как вариант реализации изощрённой фильтрации - поцедура в пакете Oracle, которая в зависимости от входных параметров, заполняет временную таблицу. Или, если возвращаемых данных немного, табличную функцию.
    На тему "жесткого" разбора и чем это грозит
    Список тем
    Лучше сразу сделать правильно, с проффесиональным подходом.

    Согласен про профессиональный подход. Но

    1. Как делать опциональные фильтры с параметрами? В Fast Report, как я понимаю, если ты задал в запросе параметр, так будь добр его ввести.
    2. К сожалению, ситуация такая, что я не имею права изменять что-либо в СУБД, поэтому вариант с пакетами или временной таблицей не катит.
  • Lizard~Lizard~ Тольятти
    отредактировано September 2009
    написал: »
    Согласен про профессиональный подход. Но

    В Fast Report, как я понимаю, если ты задал в запросе параметр, так будь добр его ввести.

    Эта проблема не Фаст репорта, программиста.
    Например так:
    Select a.department
    from depatments a
    where a.department = case when nvl(:depcode, -1) > 0 
                                         then :depcode 
                                         else a.department 
                                       end
    

    если параметр заполнен, используется значение параметра, иначе выводятся все подразделения.
  • отредактировано 22:43
    Спасибо, такой вариант в голову не пришёл, как раз то, что надо.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.