Как напечатать текст для каждой итерации в деталях, кроме последней? - PullRequest
1 голос
/ 12 марта 2019

У меня есть подотчет, который повторяет имена.Я хочу напечатать текст «или» в каждом цикле, кроме последнего.Прямо сейчас я делаю предложенное решение в этом вопросе , но оно все еще печатает в последней итерации.

Вот пример того, что у меня сейчас есть:

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>

Как можно избежать печати последнего текстового поля после последней записи?

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Вы можете попробовать простую вещь, поместить в отчет 2 переменные, я думаю, вы уже знаете, сколько страниц будет содержать ваш отчет, а затем изменить выражение printWhenExpression на значение вашей страницы, например, вашего отчета. содержит 20 страниц, затем в вашей переменной измените условие печати на PAGE_NUMBER==20 и PAGE_NUMBER < 20 для другого. Удачи.

1 голос
/ 12 марта 2019

Если вам нравится кредитное плечо 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>

Чтобы понять выражение с типом сброса «Авто», 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

Заметьте: использованиеvaluationTime = "Auto" является ресурсоемким для отчета jasper, в большинстве случаев я хотел бы предложить, чтобы пользователи передавали в источник данных общее количество записей, отчет будет сгенерирован быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...