作成:小沢仁
このチュートリアルで習うこと
- データアダプタと接続の理解
- JDBC接続の作成と使い方
- レポートでJDBC接続の使い方
- JRDataSourceインターフェース
- データソースタイプ
- データソースのエクスポートとインポート
JasperReportsは複数の方法でレポートのデータを記入します。例えば、SQLクエリー文を直接レポートに記述してレポートで使うデータをデータベースから取得することができますし、もう少し高度な技術を使って値を取得することもできます。
Jaspersoft Studioはクエリー言語としてSQL, HQL, EJBQL, MDX, XPathなどのクエリー言語に対応しています。クエリー言語を使いたくないやレポートにクエリーを記述したくない場合はデータアダプタを使うことができます。データアダプタとは、簡単に言うと、テーブルのようなレコードセットを返すオブジェクトです。
データアダプタはJRDataSourceインターフェースを実装しています。JasperReportsは、Ja aBeansの配列/コレクション、ResultSet、テーブルモデル、CSV、XMLファイルなど多くのデータソースを標準で用意しています。本チュートリアルではその少しの説明をします。
Jaspersoft StudioはSQLクエリーを実行するJDBC接続、Springを使ったHibernate接続, JRDataSourceを実装したカスタム接続、更にカスタムクエリー言語をサポートしています。
データアダプタと接続
Jaspersoft Studioのデータアダプタとは、レポートを記入するためのデータを特定する情報を記述したXMLファイルです。データのURL、データを取得するためのユーザ名/パスワード、パスなどを情報が記述されています。データアダプタは、JasperReportsがクエリーを実行してデータを取得するための情報も含まれています。しかし、データアダプタにはデータそのものを含まれていません。
Jaspersoft Studioのデータアダプタは次のようなことを行います:
- データ接続タイプの定義。接続はJasperReportsやJaspersoft Studioオブジェクトではなく、SQL接続です
- Jaspersoft Studioとデータを接続
- JasperReportsライブラリを使うのに必要な接続とパラメータの設定
Jaspersoft Studioで一番よく使われる接続方法はJDBCデータアダプタです。しかし、Jaspersoft Studioはこの他にも以下の接続をサポートしています:
- JDBC接続
- JavaBeansコレクションデータソース
- XMLデータソース
- CSVデータソース
- Hibernate接続
- SpringのHibernate接続
- Hadoop Hiveデータソース
- JRDataSourceProvider
- カスタムデータソース
- Mondrian OLAP接続
- XMLA接続
- EJBQL接続
- 空データソース
- XMLデータソースはXML文書のデータをレポートで使えるようにします
- CSVデータアダプタはCSVファイルのデータをレポートで使えるようにします
- JavaBeanデータソース、カスタムデータアダプタ、JRDataSourceProviderは、Javaクラスからのデータを使えるようにします
- Hibernate接続は、HQL(Hibernate Query Language)クエリーの結果をデータとして使えるようにします
- EJBQL(Enterprise JavaBean Query Language)クエリーは、EJBQL接続と使ってデータを取得できるようにします
- MDXクエリーを使ってMondrianサーバからデータを取得することや、XML/Aインターフェースを使ってOLAPデータベースからデータを取得することもできます
接続とデータアダプタはデータアダプタウィザードで編集できます。新しいデータソースを作成するには、リポジトリ・ビューから「データアダプタ」を右クリックした「データアダプタの作成」を選択します。
厳密に言うと接続とデータアダプタは異なるオブジェクトです。ただし機能的には同じ役割を行うので、本資料では用語を区別なしに入れ替えて使います。
レポートで有効なデータアダプタは、複数な方法で指定することができます。一番簡単な方法はレポジトリ・ビューから選択することです。
データアダプタが指定されていないと、レポートにデータを記入する処理が実行できません。そのため、デフォルトで空データアダプタが指定されます。データアダプタはレポートウィザードからも使われます。Jaspersoft Studioを使う時に先ず行うことは、データへの接続を設定することです。
JDBC接続の作成と使い方
JDBC接続を使うと、JDBCドライバを使ってデータベースからデータを取得することができます。新しいJDBC接続を定義する場合は次の手順で行います;
- 接続/データソース・ダイアログボックスから「新規」ボタンを押下します。
- 開いたページから「データベースJDBC接続」を選択します。
- 接続名を入力します(例えば、「MySQL - test」)
- JDBCドライバには、使うデータベース用のJDBCドライバを選択します。
赤色で表示されているJDBCドライバ名はJDBCドライバがクラスパスに未設定のものです。 - データベースに接続するためのユーザ名とパスワードを入力します。
[ Jaspersoft StudioはパスワードをEclipseセキュアストレージに保存します - 入力した設定を確認するために「テスト」ボタンを押下します。正しい場合は次の画面例のように「成功」と表示されます。
- ClassNotFoundError(JDBCクラスが見つかりません)
- URLが不正
- パラメータが間違っている(入力したユーザ名、パスワードなどが間違っている)
ClassNotFoundError
ClassNotFoundErrorエラーはクラスパスに指定したJDBCドライバが見つからない場合に表示します。例えばOracleデータベースを利用するとします。Jaspersoft StudioにはOracleのJDBCドライバが同梱されていません。JDBCドライバ一覧から「Oracle(oracle.jdbc.driver.OracleDriver)」を選択して「テスト」ボタンを押下すると、OracleのJDBCドライバがないためClassNotFoundErrorエラーになります。
この場合は、OracleのJDBCドライバを入手して、設定する必要があります。オラクルからJDBCドライバファイル(例:ojdbc14.zipファイル)を入手して、次の手順でJaspersoft Studioに登録します:
- データアダプタ・ダイアログから「ドライバクラスパス」タブを選択する
- 「追加」ボタンを押下して、入手したOracleのファイルを指定する
URLが不正
このエラーになる多くの場合は、JDBC URLの入力ミスなどをした場合です。エラーメッセージを見て、エラーの原因を調べて間違った箇所を修正してください。
パラメータが間違っている
ユーザ名及びパスワードが間違っていると、データベースからのエラーメッセージが表示されます。内容を確認して、設定を編集して再テストをします。
レポートでJDBC接続の使い方
JDBC接続を使ってレポート用のデータをデータベースか取得するには、データベーステーブルから必要なデータを取得するSQL文を記述します。接続はサブレポートやルックアップテーブルで使うこともできます。このような場合のためにJasperReportsはjava.sql.Connection型のパラメータ「REPORT_CONNECTION」を用意しています。このパラメータを使う場合は次のように記述します:
$P{REPORT_CONNECTION}
JDBC及びSQL接続は一番簡単に設定できる接続です。
フィールドの登録
SQLクエリー結果をレポートで使うには、レポートで使う結果列をフィールドとして登録する必要があります。使う列用のフィールドのみを登録して、使わない列用のフィールドの登録は不要です。
フィールド毎に名前と型を指定する必要があります。次の表はSQLデータ型に対応しているJavaのオブジェクトです。
SQL型 | Javaオブジェクト | SQL型 | Javaオブジェクト |
---|---|---|---|
CHAR | String | REAL | Float |
VARCHAR | String | FLOAT | Double |
LONGVARCHAR | String | DOUBLE | Double |
NUMERIC | java.math.BigDecimal | BINARY | byte[] |
DECIMAL | java.math.BigDecimal | VARBINARY | byte[] |
BIT | Boolean | LONGVARBINARY | byte[] |
TINYINT | Integer | DATE | java.sql.Date |
SMALLINT | Integer | TIME | java.sql.Time |
INTEGER | Integer | TIMESTAMP | java.sql.Timestamp |
BIGINT | Long |
SQL型が正しくJavaオブジェクトにマッピングされるかはJDBCドライバに依存します。SQLクエリーから取得するデータ型もJDBCドライバが返す値を利用しています。
レコードのフィルタ
JRDataSourceインターフェース
Jaspersoft Studioが提供しているデータソースの説明をする前に、JRDataSourceインターフェースの説明をします。JRDataSourceは次の2つのメソッドを実装する必要があります:
public Object getFieldvalue(JRField jrField)
public boolean next()メソッドが呼ばれる度にレポートのすべてのフィールの定義が読み込まれて評価されます。その結果でJasperReportsはグループヘッダを印刷する、新しいページを生成するなどの判断がされます。next()がfalseを返した場合は、最後の領域(グループフッター、列フッター、最後のページフッター、サマリーを印刷します。メソッドはレコード毎に呼ばれます。
next()の結果がtrueの場合は、public Object getFieldValue(JRField jrField)メソッドが呼ばれます。レポートで定義されているフィールド毎に呼ばれます。引数のJRFieldオブジェクトはフィールド名、説明、タイプの情報から構成されています。
getFieldValue()メソッドは引数のJRFieldで指定されたオブジェクトを返します。次のようにオブジェクトをキャストして使うことができます。ただし、結果がnullの場合もありますので注意してください。
(タイプ)オブジェクト
データソースタイプ
JavaBeansデータソースコレクション
JavaBeansセットデータソースは、JavaBeansからデータを取得してレポートで使えるようにします。JavaBeansは属性の値をgetter()メソッドで取得できるようにしたJavaクラスです。メソッドは次なようなシグニチャーを持ちます:
public <返り値のタイプ> getXXX()
<返り値のタイプ>はジェネリックスJavaクラスかプリミティブ・タイプ(例:int, double)です。
JavaBeans用の接続を使う場合は次の手順を行います:
JavaBeansセットデータソース
JavaBeansセットデータソースはget()メソッドを使ってフィールドのデータを取得します。例えば、JavaBeansにgetXyz()メソッドがある場合は、「xyz」がレコードフィールド名です。
例のPersonBeanオブジェクトには2つのフィールドがあります:nameとage。フィールドのデータ型はStringとIntegerです。
空白のレポートを作成して次の手順で2つのフィールドを作成します:
- アウトライン・ビューからフィールドを右クリックして「フィールドの追加」
- ダイアログブックスにフィールド名と型を入力して「OK」ボタンを押下します。
フィールド名:name
フィールド型:java.lang.String - 同じように次のフィールドの作成します:
フィールド名:age
フィールド型:java.lang.Integer - フィールドを詳細領域に配置します。
- データソースが「Test Factory」であることを確認して、レポートをプレビュー表示します。
JavaBeansセットデータソースのプロパティを設定する時に、Use field descriptionフラグが設定されていると、JavaBeans属性とフィール値のマッピングはフィールド名ではなく、フィールドの説明で行われます。データソースは説明のみを参照します。フィールド名は自由に設定することができます。
Jaspersoft StudioはJavaBean属性をレポートフィールドにマッピングするためのGUIツールを用意しています。次の手順で使えます:
- クエリーウィンドウを開く
- 「JavaBeanデータソース」を選択する
- 使うBeanの完全クラスパスを入力する
- 「属性の読込み」をクリックする
指定したBeanクラスの属性一覧が表示します
フィールドをマップするには、属性名を選択して、「選択したフィールドを追加」ボタンを押下します。
XMLデータアダプタ
JasperReportsはXMLを3つの方法でデータアダプタとして使えます:XML文書、リモートXML文書、XMLAサーバ。
XML文書はツリー構造の場合が多く、JasperReportsが必要とする表形式とは異なります。XML文書の特定のノードとフィールドをマッピングします。ノードを特定するのにXPathを使います。XPathに付いてはhttp://www.w3.org/TR/xpathを参照してください。
XPathを使ってXML文書とレポートのフィールドをマッピングするサンプルを見せます。
次のXML文書のような住所登録票があるとします。人の住所がグループ分けで管理されています。住所情報の後にブックマーク情報があります。
<addressbook> <category name="home"> <person id="1"> <lastname>Davolio</lastname> <firstname>Nancy</firstname> </person> <person id="2"> <lastname>Fuller</lastname> <firstname>Andrew</firstname> </person> <person id="3"> <lastname>Leverling</lastname> </person> </category> <category name="work"> <person id="4"> <lastname>Peacock</lastname> <firstname>Margaret</firstname> </person> </category> <favorites> <person id="1"/> <person id="3"/> </favorites> </addressbook>
/addressbook/category/person XPATHを適用すると次の4つのノードが帰ってきます:
<person id="1"> <lastname>Davolio</lastname> <firstname>Nancy</firstname> </person> <person id="2"> <lastname>Fuller</lastname> <firstname>Andrew</firstname> </person> <person id="3"> <lastname>Leverling</lastname> </person> <person id="4"> <lastname>Peacock</lastname> <firstname>Margaret</firstname> </person>
/addressbokk/favorites/person
XPathを適用すると、次ぎのノードが帰られます:
<person id="1"/> <person id="3"/>
<person id="4"> <lastname>Peacock</lastname> <firstname>Margaret</firstname> </person>
新しいデータソースのウィンドウを開き、次の画面のように「XMLファイル」データソースを選択します。
必須の情報はXMLファイル名のみです。静的なXPathを指定してノードを選択することもできます。レポートにXPathを直接書くこともできます。
XPathの中でパラメータを使うことができるので、レポートが定義したXPathを使うことを推奨します。また、文字列をDateやDoubleのようにJavaオブジェクトに変換するJavaパターンを指定することもできます。XMLを解析するのに使うロケールとタイムゾーンを定義することもできます。
XMLデータソースでフィールドの登録
XMLデータソースの場合は同じ名前及び型のノードが複数存在することが可能なので、フィールド名と型の他にもノードを特定するための定義をフィールドの説明に設定します。説明に設定する定義は、選択されたノードからの相対ノードで行います。
次の文法で、現ノードの属性の値を取得します:
@lt;名前 属性>
たとえば、フィールドがpersonのid属性を使って識別される場合は、フィールドの説明を次のように設定します:
@id
現ノード(personノード)の子ノードであるlastnameノードを取得する場合は次のようにフィールドの説明を設定します:
lastname
現ノードの親ノードを取得する場合は、次ぎのように記述します:
ancestor::category/@name
キーワード「ancestor」は現ノードの最初の親ノードを指します。「@name」はそのname属性を指します。
次のようにフィールドを定義したレポートを作成してください:
フィールド前 | 説明 | 型 |
---|---|---|
id | @id | Integer |
lastname | lastname | String |
firstname | firstname | String |
name of category | ancestor::category/@name | String |
同じようにしてノード及び属性を右クリックして「ノードをフィールドに追加」を選択します。Jaspersoft Studioは設定された情報からXPathを生成して、フィールドの生成と設定を行います。必要に応じて生成されたフィールド名やデータ型定義を編集します。
生成されたフィールドをレポートの詳細領域に配置して見てください。プレビューに切り替えると、XMLファイルから読み込んだデータを埋め込んでレポートを生成します。
クエリーダイアログで指定したノードセットのXPathは次の通りです:
/addressbook/category/person
XMLデータソースとサブレポート
ノードセットはノードをレコード風に扱えるようにします。ただし、ツリー構造であるXML文書の他ノードを見たい場合もあります。例えば次のようなXML文書があるとします。personノードにhobbiesノードとemailノードがあるとします。
<addressbook> <category name="home"> <person id="1"> <lastname>Davolio</lastname> <firstname>Nancy</firstname> <email>davolio1@sf.net</email> <email>davolio2@sf.net</email> <hobbies> <hobby>Music</hobby> <hobby>Sport</hobby> </hobbies> </person> <person id="2"> <lastname>Fuller</lastname> <firstname>Andrew</firstname> <email>af@test.net</email> <email>afullera@fuller.org</email> <hobbies> <hobby>Cinema</hobby> <hobby>Sport</hobby> </hobbies> </person> </category> <category name="work"> <person id="3"> <lastname>Leverling</lastname> <email>leverling@xyz.it</email> </person> <person id="4"> <lastname>Peacock</lastname> <firstname>Margaret</firstname> <email>margaret@foo.org</email> <hobbies> <hobby>Food</hobby> <hobby>Books</hobby> </hobbies> </person> </category> <favorites> <person id="1"/> <person id="3"/> </favorites> </addressbook>
このようなレポートはサブレポートを使って作成することができます。具体的に言うと、メールアドレス一覧、趣味一覧、興味がある人一覧用の3つのサブレポートを作成します。これらのサブレポートで使うデータソースを定義する必要があります。この場合はJRXmlDataSourceを使うことができます。このインターフェースには次の2つのメソッドがあります:
public JRXmlDataSource dataSource(String selectExpression)
public JRXmlDataSource subDataSource(String selectExpression)
最初のメソッドはXML文書のルートノードを対象にし、文書の全体を処理します。2番目のメソッドは現ノードからのノードを対象にする。
サブレポートで両メソッドを使って動的にサブレポート要素にデータソースを引き渡すことができます。重要なことは、動的にデータソースの作成とノード選択を行えることです。
データソースを作成してサブレポートにメールアドレスを提供する定義は次の通りです:
((net.sf.jasperreports.engine.data.JRXmlDataSource)
$P{REPORT_DATA_SOURCE}).subDataSource("/person/email")
上のコードは現ノード(person)の直子孫のメールアドレスを返します。
趣味用のサブレポートも類似しています。ただし、ノード選択でメールの代わりにhobbies/hobbyを選択します。
((net.sf.jasperreports.engine.data.JRXmlDataSource)
$P{REPORT_DATA_SOURCE}).subDataSource("/person/hobbies/hobby")
次にマスタレポートのフィールドを定義します。サブレポートでは現ノードの値を参照する必要がありますので、現ノードを示す「.」を使います。
マスタレポートxml_addressbook.jrmlにグループ「Name of category」を作成します。このグループはカテゴリフィールド「$F{name of category}」に関連付けます。「Name of category」のグループヘッダにカテゴリ名(category name)を表示するフィールドを挿入します。挿入することにより、人(person)はカテゴリ別にグループされます。
詳細領域にid、lastname、firstnameを配置します。これらのフィールドの下に2つのサブレポートを配置します。上はメールアドレス、次ぎに趣味を表示するサブレポートを配置します。
メールと趣味サブレポートは扱っているフィールド以外では同じです。両レポートの大きさはマスタレポートのサブレポートコンポーネントの大きさと同じにします。サブレポートの余白を無くして、幅をマスタレポートのサブレポートコンポーネントの幅と同じにしてください。
両サブレポートをコンパイルして.jasperファイルを生成するために、各サブレポートをプレビュー表示します。データの書き込み処理でエラーになりますが、無視してください。XPathクエリーを設定していないのでJasperReportsがデータを見つかることができないのです。XPathを設定するとエラーはなくなります(ただし、最終レポートではこのXPathは使いません)。空データソースを使うことでもエラーは出なくなります。
サブレポートをプレビューしてコンパイルした後に、マスタレポートをプレビューします。正しく動いた場合は、カテゴリ別に人とそのメールアドレスと趣味一覧が表示されます。
この例題でXPathを使ってXMLデータソースを柔軟に処理できることがお分かりになれましたでしょうか?
CSVデータソース
当初、CSVデータソースはCSV形式のファイルを読み込んで、レポートを作成するカスタムデータソースの作り方のサンプルでした。しかし、JasperReportsが正式にCSVデータソースをサポートするようになってから、より簡単にCSVを使えるような機能が追加されました。
CSVファイルの接続を作成するには、接続/データソースダイアログボックスから「新規」ボタンを押下して、データソースタイプ一覧から「ファイルCSVデータソース」を選択します。次のようなダイアログボックスが表示します。
接続の名前を入力して、CSVファイルを選択します。次の方法で、列名に対応したフィールドを登録します。
- CSVファイルの最初の行に列名がある場合は、その列名からフィールドを生成することができます。「最初の行から列名を取得」ボタンを押下すると列名が読み込まれます。最初の行をレポート用データに使わないように、「最初の行をスキップ」をチェックします。「最初の行から列名を取得」を利用する場合は、最初の行の列名が使われます。読み込まれた列名は編集しないでください。
- 最初の行に列名が記載されていない場合は、列毎に名前を設定してください。名前は次いの形式にしてください:
COLUMN_0, COLUMN_1,...
JasperReportsはすべての行のすべての列に値があることを前提にしています。値が無い場合は空の値に設定してください。
CSVデータソースフィールドの登録
CSVデータソースを作成した場合は、そのデータをレポートで使えるようにするために列名とフィールドのマッピングが必要です。CSV列用のフィールを定義するには、CSVデータソースを選択して、クエリーダイアログボックスを表示します。データセットとクエリーダイアログを開き、「フィールドの読込み」ボタンを押下します。
Jaspersoft Studioは、すべてのフィールドの型をjava.lang.Stringに設定します。列は数値、日付、論理地などの場合はデータ型を変更してください。日付の形式は「カスタム日付形式」チェックボックスをチェックして指定することができます。
JREmptyDataSource
JasperReportsにはJREmptyDataSourceと言う特別なデータソースがあります。
next()メソッドは1回のみtrueを返して、getFieldValue()メソッドは何時もnullを返します。フィールドがないレコードのような操作をします。
このクラスのコンストラクタは次の通りです:
public JREmptyDataSource(int count)
public JREmptyDataSource()
最初のコンストラクタは返すレコード数を引数にします。2番目のコンストラクタはレコードを1に設定します。
Jaspersoft Studioはデフォルトでは、空のデータを1レコード返します。
次の手順で複数のレコードの空データソースを作成することができます:
- リポジトリ・ビューの「1つの空レコード」をダブルクリックします。
データアダプタウィザードが開きます。 - 必要な空レコードの行数を入力します。レポートにフィールドを設定しても何時も値はnullになります。データソースはフィールド名及びデータ型を参照しないので、レポートをテストするときに便利です
- 「完了」ボタンを押下します
HQLとHibernate接続
JasperReportsレポートでHQLを使うことができます。使う場合は次の手順を行います:
- Hibernate接続をセットアップします
- クラスパスを展開してHibernateマッピングで使うすべてのクラス、jarファイル、設定ファイルを含めます
次の手順でオブジェクトをクラスパスに設定できます:
- リポジトリ・ビューから「新規のデータアダプタ」をダブルクリックします
- 「ドライバクラスパス」タブを選択します
- 「追加」ボタンを押下します
- jarファイルのフォルダに移動します
- 「開く」ボタンを押下します
- すべてのファイルがクラスパスに含まれるまで繰り返します
- データアダプタ名を入力します
- hibernate.cfg.xmlがクラスパスに正しく含まれているか確認するため、「テスト」ボタンを押下して
- 「完了」ボタンを押下します
Hibernate接続を設定した後は、HQLクエリーを使ってレポートに使うデータを取得することができます。SQLクエリーの場合と同じように、クエリーダイアログから言語(この場合はHQL)を選択して、HQLクエリーを入力します。
フィールドマッピングは次のように行われます:
- クエリーが1行に1つのオブジェクトを返す場合、次ぎの何れかの方法でフィールドはマッピングされます:
- オブジェクトタイプがHibernateエンティティ又はコンポーネントタイプの場合は、フィールドマッピングはエンティティ/コンポーネントのプロパティ名です。別名がある場合は、フィールドをエンティティ/コンポーネントオブジェクト全体にマップできます。
- 以外の場合は値に1つのフィールドのみをマップすることができます
- クエリーが複数の構成要素(例:配列)を返す場合は、次ぎの何れかの方法でフィールドはマッピングされます:
- 別名がある場合。フィールドは別名に対応した値にマップされます
- プロパティ名の接頭辞が別名+「.」の場合。フィールドは別名に対応したオブジェクトのプロパティの値にマップされます
Jaspersoft Studioはオブジェクトと属性とフィールドにマップするのを支援するツールを提供しています。各レコードのオブジェクト(又はJavaBeans)はオブジェクト・ツリーのコンボボックスに表示されます。
ツリーからフィールドを追加する場合は、対応するノードを選択して「選択フィールドの追加」ボタンを押下します。
Hadoop Hive接続
JasperReportsはHiveからのデータをレポートで使うことができます。通常のデータベースと違い、Hadoopシステムでは大量のデータを扱うことができます。その反面、遅延時間が30秒から2分以上も掛かる場合があります。
延期時間が長いため、Haddop-Hiveデータソースを使う場合は、バックグラウンド及びスケジュールで実行することを推奨します。例えば、朝の6時にレポートを実行してHTML及びPDF形式のレポートを作成して、昼間には生成されたレポートを参照するだけにします。
Jaspersoft StudioでHadoop-Hiveを使う手順- リポジトリ・ビューから「新規のデータアダプタ」をダブルクリックする。
データアダプタウィザードが開きます。 - JDBCドライバにHadoop Hive接続を選択する。
- Hive JDBCのパスを入力する。
例:jdbc:hive://localhost:10000/default - 「テスト」ボタンを押下して、パスの設定が正しいかテストする。
- 「完了」ボタンを押下する。
HiveQLクエリーを入力してフィールドを読み込むと、Jaspersoft Studioはすべてのフィールドを取得します。次のページで、レポートで使うフィールドを選定してます。また、その次のページでグループ用のフィールドを指定します。
注:Hive JDBCドライバはまだ完全にJDBC仕様に準拠していません。その結果、JasperReports Serverのデータドメインには未対応です。JasperReports Serverを利用される場合は、ドメインではなくトピックスを使ってください。
新しいJRDataSourceの実装
JasperReportsが標準で提供するJRDataSourceで読み込めないデータソースを使う必要な場合もあります。そのような場合は、新しいJRDataSourceインターフェースを実装したクラスを開発することができます。JRDataSourceを実装したクラスを作成するには、2つのメソッドを定義します:next()とgetFieldValue()。
package net.sf.jasperreports.engine; public interface JRDataSource { public boolean next() throws JRException; public Object getFieldValue(JRField jrField) throws JRException; }
next()メソッドはデータソースで処理する行を設定します。処理する行がある場合はtrueを返します。行がない場合はfalseを返します。
next()メソッドがtrueを返した場合は、getFieldValue()メソッドは要求されたフィールドの値を返すか、nullを返します。引数で渡すJRFieldは要求するフィールドの情報です。JRFieldにフィールド名、説明、型などの情報を設定します。
ファイルシステムを検索して、ファイル名やフォルダ名を返すカスタムデータソースを作成して見ましょう。このデータソースは3つの列を使います:1つ目のFILENAMEはフィールド名/フォルダ名です。2つ目のIS_DIRECTORYはFILENAMEがファイルかフォルダなのかを示すフラグです。3つ目のSIZEはファイルサイズです。
データソース用に2つのコンストラクタを定義します。最初のコンストラクタは検索するフォルダを引数とします。2番目のコンストラクタは引数を取らず、現フォルダを検索の対象にします。
生成されると、指定したフォルダ内のファイル及びフォルダを探して、名前を配列に設定します。
next()メソッドは処理中の配列の位置を管理します。配列の最後になるまでは、trueを返します。
package net.sf.jasperreports.engine; public interface JRDataSource { public boolean next() throws JRException; public Object getFieldValue(JRField jrField) throws JRException; }
import net.sf.jasperreports.engine.*; import java.io.*; public class JRFileSystemDataSource implements JRDataSource { File[] files = null; int index = -1; public JRFileSystemDataSource(String path) { File dir = new File(path); if (dir.exists() && dir.isDirectory()) { files = dir.listFiles(); } } public JRFileSystemDataSource() { this("."); } public boolean next() throws JRException { index++; if (files != null && index < files.length) { return true; } return false; } public Object getFieldValue(JRField jrField) throws JRException { File f = files[index]; if (f == null) return null; if (jrField.getName().equals("FILENAME")) { return f.getName(); } else if (jrField.getName().equals("IS_DIRECTORY")) { return new Boolean(f.isDirectory()); } else if (jrField.getName().equals("SIZE")) { return new Long(f.length()); } // Field not found... return null; } }
カスタムJasperReportsデータソースとJaspersoft Studio
Jaspersoft StudioはJasperReportsがサポートしているほとんどのデータソースに対応しています。JRXmlDataSource、JRBeanArrayDataSource、JRBeanCollectionDataSourceをサポートしています。
カスタムのデータソースを作成する用に、特別な接続が用意されています。JRDataSourceのインスタンスを作成するファクトリクラスです。ファクトリクラスは簡単なJavaクラスで、データソースをテストするのと、Jaspersoft Studioのレポートにデータを渡すのに使うことができます。JavaBeansセットデータソースと同じようにstaticメソッドでデータソースを作成するJavaクラスを開発する必要があります。例えば、前の節のJRFileSystemDataSourceをテストする場合は次のようなクラスを作ります:
import net.sf.jasperreports.engine.*; public class FileSystemDataSourceFactory { public static JRDataSource createDatasource() { return new JRFileSystemDataSource("/"); } }
JRDataSourceを作成した後は、接続を作成します。
通常のように接続を作成します。データソースには「カスタムJRDataSourceの実装」を選択します。ファクトリクラス及びstaticメソッドには次の画面のようにFileSystemDataSourceFactory及びCreateDatasourceを入力します。
JRFileSystemDataSourceインスタンスを取得するクラス及びメソッドを指定します。例題ではTestFileSystemDataSourceとtestです。
カスタムデータソースを利用される場合は、データソースからフィールド情報を取得機能は未サポートです。。
JRFileSystemDataSourceには3つのフィールドがあります:FILENAME(String)、IS_DIRECTORY(Boolean)、SIZE(Long)。この3つのフィールドを追加して、詳細領域に配置します。
レポートを2つの列に分けます。列ヘッダ領域に「ファイル名」と「サイズ」と表示するようにします。2つの画像を配置します:一つはファイル、もう一つはフォルダを表すための画像です。画像の「印刷条件」に$F{IS_DIRECTORY}か次の定義を設定します:
($F{IS_DIRECTORY}) ? “folder.png” : “file.png”
例題ではJRFileSystemDataSourceのインスタンスを生成するクラスはそんなに複雑ではありませんでしたが、エンタープライズJavaBeansやWebサービスを呼び出してデータソースを取得するクラスを作成することもできます。
データソースのエクスポートとインポート
データソース定義を共有できるようにするために、Jaspersoft Studioはデータソース定義のエクスポート/インポートをサポートしています。
データソース定義をエクスポートするには、エクスポートするデータソースを右クリックして「フェイルへエクスポート」を選択します。エクスポート先のファイル名を入力して実行するとXMLファイルが生成されます。
Jaspersoft Studioからエクスポートされたデータソース定義をインポートすることができます。リポジトリ・ビューを右クリックした「ワークスペースからインポート」を選択します。複数のデータソースをエクスポートした場合は、複数のデータソースがインポートされます。もし同じデータソース名が既にある場合は、データソース名に連番を追加してインポートされます。
Recommended Comments
There are no comments to display.