- PR -

JasperReportのSubreportがないとエラーになる。

1
投稿者投稿内容
magtac
会議室デビュー日: 2002/07/30
投稿数: 12
お住まい・勤務地: カナダ バンクーバー近郊
投稿日時: 2005-03-17 19:37
稲葉と申します。

現在
WindowsXP SP2,
JDK-1.4.2_06,
JBoss 3.2.6,
Struts 1.1,
JasperReport 0.6.4,
iReport 0.4.1,
で開発しています。

 iReport上でサブリポートを含んだ帳票をデザインし、iReport上では問題なくデータを
含んだPDFが表示されます。

作成したrptParent.jasper,rptChild.jasperを/pages/report/にコピー。

 public class PrintReport extends Action {

  public ActionForward execute(.....){
//formからデータの取り出し。
//jasperFile - location & name of the .jasper file
String  jasperFile=getServlet().getServletContext().getRealPath(
                      "/pages/report/rptHtlRQ.jasper");

//parameters - hash map, but no parms were set
Map map = new HashMap();

Context ctx=new InitialContext();
final DataSource ds=(DataSource)ctx.lookup("java:/DefaultDS");

Connection conn=ds.getConnection();

bytes =JasperRunManager.runReportToPdf(jasperFile,map,conn);

ここでJRException: Could not load object from location : rptChild.jasperとエラー
になります。

 rptParent.jrxmlでは
<subreportExpression class="java.lang.String">
 <![CDATA["rptChild.jasper"]]>
</subreportExpression>
としています。

 解決法や解決へのポインタを示して頂きたいのですが、よろしくお願い致します。
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2005-03-18 09:45

 こんにちは。

 iReport上では問題なく動いているという事でしたので、私の勘違いかも
しれませんが、実際に私がリリースしたソースを見たところjrxmlは以下の
様になっていました。
<subreportExpression class="net.sf.jasperreports.engine.JasperReport">
<![CDATA[$P{SubReportSourceContainer}.getReportSources("xxxxx")]]>
</subreportExpression>

 あと少し気になるのはパスの指定方法が親と違う様なのですが問題ありませんか?

 検討違いでしたらすみません。。
magtac
会議室デビュー日: 2002/07/30
投稿数: 12
お住まい・勤務地: カナダ バンクーバー近郊
投稿日時: 2005-03-19 17:25
ありがとうございます。
原点に返り、JasperReportのdemo/sample/webapp以下をJBOSS_HOME/postgres/deploy
にコピーし、JasperReport.warへ名前を変更。
 <subreportExpression class="net.sf.jasperreports.engine.JasperReport">
  [CDATA[$P{rptChildParam}]]
 </subreportExpression>
としたrptParent.jrxml,rptChild.jrxmlをJasperReport.war/reports/へコピー。

JasperReport.war/jsp/のcompile.jspを変更し、上記ファイルをコンパイル。
 pdf.jspもDB Connection部分を追加し、

rptParentを呼ぶ前にchildを
 File subRptFile=new File(application.getRealPath("/reports/rptChild.jasper"));

 JasperReport subreport = (JasperReport)JRLoader.loadObject(subRptFile)

map.put("rptChildParam",subreport);
と親を呼ぶ前にロードしてパラメータで渡すと問題なく表示できました。

 しかし、JBoss+Strutsの環境で実行するとファイルサイズはある程度あるpdfファイル
が出来るのですが、空白ページが上記で出来たファイルと同数ページあるのみで何も
表示されません。

 引き続きよろしくお願い致します。
magtac
会議室デビュー日: 2002/07/30
投稿数: 12
お住まい・勤務地: カナダ バンクーバー近郊
投稿日時: 2005-03-19 19:08
 iTextのTutorialにアプリケーションサーバの中にはサーバー上ではちゃんとしたpdfを作成
するが、ブラウザに返すときにバイナリでうまく返せないものがある。

 サーバ側のpdfとクライアント側に保存したpdfを比較してみろとあったので、やってみました。

 結果はサーバ側に保存したpdfは問題ないレポートでしたが、クライアント側に返って
きていたのは空白ページだけでした。

 結論として、JBoss-3.2.6では直接pdfを返せないとわかりました。
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2005-03-19 20:09
 こんにちは。

 私もあまり理解していないので恐縮ですが、私のJava Web Startの環境で
テストしてみたところ問題なくpdfファイルをクライアント側に直接戻す事が
できました。(サブレポートの中身も表示されています)
byte[] pdf = JasperExportManager.exportReportToPdf(jasperPrint)

 環境がJava Web Startなのでstrutsでは試していませんが、
ByteArrayOutputStream byteArrayOutputStream
response.setContentLength(byteArrayOutputStream.size());
ServletOutputStream servletOutputStream = response.getOutputStream();
byteArrayOutputStream.writeTo(servletOutputStream);
 この様な感じで同じ様にbyte arrayを戻せないでしょうか?

 ちなみにテストした環境はjboss3.2.3です。3.2.6の問題でしょうか?
 検討違いでしたらすみません。。


[ メッセージ編集済み 編集者: matu 編集日時 2005-03-19 20:23 ]
1

スキルアップ/キャリアアップ(JOB@IT)