Показать "Страница X of Y", используя одно текстовое поле

Я хотел бы создать одно текстовое поле, содержащее Page X of Y, без разделения его на две части, в соответствии с общим решением. Мое текстовое поле содержит "Page " + $V{currentPage} + " of " + $V{PAGE_NUMBER}" с evaluationTime=auto.

Скажем, у меня есть отчет с 10 страницами. Три являются Заголовок полосы, шесть - Подробный диапазон, а один - Сводная группа. Мои результаты показывают "Page 0 of 10" для диапазона заголовков, правильные подсчеты для Подробный диапазон s, а затем "Page 0 of 10" для Сводная группа..

Как вы гарантируете, что переменная вычисляется везде, а не только в Детальной группе?

Ответ 1

Студия Джасперсофт, 6+

Для Jaspersoft Studio v6 или если дублируется номер первой страницы, попробуйте это решение, в котором используются $V{MASTER_CURRENT_PAGE} и $V{MASTER_TOTAL_PAGE} со временем оценки Master.

Джасперсофт Студио

Для других версий Jaspersoft Studio попробуйте выполнить действия, описанные в последующих подразделах.

Создать переменную

Создайте переменную следующим образом:

  1. Создайте переменную с именем V_CURRENT_PAGE_NUMBER
  2. Выберите переменную, чтобы открыть ее свойства (показано ниже)
  3. Установите выражение на: 1
  4. Установите начальное значение выражения: $V{PAGE_NUMBER}
    • Если номер страницы показывает 0, используйте $V{PAGE_NUMBER} + 1.
    • Если номер страницы всегда показывает 1 of Y, установите для выражения значение $V{PAGE_NUMBER} вместо выражения начального значения и оставьте выражение начального значения пустым.
  5. Установите тип сброса на: Page

Эти настройки показаны на следующем рисунке:

Current Page Number Variable

Установка выражения в 1 предотвращает его значение, равное null. То есть, если нижний колонтитул показывает Page null of 4, это, вероятно, означает, что выражение не было установлено.

Переменная создана.

Добавить нижний колонтитул

Добавьте полосу нижнего колонтитула страницы следующим образом:

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

Нижний колонтитул добавлен.

Создать текстовое поле

Создайте текстовое поле следующим образом:

  1. Перетащите одно текстовое поле на нижний колонтитул страницы.
  2. Выберите текстовое поле.
  3. Установите для выражения значение: msg("Page {0} of {1}", $V{V_CURRENT_PAGE_NUMBER}, $V{PAGE_NUMBER})
  4. Установите время оценки на: Auto

Эти настройки показаны на следующем рисунке:

Single Text Field

Единственное текстовое поле создано.

Предварительный отчет

Для отчета с тремя страницами и страницей со сводной информацией предварительный просмотр отчета показывает:

Page 1

Сводная страница показывает:

Page 4

См. Сообщение в блоге Роберта Энсингера на эту тему для более подробной информации.

Ответ 2

Я попробовал этот подход, но в итоге получил неправильные номера страниц: {1/7, 1/7, 2/7, 3/7, 4/7, 5/7, 6/7}.

Для JasperReports 6+ используйте системные переменные MASTER_CURRENT_PAGE и MASTER_TOTAL_PAGES и не забудьте установить время оценки текстового поля в Master:

<textField evaluationTime="Master">
    <textElement textAlignment="Right"/>
    <textFieldExpression><![CDATA[msg("Page {0} of {1}", $V{MASTER_CURRENT_PAGE}, $V{MASTER_TOTAL_PAGES})]]></textFieldExpression>
</textField>

Смотрите: http://jasperreports.sourceforge.net/sample.reference/book/index.html.

Ответ 3

Общий подход, как вы упомянули, использует два разделенных текстовых поля:

Текущий номер страницы

$V{PAGE_NUMBER} с EvaluationTime: Now

Общий номер страницы

$V{PAGE_NUMBER} с EvaluationTime: Report

Ответ 4

Относительно текущего номера страницы, evaluationTime=now и $V{PAGE_NUMBER} - ваш ответ.

К сожалению, я не думаю, что вы можете достичь того, чего хотите, потому что есть ошибка в PAGE_COUNT, когда режим разделения разрешен включен для группы деталей, В противном случае evaluationTime=now и "Page " + $V{PAGE_NUMBER} + " of " + $V{PAGE_COUNT}", вероятно, будут работать.

Ответ 5

Это должно помочь, используя оценку времени в качестве отчета

   <textField>
        <reportElement x="497" y="0" width="32" height="12" forecolor="#7E8083"
                           uuid="ef663cfd-4058-40bb-a6d9-de7f9a8164be"/> --update your elements here
        <textElement textAlignment="Right" verticalAlignment="Middle">
            <font fontName="SansSerif" size="7" pdfFontName="OpenSans-Regular.ttf"/>
        </textElement>
        <textFieldExpression>
            <![CDATA["Page " + $V{PAGE_NUMBER} + " of"]]>
        </textFieldExpression>
   </textField>
   <textField evaluationTime="Report">
        <reportElement x="529" y="0" width="7" height="12" forecolor="#7E8083"
                           uuid="ef663cfd-4058-40bb-a6d9-de7f9a8164be"/>  --update your elements here
        <textElement textAlignment="Right" verticalAlignment="Middle">
            <font fontName="SansSerif" size="7" pdfFontName="OpenSans-Regular.ttf"/>
            </textElement>
            <textFieldExpression>
                <![CDATA[$V{PAGE_NUMBER}]]>
            </textFieldExpression>
   </textField>

Ответ 6

Эта работа для меня (немного отличается от Дейва Ответа)

* Использование JasperSoft Studio

Capture: adding Variable

Затем поместите текстовое поле с выражением:

"Pág. " + $V{PAGE_NUMBER} +"/" + $V{V_CURRENT_PAGE_NUMBER}

Надеюсь, это поможет!