到目前为止,我一直受到jasper-reports的限制 我只能在每个文档中写一个数据查询 当我需要编写另一个查询时,我必须创建一个子报表,传递它所需的参数等等。
但我绝对不相信这是做这件事的好方法。
那么是否有另一种方法可以在单个jasper文档中触发多个数据查询?
答案 0 :(得分:66)
可以使用subDataset
和datasetRun
从单个报告中执行多个查询。行为就像将一个或多个子报表嵌入到单个报表文件中一样。
像这样定义一个subDataset:
<subDataset name="dataset1">
<parameter name="someParam" class="java.lang.String"/>
<queryString><![CDATA[SELECT column1, column2 FROM table1 WHERE column1=$P!{someParam}]]></queryString>
<field name="column1" class="java.lang.String"/>
<field name="column2" class="java.lang.String"/>
</subDataset>
子数据集可以像报表一样具有参数,字段,变量和组。每个子数据集都可以拥有自己的查询,报表可以包含任意数量的子数据集。
要使用子数据集,您需要定义datasetRun
。这只能在特定元素内完成:图表,交叉表,表格和列表。我们将使用一个列表,因为它的行为几乎与另一个细节带一样。
此代码定义了一个使用我们的子数据集的列表:
<componentElement>
<reportElement x="0" y="0" width="100" height="40"/>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
<datasetRun subDataset="dataset1">
<datasetParameter name="someParam"><datasetParameterExpression><![CDATA["some value for column 1"]]></datasetParameterExpression></datasetParameter>
</datasetRun>
<jr:listContents height="40">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{column1}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="20" width="100" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{column2}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
一些注意事项:
jr:listContents
元素类似于细节带元素。你几乎可以放置任何其他元素。
datasetRun
元素非常类似于子报表元素。它内部可以有dataSourceExpression
或connectionExpression
,这将改变数据的来源。如果这两个都不存在,则使用报告数据源。
许多datasetRuns都可以使用相同的subDataset,因此您可以使用不同的参数轻松地多次运行查询。
答案 1 :(得分:0)
最好让 Sub 报告调用或创建一个过程来使用 select 获取最终数据。