Передача операторов SQL для запроса через параметр iReport

Я пытаюсь создать отчет в iReport на основе запроса Oracle SQL, который имеет дело с транзакциями. Фактически задействованные таблицы очень длинные и не имеют отношения к проблеме. Я пытаюсь создать отчет, который будет возвращать результаты, когда суммы транзакции соответствуют 1 из 3 следующих критериев:

  • от 1000,00 до 2499,99
  • от 2500,00 до 9999,99
  • >= 10000.00

Я пытаюсь создать один параметр списка выбора, в котором человек, запускающий отчет, может выбирать одну из указанных выше спецификаций. Прежде чем я действительно создам параметр, я пытался протестировать запрос в SQL Developer. Строка запроса, в которой я пытаюсь это реализовать:

alias.transaction_amount :amountRange

и мой тестовый ввод - «от 1000 до 9999». Когда это жестко запрограммировано в запросе, он работает нормально, но когда я пытаюсь передать его через этот ввод, я получаю ошибку «Недопустимый оператор отношения».

Есть ли другой способ сделать это?


person RyHartAttack    schedule 28.02.2013    source источник
comment
Является ли ваш: amountRange строкой? Вы пытаетесь использовать один параметр для всего выражения «от 1000,00 до 2499,99»? Затем вам нужно протестировать то же самое в SQL и посмотреть ... Я мало знаю об iReports, но похоже, что вы хотите создать динамическое предложение where, используя какое-то выражение, которое не будет работать в SQL. В отчетах Oracle для этого есть лексические параметры. Может, есть что-л. аналогично в ваших iReports ...   -  person Art    schedule 01.03.2013
comment
да: amountRange - это строка, и это все выражение. Но я вижу, я не думал, что это будет поддерживаться, но я подумал, что стоит попробовать, однако, возможно, есть шанс, что iReport поддерживает это.   -  person RyHartAttack    schedule 02.03.2013


Ответы (2)


Попробуйте использовать это в запросе:
select ... from table1, где transaction_amount $ P! {ParamReport}

Из полного руководства JasperReports:

$P{paramName} Syntax
The parameters are used like normal java.sql.PreparedStatement parameters, using
the following syntax:
<queryString>
<![CDATA[
SELECT * FROM Orders WHERE OrderID <= $P{MaxOrderID} ORDER BY
ShipCountry
]]>
</queryString>

$P!{paramName} Syntax
Sometimes it is useful to use parameters to dynamically modify portions of the SQL
query or to pass the entire SQL query as a parameter to the report-filling routines. In
such cases, the syntax differs a little, as shown in the following example. Notice the !
character:
<queryString>
<![CDATA[
SELECT * FROM $P!{MyTable} ORDER BY $P!{OrderByClause}
]]>
</queryString>
person sanBez    schedule 01.03.2013
comment
Итак, если бы я использовал этот синтаксис, нужно ли было бы помещать все предложение where в параметр? Или я могу сузить его до псевдонима alias.transaction_amount $ P! {Amount_Range}? Спасибо за ответ - person RyHartAttack; 02.03.2013

Поговорив с некоторыми коллегами, мы обнаружили лучшее решение этой проблемы, хотя я не знаю, возможен ли метод, который я искал, на самом деле, это решение гораздо более интуитивно понятно.

alias.transaction_amount between (CASE WHEN $P{Range} = 0
                                       THEN 1000.00
                                       WHEN $P{Range} = 1
                                       THEN 2500.00
                                       ELSE 10000.00
                                       END)
                                 and
                                 (CASE WHEN $P{Range} = 0
                                       THEN 2499.99
                                       WHEN $P{Range} = 1
                                       THEN 9999.99
                                       ELSE 9999999.99
                                       END)

Использование операторов case с параметром switch отлично работает, при условии, что если когда-либо будет транзакция на сумму 1 миллиард долларов или больше, они будут исключены, но максимальное количество может быть скорректировано по мере необходимости.

person RyHartAttack    schedule 01.03.2013