【问题标题】:How to reference one field to another in a subDataset?如何在子数据集中将一个字段引用到另一个字段?
【发布时间】:2020-11-19 04:58:59
【问题描述】:

如果我有一个包含两个字段的 Jasper 报告。例如:

<field name="counts" class="java.util.List"/>
<field name="names" class="java.util.List"/>

如果计数字段如下所示,是否可以在报告中使用名称字段“查找”counts 字段中的值:

[{"Bob":10},{"Bill":5},{"John":2}]

所以在报告中我使用 subDataSet 遍历名称:

<subDataset name="nameDetails" uuid="6f0e513d-9659-4dea-8c88-0fa9522d6aef">
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>
</subDataset>

<componentElement>
    <reportElement x="0" y="40" width="200" height="60"/>
    <jr:list printOrder="Vertical">
       <datasetRun subDataset="nameDetails">
            <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRMapCollectionDataSource($F{names})]]></dataSourceExpression>
       </datasetRun>
       <jr:listContents height="60" width="200">
           <textField>
                <reportElement x="0" y="0" width="200" height="20"/>
                <textFieldExpression><![CDATA["Name: " + $F{name}]]></textFieldExpression>
           </textField>
       ...

这会在名称字段中打印出每个人的姓名,但另外我想使用每个人的“姓名”来查找 counts 字段中的人的计数,但不确定我是否可以这样做还是怎么做?

【问题讨论】:

    标签: jasper-reports


    【解决方案1】:

    是的,您可以引用字段,但在您的情况下,您首先需要将另一个字段也传递给子数据集,因此您只能引用实际子数据集中存在的数据。

    一种方法是将字段counts 作为参数传递。

    <datasetParameter name="counts">
       <datasetParameterExpression><![CDATA[$F{counts}]]></datasetParameterExpression>
    </datasetParameter>
    

    例如假设列表在相同位置有数据。

    List<String> names = Arrays.asList(new String[] { "Bob", "Bill", "John" });
    List<Integer> counts = Arrays.asList(new Integer[] { 10, 5, 2 });
    

    您可以使用内置参数$V{REPORT_COUNT} 从另一个列表$P{counts}.get(($V{REPORT_COUNT}.intValue()-1)) 中检索数据

    jrxml

    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="firstReport" pageWidth="595" pageHeight="842" whenNoDataType="BlankPage" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="597c0716-df6b-42ec-a7c8-863eb1b7174a">
        <subDataset name="nameDetails" uuid="63078d78-2076-4a72-8728-ee6ca3ded99f">
            <parameter name="counts" class="java.util.List"/>
            <field name="_THIS" class="java.lang.String"/>
        </subDataset>
        <field name="counts" class="java.util.List"/>
        <field name="names" class="java.util.List"/>
        <detail>
            <band height="50">
                <componentElement>
                    <reportElement x="0" y="0" width="550" height="30" uuid="180fb785-64b3-4f04-81f6-7076444d871d"/>
                    <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" printOrder="Vertical">
                        <datasetRun subDataset="nameDetails" uuid="8d40297b-e33b-4681-9533-d6f1ab63c6f2">
                            <datasetParameter name="counts">
                                <datasetParameterExpression><![CDATA[$F{counts}]]></datasetParameterExpression>
                            </datasetParameter>
                            <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{names})]]></dataSourceExpression>
                        </datasetRun>
                        <jr:listContents height="30" width="550">
                            <textField>
                                <reportElement x="0" y="0" width="550" height="30" uuid="48e09c52-3b6a-40cf-b572-2abccfcd83cc"/>
                                <textElement verticalAlignment="Middle">
                                    <font size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$F{_THIS} + ":" + $P{counts}.get(($V{REPORT_COUNT}.intValue()-1))]]></textFieldExpression>
                            </textField>
                        </jr:listContents>
                    </jr:list>
                </componentElement>
            </band>
        </detail>
    </jasperReport>
    

    结果

    注意:如果您可以控制数据到达,但是我强烈建议您将数据传递到单个对象(列表)中,因为这种类型的引用容易出错,在这种情况下,如果列表不同,报告生成会失败

    【讨论】:

    • 谢谢。看起来不错。我可以在 MongoDB 查询中组合列表。我给出的例子有点简化。我想使用嵌套字段的值 - 一个 ID 在另一个列表中查找另一个值。第一个列表包含某物的详细信息和 ID,我使用 ID 在第二个列表中查找计数值。我所拥有的只是我可以在 MongoDB 聚合查询中做的事情——结合两个不同的数据集和 Jasper 报告本身。不幸的是,我没有 Java 应用程序来进行任何处理。
    猜你喜欢
    • 2023-03-26
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2014-09-16
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多