2012-10-26 50 views
2

我正在创建JR嵌入式报表sql查询作者:iReport 4.5.0如何将可选参数传递给报告?

我已经在Query中添加了参数。但我希望给予灵活性,以便用户可以传递参数或不能传递参数,以便相同的报告可以与我的Web应用程序一起工作。

任何人都可以告诉我如何使我的报告非常灵活,以便用户可以或不能传递参数。

我修改了的queryString这样的:

SELECT columnA, ColumnB FROM Table WHERE Table."columnA" = $P!{} 

iReport的未能生成报告。

+0

你可以看看[传递一个“where条件”到jasperreports导出pdf](http://stackoverflow.com/questions/12081601/passing-a-where-condition-to-jasperreports-exporting-pdf),[ JasperReports:传递参数查询](http://stackoverflow.com/q/11871042/876298)&[JasperReports:如何添加一个WHERE语句在SQL查询取决于布尔参数?](http://stackoverflow.com/q/12889023/876298)posts –

回答

5

我通常遵循以下模式:像你一样定义$ P {MyParam}。然后加入$ P {MyParam_SQL}像这样的默认值:

$P{MyParam} == null ? "1=1" : "columnA = '" + $P{MyParam} + "'" 

,并在报告的SQL是这样的:

SELECT columnA, ColumnB 
FROM table 
WHERE 
    some_filters 
    AND $P!{MyParam_SQL} 
    AND some_other_stuff 

这不是从根本上不同于其他两个参考答案。但我觉得这很容易理解和维护。

+0

感谢您的回复。但它可能是性能问题。有可能我们可以忽略Jasper报告中的where子句中的空白参数 –

+0

是什么让你认为它可能是一个性能问题?你当然可以将它转换为空字符串而不是'1 = 1'。只需要在需要的地方生成“AND”关键字就要更加小心。但性能将是相同的。 – mdahlman

+0

让我们假设,如果用户给出任何参数为空,那么我们将去'1 = 1',它将获取该特定列的所有记录。是不是? –

0

你可以尝试传递整个where子句作为参数。这样,如果没有给出参数,则整个子句被省略,查询仍然有效。

你只需要准备好你的输入是这样的:

String whereClause = null 
if (inputString != null && inputString != ""){ 
    whereClause = "Where Table.\"columnA\" = \"" + inputString + "\""; 
} 

传递作为参数传递给您的报告,然后将查询更改为:

Select columnA,ColumnB From Table $P!{whereClause} 
+0

感谢GenericJon的回复,但是这种方法对我不起作用,因为我不能告诉用户把where子句给我 –

1

您需要重组你的SQL查询来做到这一点。从本质上讲具有设置为null的参数,写你的查询类似的默认值:

Select columnA,ColumnB From Table Where ($P!{} IS NULL OR Table."columnA" = $P!{}) 

如果传递的值在参数查询将其比作柱,如果是的话基本上是空它只会评估为真,并跳过第二部分。

+0

对不起,但我无法查询你能否请探索谢谢 –

相关问题