Вопрос по jasper-reports – Как скрыть страницу x of y, когда в моем отчете о яшме есть только одна страница

2

Я использую jasper-reports 4.5.0 и создаю отчеты. Мое требование - если в моем отчете только одна страница, то он не должен отображать страницу 1 0f 1. Как я могу это сделать. Чтобы отобразить страницу x of y Я использую приведенные ниже строки кода.

  <textField>
                <reportElement x="395" y="121" width="20" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="350" y="121" width="45" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA["PAGE"]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="415" y="121" width="25" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA["OF"]]></textFieldExpression>
            </textField>
            <textField evaluationTime="Report">
                <reportElement x="440" y="121" width="19" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
            </textField>

Это недавно измененный код.

<variable name="NPAGES" class="java.lang.Integer" calculation="Highest">
        <variableExpression><![CDATA[$V{PAGE_NUMBER}]]></variableExpression>
        <initialValueExpression><![CDATA[$V{PAGE_NUMBER}]]></initialValueExpression>
    </variable>

<textField>
                <reportElement x="395" y="121" width="20" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? $V{PAGE_NUMBER} : ""]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="350" y="121" width="45" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? "PAGE" : ""]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="415" y="121" width="25" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? "OF" : ""]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="440" y="121" width="19" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? $V{NPAGES} : ""]]></textFieldExpression>
            </textField>

Ваш Ответ

3   ответа
0

Шаг 1: создайте переменную так, чтобы она сохраняла номер текущей страницы.

<variable name="V_CURRENT_PAGE_NUMBER" class="java.lang.Integer" resetType="Page">
    <variableExpression><![CDATA[1]]></variableExpression>
    <initialValueExpression><![CDATA[$V{PAGE_NUMBER}+1]]></initialValueExpression>
</variable>

шаг 2: добавить текстовое поле, оценка должна бытьAuto.

Значение будет

$V{PAGE_NUMBER}>1?msg("Page {0} of {1}",$V{V_CURRENT_PAGE_NUMBER},$V{PAGE_NUMBER}):" "

так что значение PAGE_NUMBER, если больше 1, печатать страницуcurrent_page изtotal_report_page ещеempty.

пример: страница 1 из 3

<textField evaluationTime="Auto">
            <reportElement positionType="Float" x="475" y="37" width="74" height="15"/>
            <textElement/>
            <textFieldExpression><![CDATA[$V{PAGE_NUMBER}>1?

msg("Page {0} of {1}", $V{V_CURRENT_PAGE_NUMBER}, $V{PAGE_NUMBER}):" "]]>

1

прямого способа достичь этого не существует. В тот момент, когда механизм заполняет страницу 1, он не знает, будет ли страница 2. Задержка времени оценки недостаточна, чтобы обойти это.

Самое простое подобное решение - просто спрятать & quot; страницу x от y & quot; на странице 1. Это не соответствует вашим заявленным требованиям ... но некоторым людям это нравится.

Лучшее относительно простое решение - подотчет. Создайте основной отчет, который просто выполняет ваш текущий запрос отчета. Создайте логический параметр с именем$P{subreport_has_more_than_one_page} (или используйте более сжатое имя). Надеемся, что вы можете использовать простую логику, например, зная, что ваш отчет будет состоять из нескольких страниц, если он вернет более 25 строк. Это не обязательно возможно ... но в очень большом проценте случаев реального мира это действительно возможно. Если ваши страницы зависят от непредсказуемого переноса длинного текста, это может быть сложно.

Предполагая, что вы можете определить значение для$P{subreport_has_more_than_one_page}Затем вы передаете этот параметр в подотчет. Подотчет - это просто существующий отчет. Вооружившись этим значением, тривиально добавить на страницу «Выражение при выражении» страницу «x из y»; на первой странице.

3

для которой задано общее количество страниц в отчете:

<variable name="NPAGES" class="java.lang.Integer" calculation="Highest">
    <variableExpression><![CDATA[$V{PAGE_NUMBER}]]></variableExpression>
    <initialValueExpression><![CDATA[$V{PAGE_NUMBER}]]></initialValueExpression>
</variable>

Теперь используйте эту переменную в качестве условия, чтобы определить, отображать ли номер страницы:

        <textField>
            <reportElement x="395" y="121" width="20" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? $V{PAGE_NUMBER} : ""]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement x="350" y="121" width="45" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? "PAGE" : ""]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement x="415" y="121" width="25" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? "OF" : ""]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement x="440" y="121" width="19" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? $V{NPAGES} : ""]]></textFieldExpression>
        </textField>

Я попробовал это в одном из моих отчетов, и это сработало.

извините, это не работает для меня. Логика - это что-то не так. Теперь она ничего не отображает на первых двух страницах и начиная с третьей страницы. Страница 3 из 2, страница 4 из 3, страница 5 из 4, как это. Всего страниц мой отчет 10. user1434746
Привет, спасибо, что дали ответ. Это решение работает нормально. Но если мой отчет имеет всего 10 страниц для первых двух страниц, он не показывает СТРАНИЦУ 1 из 10, СТРАНИЦУ 2 ИЗ 10 вместо этого показывает 10,10.Из на третьей странице он отображается нормально, как стр. 3 из 10. В чем может быть проблема. user1434746
На самом деле это даже не представляется возможным, не могли бы вы скопировать и вставить новый код в конец исходного вопроса, пожалуйста.
Я внес изменение в свой ответ, чтобы последний элемент использовал новую переменную NPAGES вместо PAGE_NUMBER, оцененной в & quot; Report & quot; время. Это должно исправить вашу проблему. Обратите внимание, что если вы считаете, что это правильный ответ, вы должны поставить галочку рядом с ответом, чтобы другие знали об этом. Кроме того, вы можете проголосовать за ответ, нажав на маленькую ^ рядом с ответом. Это стандартный протокол stackoverflow, и люди будут относиться к вашим вопросам более серьезно, если у вас есть хороший уровень принятия ответов. Спасибо!
Привет, я разместил недавно измененный код .... user1434746

Похожие вопросы