Я хотел был бы использовать subreports с плагинами янтаря grails, я последовали за руководством на этом url (http://www.grails.org/plugin/jasper). Вот мой код:Как использовать вложенные отчеты jasperreports с плагином ящеров grails?
домена Книга:
class Book {
static belongsTo = Library
Library library
String title
String author
String publisher
String category
static constraints={
title()
author()
publisher()
category()
}
}
домена Библиотека:
class Library {
static hasMany = [ books : Book ]
String name
String adresse
Date dateMaturity
static constraints = {
}
String toString()
{
return name
}
}
В моей BookController, у меня есть:
def createReport = {
def books = Book.list()
chain(controller:'jasper',action:'index',model:[data:books],params:params)
}
В моей LibraryController, у меня есть:
def createReport = {
def library = Library.list()
chain(controller:'jasper',action:'index',model:[data:library],params:params)
}
Моя яшма часть:
У меня есть SubReport файл: books.jasper (получить список книг).
Также MasterReport: library.jasper (получить список библиотек).
В моем MasterReport (library), я добавил subreport, я хотел бы, для каждой библиотеки, показать список книг, которые он содержит; Вот мой код библиотеки:
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
...
<field name="books" class="java.util.Collection"/>
...
<subreport isUsingCache="true">
<reportElement x="0" y="25" width="437" height="100"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{books})]]></dataSourceExpression>
<subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "books.jasper"]]>
</subreportExpression>
</subreport>
И у меня есть эта ошибка:
Ошибка 500: Выполнение действия [индекс] контроллера [JasperController] в плагине [яшма] вызывается исключение: net.sf. jasperreports.engine.fill.JRExpressionEvalException: Ошибка вычисления выражения: Исходный текст: новый net.sf.jasperreports.engine.data.JRBeanCollectionDataSource ($ F {} книги)
Сообщение исключения: не удалось инициализировать лениво коллекцию роли: bookshelf.Library.books, сеанс или сеанс не закрыты
Благодарим за помощь.
Используя «def library = Library.list()», у меня также есть список, и я передаю также свой список контроллеру яшмы. Какая разница? –
Library.list() предоставляет вам список объектов домена, лениво извлеченных, так что книги еще не извлекаются из базы данных. Они будут получены по требованию. Но список LibraryVO, который мы передаем, уже будет иметь объекты книги. И поэтому нам не нужно говорить «ленивый»: ложный. Извлечение объектов лениво - это работа сеанса спящего режима, и отчеты яшмы полностью не знают об этом. –