碧玉报表中的动态查询

use*_*142 5 jasper-reports

我们正在使用jaspersoft studio创建报告,而我被困在查询部分。从逻辑上讲,我想要的查询类型是:

select * from mytable where
                    IF (condition1)
                              raw_sql_part_1
                    ELSE
                              raw_sql_part_2
Run Code Online (Sandbox Code Playgroud)

因此,现在为了在“查询编辑器对话框”中实现此目的,我写道:

select * from mytable where $P!{param1}
Run Code Online (Sandbox Code Playgroud)

并在表达式编辑器中将“ param1”默认值添加为:

"$P{param2}.equals("A") ?  "1 <> 1" :"1=1" , is 'For prompting' as false
Run Code Online (Sandbox Code Playgroud)

还在参数列表中添加了“ param2”,“为提示”为true

我期望这样: 当我点击预览时,它将提示我输入param2值,然后基于param2解析param1中的条件,然后最终将其替换为实际查询中的条件。param2的默认值为空字符串。

实际发生的情况: 当我点击预览时,它会问我期望的param2的值,但是param2的值不用于解析param1中定义的条件,因为param1条件始终解析为其他部分,即“ 1 == 1”,并且主要查询也变成了

select * from mytable where 1==1
Run Code Online (Sandbox Code Playgroud)

Q1:我期望错了吗?

Q2:为什么不使用param2来解析param1中定义的条件?

我们正在使用Jaspersoft Studio 6.1.1版本

Pet*_*erg 4

实际上,我不认为你可以defaultValueExpression根据另一个参数的值来设置一个参数,但如果 jrxml 中参数的顺序正确,它似乎可以工作。

例子

<parameter name="param1" class="java.lang.String">
    <defaultValueExpression><![CDATA["A"]]></defaultValueExpression>
</parameter>
<parameter name="param2" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA[$P{param1}.equals("A") ?  "1 <> 1" :"1=1"]]></defaultValueExpression>
</parameter>
Run Code Online (Sandbox Code Playgroud)

有效,所以我的猜测是您没有按正确的顺序定义参数。

笔记:

select * from mytable where $P{param1},将尝试使用准备好的语句

jasper 报告中的查询可以使用带有准备好的语句的参数或简单的字符串替换来执行。

  • $P{param}--> 准备好的声明

  • $P!{param}--> 字符串替换

从你的例子来看,查询应该是字符串替换

select * from mytable where $P!{param1}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅:JasperReports:传递参数进行查询