如何获取 table 组件和 return 中每页列的总和到主报表以显示值?

How to get sum per page of column in table component and return to main report to display value?

最近我开始使用 jasper 报告并遇到了一些问题。我有 table 记录,还有一个带有文本字段的标签,我应该在其中放置每页列的总和。 (我添加了 table 页脚用于调试)。这是一张照片:

我通过以下方式做到了这一点:在 table 中,我添加了具有以下属性的变量 "amount":

注意:重置类型是页,因为我应该显示每页总和

在主报告中,我根据 How to return value from table's DataSource to main report in iReport? 添加了变量 "sumPerList" 并尝试调整评估时间,但它没有帮助(无论我设置什么评估时间,值总是错误的),我无法在字段 "total sum Main" 中显示与字段 "total sum" 中相同的值(table 范围)。 之所以决定将总和与table分开显示,是因为我在space之间是空的,但我不能在table中添加空行。 我还尝试在这里设置 summ 函数:

但这也无济于事。可能有另一种方法吗? (我使用 TIBCO Jaspersoft® Studio 6.8.0 - JasperReports 6.8.0 的可视化设计器。)

数据集 return 值无济于事,因为该值仅在 table 完成时才被 return 编辑,而不是在每个分页符上。

一种(hacky)方法是将值持有者对象传递给 table 子数据集,并在 table 中编写一个表达式,将对象中的值设置为边效果。

例如,您可以使用 AtomicInteger 作为值持有者,请注意我们不需要原子性,我们仅将其用作 mutable 整数。

解决方案看起来像这样:

  • 报告有一个变量 TableTotal 初始化为 AtomicInteger
  • TableTotal 作为参数传递给 table 子数据集 PageTotalHolder
  • table 子数据集有一个名为 PageTotal 的变量(我们希望在页脚中显示其值)
  • 在 table 列页脚中,我们使用 print when 表达式将当前 PageTotal 值设置为 PageTotalHolder(并且始终 return 为真):$P{PageTotalHolder}.getAndSet($V{PageTotal}) >= Integer.MIN_VALUE
  • 报表页脚显示 $V{TableTotal}.get()

为方便起见,在此处粘贴完整的 JRXML。您可以 运行 在 Jaspersoft Studio 中使用一条空记录。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.8.0.final using JasperReports Library version 6.8.0-2ed8dfabb690ff337a5797129f2cd92902b0c87b  -->
<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="Blank_A4_10" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="f750af4c-d61b-4bdb-b537-6d71b6754832">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <style name="Table_TH" mode="Opaque" backcolor="#F0F8FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Table_CH" mode="Opaque" backcolor="#BFE1FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Table_TD" mode="Opaque" backcolor="#FFFFFF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <subDataset name="Dataset1" uuid="8668793a-f800-4489-9589-c9b6d2ee97a0">
        <parameter name="PageTotalHolder" class="java.util.concurrent.atomic.AtomicInteger"/>
        <variable name="Value" class="java.lang.Integer">
            <variableExpression><![CDATA[(int) (10 + 10 * Math.sin($V{REPORT_COUNT}))]]></variableExpression>
        </variable>
        <variable name="PageTotal" class="java.lang.Integer" resetType="Page" calculation="Sum">
            <variableExpression><![CDATA[$V{Value}]]></variableExpression>
        </variable>
    </subDataset>
    <variable name="TableTotal" class="java.util.concurrent.atomic.AtomicInteger" calculation="System">
        <initialValueExpression><![CDATA[new java.util.concurrent.atomic.AtomicInteger()]]></initialValueExpression>
    </variable>
    <detail>
        <band height="203" splitType="Stretch">
            <componentElement>
                <reportElement x="0" y="0" width="200" height="200" uuid="657ddbb8-e98b-43de-be5e-10645069dc44"/>
                <jr:table 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" uuid="2eb1dde6-8cf9-45c1-94ce-0bdcb26e120a">
                        <datasetParameter name="PageTotalHolder">
                            <datasetParameterExpression><![CDATA[$V{TableTotal}]]></datasetParameterExpression>
                        </datasetParameter>
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource(200)]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column width="120" uuid="51f2b0c5-0655-4cc3-8d57-75149a7514f6">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
                        <jr:columnHeader style="Table_CH" height="30"/>
                        <jr:columnFooter style="Table_CH" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="120" height="30" uuid="95a0ff6d-cab6-44df-9aa0-3e41774194e2">
                                    <printWhenExpression><![CDATA[$P{PageTotalHolder}.getAndSet($V{PageTotal}) >= Integer.MIN_VALUE]]></printWhenExpression>
                                </reportElement>
                                <textElement textAlignment="Right"/>
                                <textFieldExpression><![CDATA[$V{PageTotal}]]></textFieldExpression>
                            </textField>
                        </jr:columnFooter>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="120" height="30" uuid="c3ee39f0-59fd-47a3-8cba-90f009dc42ca"/>
                                <textElement textAlignment="Right"/>
                                <textFieldExpression><![CDATA[$V{Value}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </detail>
    <pageFooter>
        <band height="54" splitType="Stretch">
            <textField>
                <reportElement x="200" y="0" width="100" height="30" uuid="eb1905ee-50d5-4601-b8ed-62864e6caea5"/>
                <textFieldExpression><![CDATA[$V{TableTotal}.get()]]></textFieldExpression>
            </textField>
        </band>
    </pageFooter>
</jasperReport>