ScriptedDataSourceでつまった点
引き続きBIRTのScriptデータソース関連を色々調べています。
今回は、Javaプログラム内で取得したデータ(DTO)をBIRT側へ渡す際にハマッた点を書きとめておきます。
■環境は以下の状態とします。
・複数の単一項目を出力する単票帳票を出力する
・Javaプログラムからは「resultMap」という名前で適当な文字列キー + DTOをBIRTに連携する。
・BIRT帳票上にはScriptedDataSetの各カラムに対応したコンポーネントを配置済み。
■ScriptDataSet内のscriptは以下の状態。
[fetch時]
resultValue = resultMap.get("resultObj");
dataSetRow["data1"] = resultValue.getData1();
dataSetRow["data2"] = resultValue.getData2();
…
return false;
この状態で帳票出力処理を実行すると、出力はされるものの値がバインドされません。
なんでかなーと、悩み続けていたのですが…どうもBIRTのscript⇒fetch時に戻り値でfalseを返すと、
そのタイミングでバインドした値はすべてキャンセルされるようです。。
#実装上の裏をとったわけではないですが、動きから見て間違いなさそう。
そのため、scriptを以下のように書き直してみたところ、正常に値がバインドされました。
[open時]
count = 0;
[fetch時]
if (count++ == 0) {
resultValue = resultMap.get("resultObj");
dataSetRow["data1"] = resultValue.getData1();
dataSetRow["data2"] = resultValue.getData2();
…
return true;
} else {
return false;
}
まぁ、戻り値の値から考えて、多少考えれば気づきそうなもんですが…なかなか気づきませんでした(泣
ん〜、まだまだBIRTの細かい動きは把握できてませんね。。
もうちょっと色々触ってみなければ。。