单个 jasper 文档中的多个查询
Posted
技术标签:
【中文标题】单个 jasper 文档中的多个查询【英文标题】:Multiple queries in a single jasper document 【发布时间】:2011-11-20 21:31:49 【问题描述】:到目前为止,我一直受到 jasper-reports 的一件事的限制。 我只能在每个文档中编写一个数据查询。 当我需要编写另一个查询时,我必须创建一个子报表,传递它所需的参数等等。
但我绝对不相信这是这样做的好方法。
那么还有另一种方法可以在单个 jasper 文档中触发多个数据查询吗?
【问题讨论】:
怎么样?我已经四处寻找,但我真的不明白。 我看不出将查询作为参数传递如何解决问题。每个报告仍然只能查询一次。 @Alex K。好吧,如果我正确理解了这个问题,Manuel 正在询问如何将多个查询放入单个报告中。 AFAIK 这只能通过使用子数据集来完成。 感谢您的 cmets。那么,有没有一种方法可以用来正确编写 jasperrepport 文档,而无需使用 sub-sub-sub-report 来实现所要求的行为。 我也遇到了同样的问题,你能帮帮我吗? ***.com/questions/49903520/… 【参考方案1】:可以使用subDataset
和datasetRun
从单个报告中执行多个查询。这种行为就像将一个或多个子报表嵌入到单个报表文件中一样。
像这样定义一个子数据集:
<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" />
<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 >
<textField>
<reportElement x="0" y="0" />
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$Fcolumn1]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="20" />
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$Fcolumn2]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
一些注意事项:
jr:listContents
元素类似于细节带元素。您几乎可以在其中放置任何其他元素。
datasetRun
元素很像子报表元素。它可以有一个dataSourceExpression
或connectionExpression
内部,这将改变数据的来源。如果这些都不存在,则使用报表数据源。
同一个 subDataset 可以被多个 datasetRuns 使用,因此您可以轻松地使用不同的参数多次运行查询。
【讨论】:
你拯救了我的夜晚(y) "这种行为就像将一个或多个子报表嵌入到单个报表文件中。"。嗯,它几乎就像有子报表。因为子报表可以将值返回到主报表变量中,而子数据集不能。 @Gustavo:子数据集(即表格、交叉表、列表等)可以将值返回到主报告变量中。 List/Table/Crosstab 属性(数据集选项卡)中有一个“返回值”按钮。【参考方案2】:最好让 Sub 报告调用或创建一个过程来使用 select 获取最终数据。
【讨论】:
以上是关于单个 jasper 文档中的多个查询的主要内容,如果未能解决你的问题,请参考以下文章
Android SQLite 性能:单个查询中的多个选择与多个查询中的单个选择?