jasper报告中的动态查询

时间:2016-01-05 15:55:43

标签: jasper-reports

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

function getQueryParam(url, key) {
  var queryStartPos = url.indexOf('?');
  if (queryStartPos === -1) {
    return;
  }
  var params = url.substring(queryStartPos + 1).split('&');
  for (var i = 0; i < params.length; i++) {
    var pairs = params[i].split('=');
    if (decodeURIComponent(pairs.shift()) == key) {
      return decodeURIComponent(pairs.join('='));
    }
  }
}

getQueryParam('http://example.com/form_image_edit.php?img_id=33', 'img_id');
// outputs "33"

现在,在“查询编辑器对话框”中,我写道:

select * from mytable where
                    IF (condition1)
                              raw_sql_part_1
                    ELSE
                              raw_sql_part_2

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

select * from mytable where $P!{param1}

在参数列表中添加了“param2”,其中“is for prompting”为真

我希望如此: 当我点击预览时,它会提示我输入param2值然后根据param2解析param1中的条件,然后最终在实际查询中替换它。 param2的默认值为空字符串。

实际发生的事情: 当我点击预览时,它询问我预期的param2的值,但是param2的值不用于解析param1中定义的条件,因为param1条件总是解析为else部分,即“1 == 1”,主查询也变为

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

Q1:我错了吗?

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

我们正在使用Jaspersoft studio版本6.1.1

1 个答案:

答案 0 :(得分:3)

实际上我认为你不能根据另一个参数的值在参数上设置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>

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

注意:

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

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

  • $P{param} - &gt;准备好的声明

  • $P!{param} - &gt;字符串替换

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

select * from mytable where $P!{param1}

有关详情,请参阅此处:JasperReports: Passing parameters to query