如何为每个迭代中的最后一个细节打印文本?

时间:2019-03-12 03:19:33

标签: jasper-reports

我有一个子报表可以迭代名称。我想在每个循环上打印一个文本“或”,最后一个除外。现在,我正在执行建议的解决方案in this question,但它仍会在最后的迭代中打印。

以下是我现在拥有的示例:

Current

子报表末尾还有一个

我现在拥有的当前子报表源代码:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1  -->
<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="paiwi-signatories-name-only-subreport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="8f474d5a-0cca-4c5f-807e-71af8848276f">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="signatoryJSON"/>
    <queryString language="json">
        <![CDATA[signatoryNames]]>
    </queryString>
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>
    <field name="address" class="java.lang.String"/>
    <variable name="signatoryCurrentCount" class="java.lang.Integer" resetType="None">
        <variableExpression><![CDATA[$V{nameGroup_COUNT}]]></variableExpression>
    </variable>
    <group name="nameGroup">
        <groupExpression><![CDATA[$F{name}]]></groupExpression>
    </group>
    <detail>
        <band height="36" splitType="Stretch">
            <textField isBlankWhenNull="true">
                <reportElement positionType="Float" x="-20" y="-20" width="260" height="20" uuid="220a59b9-595b-4149-badd-f4a1ecff36c5"/>
                <textElement>
                    <font fontName="Times New Roman" size="12"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
            <textField evaluationTime="Auto" isBlankWhenNull="true">
                <reportElement positionType="Float" x="0" y="0" width="100" height="20" isRemoveLineWhenBlank="true" uuid="afda4fcc-78fc-46f9-8c5c-2e0c4f04dfa5"/>
                <textFieldExpression><![CDATA[$V{signatoryCurrentCount}.equals($V{nameGroup_COUNT}) ? "or" : ""]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

如何避免在最后一条记录之后打印最后一个textField?

2 个答案:

答案 0 :(得分:2)

您可以尝试简单的方法,将2个变量放入报表中,我想您已经知道报表将包含多少个页面,然后将printWhenExpression语句更改为页面的值,例如您的报告包含20页,然后在变量中将打印条件更改为PAGE_NUMBER==20,将另一页的打印条件更改为PAGE_NUMBER < 20。 祝你好运。

答案 1 :(得分:1)

如果您想利用evalutationTime="Auto"

  

变量将在对应于其重置类型的时间进行评估

来自EvaluationTimeEnum

您需要两个具有不同重置时间的变量。适应您的示例,解决方案可以是:

signatoryCurrentCount设置为REPORT_COUNT,但每次组更改时都会重置(因此示例中的每条记录都会重新设置)

<variable name="signatoryCurrentCount" class="java.lang.Integer" resetType="Group" resetGroup="nameGroup">
    <variableExpression><![CDATA[$V{REPORT_COUNT}]]></variableExpression>
</variable>

然后将其与具有重置类型报告的内置变量$V{REPORT_COUNT}进行比较

<textFieldExpression><![CDATA[$V{signatoryCurrentCount}<$V{REPORT_COUNT} ? "or" : ""]]></textFieldExpression>

要了解重置类型为“自动”的表达式,signatoryCurrentCount将具有1,2,3(重置在组中),$V{REPORT_COUNT}将始终为3(在报告处重置)。

完整示例

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="paiwi-signatories-name-only-subreport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="8f474d5a-0cca-4c5f-807e-71af8848276f">
    <queryString language="json">
        <![CDATA[signatoryNames]]>
    </queryString>
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>
    <field name="address" class="java.lang.String"/>
    <variable name="signatoryCurrentCount" class="java.lang.Integer" resetType="Group" resetGroup="nameGroup">
        <variableExpression><![CDATA[$V{REPORT_COUNT}]]></variableExpression>
    </variable>
    <group name="nameGroup">
        <groupExpression><![CDATA[$F{name}]]></groupExpression>
    </group>
    <detail>
        <band height="36" splitType="Stretch">
            <textField isBlankWhenNull="true">
                <reportElement positionType="Float" x="-20" y="-20" width="260" height="20" uuid="220a59b9-595b-4149-badd-f4a1ecff36c5"/>
                <textElement>
                    <font fontName="Times New Roman" size="12"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
            <textField evaluationTime="Auto" isBlankWhenNull="true">
                <reportElement positionType="Float" x="0" y="0" width="100" height="20" isRemoveLineWhenBlank="true" uuid="afda4fcc-78fc-46f9-8c5c-2e0c4f04dfa5"/>
                <textFieldExpression><![CDATA[$V{signatoryCurrentCount}<$V{REPORT_COUNT} ? "or" : ""]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

输出

result

  

请注意::对于Jasper报告,使用EvaluationTime =“ Auto”会占用大量资源,在大多数情况下,我建议用户将数据记录的总数传递给数据源,以更快地生成报告。