jasper-reports - 如何在子数据集中将一个字段引用到另一个字段?
问题描述
如果我有一个包含两个字段的 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
字段中人员的计数,但不确定我是否可以这样做或如何做到这一点?
解决方案
是的,您可以引用字段,但在您的情况下,您首先需要将另一个字段也传递给子数据集,因此您只能引用实际子数据集中存在的数据。
一种方法是将字段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>
结果
注意:如果您可以控制数据到达,但我强烈建议您将数据传递到单个对象(列表)中,因为这种类型的引用容易出错,在这种情况下,如果列表的大小不同,报告一代会失败
推荐阅读
- regex - 如何使用正则表达式检查 ramsey/uuid 要求?
- wordpress - Wordpress Elementor 缺少换行符
- anylogic - 如何在模拟过程中使参数在 Anylogic 模型中只计算一次?
- python - 在 VS Code 上的 Jupyter Notebook 中运行单元问题
- python-3.x - 能够访问一个 if 语句中的变量,但不能访问其他
- python-3.x - 使用 InstaPy 出现“selenium.common.exceptions.SessionNotCreatedExceptionSelenium”错误
- mdriven - 在 MDriven Turnkey 中消除涟漪效应的最佳方法是什么?
- ios - 目标C中的@NotEmpty注释?
- flutter - 使用 FLUTTER 和 FIREBASE 我收到此错误:类型“用户”不是“字符串”类型的子类型
- reactjs - window.confirm 在 iphone 上不工作不工作