Как заставить Jasper Reports программно определять имя столбцов внутри самого отчета? - PullRequest
0 голосов
/ 30 сентября 2011

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

NAME -> September -> August -> July -> June -> May -> April

ss заголовки столбцов. Я пытаюсь избежать передачи их в качестве параметров и пытаюсь заставить Jasper Reports выяснить это во время выполнения. Я могу получить первый месяц довольно легко, используя выражение текстового поля. Похоже:

new java.text.SimpleDateFormat("MMMMM").format(new Date())

Проблема приходит с другими месяцами. Я изначально пробовал

new java.text.SimpleDateFormat("MMMMM").format(java.util.Calendar.getInstance().add(Calendar.MONTH, new Integer("-1)).getTime())

Это не работает, поскольку Calendar.add не возвращает экземпляр Calendar. Затем я попытался использовать переменную, а затем комбинацию переменных, которые также не работали.

Как заставить Jasper Reports программно определять имя столбцов в самом отчете?

Ответы [ 3 ]

1 голос
/ 01 октября 2011

Я думаю, что лучший подход к решению этой проблемы - использовать Commons Lang .Этот пакет предоставляет утилиты, которые очень легко делают подобные вычисления.Добавив один дополнительный jar, вы можете использовать выражения вроде этого:

DateUtils.addMonths(new Date(),-1)

Я считаю, что это проще поддерживать, чем сначала создать вспомогательный класс Calendar, а затем использовать троичный оператор, но игнорировать его результаты.

$P{cal}.add(Calendar.MONTH, -1)
? null : $P{cal}.getTime()

Если вам когда-либо понадобится обобщить решение, гораздо проще получить Date обратно из SQL-запроса, чем получить Calendar.Таким образом, вы можете быстро изменить на «DateUtils.addMonths ($ F {MyDate}, - 1)».Инициализация Календаря для соответствия дате, возвращаемой запросом, не так проста.Но, конечно, есть определенное преимущество в том, что вам не нужно добавлять еще один файл .jar.Поэтому иногда этот троичный оператор является самым быстрым способом достижения цели.

Я писал об использовании подхода Commons Lang пару лет назад здесь: http://mdahlman.wordpress.com/2009/09/09/jasperreports-first-dates/

1 голос
/ 31 октября 2013

Мне также нужен был определенный формат для предыдущего месяца.В итоге я скомбинировал два других ответа:

new java.text.SimpleDateFormat("yyyyMM").format(
    org.apache.commons.lang3.time.DateUtils.addMonths(
        new java.util.Date(),
        -6
    )
)

Таким образом, мне не нужно добавлять другой параметр.Добавление Commons Lang jar для меня не проблема, так как JasperServer 5.5 поставляется с версией 3.0 из коробки.

Я надеюсь, что это поможет тому, кто запинается на этой странице, так же как и я.

0 голосов
/ 01 октября 2011

Я нашел рабочее решение, которое довольно гениально (нет, я не придумал его).Я нашел это здесь .Суть его заключается в создании параметра под названием call со значением по умолчанию:

Calendar.getInstance()

и отмените выбор параметра «Использовать как приглашение».Затем в выражении вашего текстового поля вы должны сделать:

new java.text.SimpleDateFormat("MMMMM").format(
    (
     $P{cal}.add(Calendar.MONTH, -1)
    ? null : $P{cal}.getTime()
    )
)

Что произойдет, если он установит значение по умолчанию для экземпляра календаря, затем выполнит метод add, который преобразуется в false, так что тогда он будет затемвернуть результат из метода getTime (), который отформатирован так, как я хочу.

...