4

ReportLibraries のコンポーネントを使用して BIRT ReportDesign を動的に組み立てる環境があります。これらの ReportLibraries はデータベースに保存され、ファイル システムのどこにもありません。

私がやろうとしているのは、セッションでライブラリを開いて、ライブラリに名前を付け、InputStream (テスト リソースからの FileInputStream) を指定することです。

    SessionHandle session = de.newSessionHandle(ULocale.ENGLISH);

    LibraryHandle library = session.openLibrary("lib01.rptlibrary", is);

次に、ReportDesign を作成し、ライブラリを (名前で?) インクルードします。

    ReportDesignHandle reportDesign = session.createDesign();

    reportDesign.includeLibrary("lib01.rptlibrary", "lib01");

後で、ライブラリでテーブル要素を検索し、それをデザインにコピーしようとします。

    ElementFactory elementFactory = reportDesign.getElementFactory();

    DesignElementHandle deh1 = library.findElement("NewTable");

    DesignElementHandle ldeh1 = elementFactory.newElementFrom(deh1, "newTable");

この時点で、次の例外が発生します。

 org.eclipse.birt.report.model.api.command.InvalidParentException: The library for the parent element "Table("NewTable")" is not included.
at org.eclipse.birt.report.model.api.ElementFactoryImpl.newElementFrom(ElementFactoryImpl.java:968)
at org.eclipse.birt.report.model.api.ElementFactory.newElementFrom(ElementFactory.java:1)

ライブラリが見つかり、DesignElementHandle が実際にデザインにコピーしたいコンポーネントを指しているように見えますが、セッションで開かれたライブラリが ReportDesign で見つかりません。

FileSystem 以外のリソースからライブラリを含めるか、セッションからライブラリを含めるように ReportDesign に指示する方法はありますか?

ReportDesign をアセンブルするために自分の FielSystem に rptlibrary ファイルを配置する必要は、どうしても避けたいと考えています。

4

1 に答える 1

1

ライブラリからレポート内の要素ハンドルを取得しようとする前に、レポートに最初にライブラリを含める必要があると思います。

includeLibrary(filename, namespace)関数は、ファイル システムからライブラリをロードするためにのみ使用できます。したがって、データベースのコンテンツから一時ファイルを作成する必要があると思いますが、レポートの作成後に削除できます。

//add this
reportDesign.includeLibrary(filename, namespace);

ElementFactory elementFactory = reportDesign.getElementFactory();

DesignElementHandle deh1 = library.findElement("NewTable");

DesignElementHandle ldeh1 = elementFactory.newElementFrom(deh1, "newTable");
于 2015-02-06T10:15:08.733 に答える