【问题标题】:How to print text for each iteration in the detail except for the last one?除了最后一次之外,如何详细打印每次迭代的文本?
【发布时间】:2019-03-12 17:27:40
【问题描述】:

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

这是我现在拥有的一个示例:

子报表末尾还有一个额外的

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

<?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>

如何避免在最后一条记录之后打印最后一个文本字段?

【问题讨论】:

    标签: jasper-reports


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您想利用evalutationTime="Auto"

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

      来自EvaluationTimeEnum

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

      将您的 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>
      

      要理解重置类型为“Auto”的表达式,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>
      

      输出

      请注意: jasper 报告使用evaluationTime="Auto" 是资源密集型的,在大多数情况下,我会建议用户在数据源中传递记录总数,这样会更快地生成报告。

      【讨论】:

      • 嗨@PetterFriberg,感谢您一如既往的帮助。我也有同样的想法,就像我有两个选择一样,要么使用 JasperReport 中的可用选项(这是这个评估时间,谢谢你给我这个信息),或者只是传递数据源中的记录总数。我可以简单地通过在 Java 程序中获取数组的长度来使用它。我会在一天之内向你更新这件事。 =)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多