1

Grails jasper プラグインでサブレポートを使用したいので、この URL ( http://www.grails.org/plugin/jasper ) のマニュアルに従いました。これが私のコードです:

ドメインブック:

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)
}

私の碧玉の部分は次のとおりです。

サブレポート ファイル: books.jasper (本のリストを取得) があります。
また、MasterReport : library.jasper (ライブラリのリストを取得)。

私の MasterReport(library) に、サブレポートを追加しました。ライブラリごとに、含まれている本のリストを表示したいと思います。ここに私のライブラリコードがあります:

<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:プラグイン [jasper] でコントローラー [JasperController] のアクション [インデックス] を実行すると例外が発生しました: net.sf.jasperreports.engine.fill.JRExpressionEvalException: 式の評価中にエラーが発生しました: ソース テキスト: 新しい net.sf.jasperreports.engine.data .JRBeanCollectionDataSource($F{books})
例外メッセージ:ロールのコレクションの遅延初期化に失敗しました: bookshelf.Library.books、セッションまたはセッションが閉じられませんでした

ご協力ありがとう御座います。

4

5 に答える 5

1

Jasperレポートは、オブジェクトのリストを期待しているだけです。GORMクエリを理解していません。したがって、私たちが行う方法は、「オブジェクトの表示」という名前のオブジェクトの個別のリストを作成し、ドメインクラスではなくジャスパーレポートに送信することです。

 class LibraryVO {
   List books
   String name
   String adresse
   Date dateMaturity
  }

 class bookVO {
  String title
    String author
    String publisher
    String category
  }

次のようにリストを初期化できます

 List data=[]

 LibraryVo libVo= new LibraryVO(...) // inalise it here
 libVo.books = [new BookVO(),new BookVO()]

 data << libVO

そしてリストをジャスパーコントローラーに渡します

(chain(controller:'jasper',action:'index',model:[data:data],params:params).
于 2010-04-30T06:28:13.987 に答える
0

私は問題を見つけます:

Library ドメインで、「books lazy: false」を使用してマッピングを追加するだけです。

class Library {

  static hasMany = [ books : Book ]

  String name
  String adresse
  Date dateMaturity

    static constraints = {
    }

    static mapping = {
    books lazy: false
  }

        String toString()
    {
        return name
    }
}

そして今、私はトラブルなしで私のレポートを持っています!


grails jasper プラグインは chain を使用して、モデルを 1 つのアクションから次のアクションにチェーンします ( chain(controller:'jasper',action:'index',model:[data:library],params:params)。

その後、jasper コントローラーで、次の行でモデルを取得します。

def testModel = this.getProperties().containsKey('chainModel')?chainModel:null

何らかの理由で、ライブラリ コレクションで、書籍リストにエラーが発生しました。

「lazy: false」を使用して、ドメイン クラスの他のすべてのインスタンスをプルします。

この問題を解決する別の方法はありますか?

于 2010-04-29T19:36:52.937 に答える
0

jasper レポートを使用して gorm を呼び出すことができますが、レポートの言語をデフォルトの Java ではなくgroovyに設定する必要があります。次に、サブレポートを使用する場合は、jasper レポートのマルチスレッドを無効にして、追加の jar を追加する必要があります。それは完璧に機能します。

于 2015-03-23T10:57:51.960 に答える
0

*.jasper (DataSource XML。iReport を使用) があります。どのようにそれを渡すことができますか (XML として本)??

事前に感謝

于 2014-04-29T04:32:50.310 に答える
0

LazyInitializationException は、testModel のオブジェクトが現在の休止状態セッションに接続されていないために発生します。次のように JasperController をハッキングすることで、これを回避しました。

class JasperController {
    JasperService jasperService

    // We need this to access the current hibernate session
    def sessionFactory

    def index = {
        println(params)

        def testModel = this.getProperties().containsKey('chainModel') ? chainModel : null

        // Re-attach model objects to avoid LazyInitializationException.
        def session = sessionFactory.getCurrentSession()
        testModel?.data?.each
        {
            session.update(it)
        }

        JasperReportDef report = jasperService.buildReportDefinition(params,            request.getLocale(), testModel)
        generateResponse(report)
    }

... 等々。これにより、モデル オブジェクトが再アタッチされ、LIE が回避されます (熱心なフェッチを行う必要はありません)。

于 2011-09-05T05:26:38.840 に答える