首页 > 解决方案 > 如何在子数据集中将一个字段引用到另一个字段?

问题描述

如果我有一个包含两个字段的 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

解决方案


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

一种方法是将字段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>

结果

输出

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


推荐阅读