单个 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】:

可以使用subDatasetdatasetRun 从单个报告中执行多个查询。这种行为就像将一个或多个子报表嵌入到单个报表文件中一样。

像这样定义一个子数据集:

<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 元素很像子报表元素。它可以有一个dataSourceExpressionconnectionExpression 内部,这将改变数据的来源。如果这些都不存在,则使用报表数据源。

同一个 subDataset 可以被多个 datasetRuns 使用,因此您可以轻松地使用不同的参数多次运行查询。

【讨论】:

你拯救了我的夜晚(y) "这种行为就像将一个或多个子报表嵌入到单个报表文件中。"。嗯,它几乎就像有子报表。因为子报表可以将值返回到主报表变量中,而子数据集不能。 @Gustavo:子数据集(即表格、交叉表、列表等)可以将值返回到主报告变量中。 List/Table/Crosstab 属性(数据集选项卡)中有一个“返回值”按钮。【参考方案2】:

最好让 Sub 报告调用或创建一个过程来使用 select 获取最终数据。

【讨论】:

以上是关于单个 jasper 文档中的多个查询的主要内容,如果未能解决你的问题,请参考以下文章

Android SQLite 性能:单个查询中的多个选择与多个查询中的单个选择?

单个文档中的多个文档或数组

从 MongoDB 和 Mongoose 中的多个文档创建单个文档

单个 MongoDB 查询中的多个操作

使用 PDO 在 php 中的多个查询与单个查询?

单个查询中的多个 CTE