Ninja-VA with WebReportCafe の巻 サイオステクノロジー株式会社
Ninja-VA with WebReportCafe 概要 このドキュメントでは Ninja-VAの姉妹製品である 帳票作成ソフト WebReportCafe Engine との連携方法についてご説明します WebReportCafe Engine は帳票を出力するためのライブラリ製品です WebReportCafe Designer で作成した帳票の雛形である帳票フォームと データを組み合わせて帳票を作成できます 帳票を PDF ファイル形式で出力したり 直接プリンタへ印刷処理を投げたりすることができます DataTableWrapper クラスの説明 DataTableWrapper とは Ninja-VA ではデータの行の集合を扱う際 com.tenartni.ninjava.data.datatable クラス ( 以下 DataTable) を使用します 一方 WebReportCafe では jp.co.tenartni.data.xrowset( 以下 XRowSet) を使用します よって Ninja-VA で取得したデータを WebReportCafe で使用する場合は DataTable を XRowSet に変換する必要があります com.tenartni.ninjava.data.wrc.datatablewrapper クラス ( 以下 DataTableWrapper) は DataTable オブジェクトを包含し XRowSet のように振舞うラッパークラスです Ninja-VA で WebReportCafe を使用する場合はこのクラスを使用します DataTableWrapper のコンストラクタに アクティブ状態の DataTable オブジェクトを引数として渡すだけで使用できます 使用方法は 下記のサンプルプログラムと共に解説します
シンプル PDF 作成サンプルプログラム サンプルの概要 まず簡単な PDF を作成する サンプルをご紹介します 下図のような 一つの DataTable から生成できる PDF の生成処理 を実装します
サンプルプログラム解説 PDF 生成の処理プログラムは下記のようになります public classproductlistpdfswo extends SmartWebObject { public DBActionTable productlisttable= new DBActionTable(); public ProductListPDFSWO() { public void firstinitialize() throws Exception { super.firstinitialize(); public void initialize(httpservletrequest request, HttpServletResponse response) throws java.lang.exception { super.initialize(request, response); public void doprintaction(httpservletrequest request, HttpServletResponse response, WebAction action)throws Exception{ String header = "inline;"; header += "filename=\"productlist.pdf\""; if (!header.equals("")){ response.setheader("content-disposition", header); response.setcontenttype("application/pdf"); 1 OutputStream outputstream = response.getoutputstream(); 2 XReport xreport = new XReport(); InputStream stream = WrcSampleSWO.class.getResourceAsStream("/sample/report/product_list.xml"); xreport.loadproperty(stream); 3 productlisttable.setactive(true); DataTableWrapper rowset = new DataTableWrapper(productListTable); xreport.setrowset(rowset); 4 xreport.createpdf(outputstream); 5 outputstream.close(); outputstream = null; this.setstopresponse(true); 6 上記のサンプルプログラムの要点を プログラムに振られた番号を元に解説していきます 1PDF をブラウザに出力するために コンテントタイプやファイル名を指定します 2 出力用の OutputStream を HttpServletRespose オブジェクトから取得します 3WebReportCafe Engine のクラスである XReport を初期化しています 4 帳票作成用のデータを取得するために DataTable をアクティブ化し 前述の DataTableWrapper を作成し XReport オブジェクトに設定します 5 2で取得した OutputStream を指定して PDF の生成メソッドを呼び出します このメソッドを呼び出すことにより OutputStream に PDF データを出力します 6StopResponse を呼び出し これ以降 Ninja-VA による Response 書き出しを行わない事を明示します
サブレポートを使用する場合 サンプルの概要 続いて 入れ子のデータがある 少し複雑な帳票を印刷するサンプルをご紹介します データと明細データがあるような下記の帳票を 親子関係のある複数のデータを使用して作成することができます メインレポート サブレポート WebReportCafe では 親のデータを扱う部分をメインレポート 子供のデータを扱う部分をサブレポートといいます
TableRelation について サブレポートを使用する場合 メインレポートに設定する親データと サブレポートに設定する子データが 関連付けられて いる必要があります 帳票作成に使用する複数の DataTable を TableRalation を使用してリレーションを作成してください サンプルプログラム解説 サブレポートを含む帳票印刷のサンプルプログラムは下記のようになります public void doprintreportbtnaction(httpservletrequest request, HttpServletResponse response, WebAction action) throws Exception { XReport xreport = new XReport(); InputStream stream = EstimateListSWO.class.getResourceAsStream("/sample/report/estimate_list.xml"); xreport.loadproperty(stream); estimatelisttable.setactive(true); estimateproducttable.setactive(true); DataTableWrapper mainrowset = new DataTableWrapper(estimateListTable); DataTableWrapper subrowset = new DataTableWrapper(estimateProductTable); 1 2 tablerelation.setenabled(true); 3 xreport.setrowset(mainrowset); 4 SubReportSection subreport = (SubReportSection)xreport.getSectionByName("SubReportSection1"); subreport.setrowset(subrowset); 5 DirectPrint directprint = new DirectPrint(xreport); String printername = DirectPrint.getDefaultPrinterName(); directprint.setprintername(printername); 6 directprint.print(); 7 上記のサンプルプログラムの要点を プログラムに振られた番号を元に解説していきます 1WebReportCafe Engine のクラスである XReport を初期化しています 2メインレポートで使用するデータと サブレポートで使用するデータの DataTable をアクティブにし それぞれに対する DataTableWrapper オブジェクトを作成します 3TableRalation をアクティブにし 関連付けを有効にします 4メインレポートに DataTableWrapper を設定します
5サブレポートに DataTableWrapper を設定します WebReportCafe Designer でサブレポートにつけた名前で サブレポートオブジェクトを抜き出し DataTableWrapper を設定しています 6 印刷オブジェクトを初期化しています 7 印刷処理を実行しています 帳票設計時に SQL を取得する方法 Ninja-VA から 帳票設計時に設定した SQL を取得することもできます 帳票設計時に設定した SQL にアクセスするサンプルプログラムには下記のようになります public class ProductListPDFDownloder extends SmartWebObject { public DBActionTable productlisttable = new DBActionTable(); public ProductListPDFDownloder() { public void initialize(httpservletrequest request, HttpServletResponse response) throws java.lang.exception { super.initialize(request, response); public void printdownloaddata(httpservletrequest request, HttpServletResponse response,webaction action) { String header = "inline;"; header += "filename=\"productlist.pdf\""; if (!header.equals("")){ response.setheader("content-disposition", header); response.setcontenttype("application/pdf"); OutputStream outputstream = response.getoutputstream(); XReport xreport = new XReport(); InputStream stream = ProductListSWO.class.getResourceAsStream("/sample/report/product_list.xml"); xreport.loadproperty(stream); productlisttable.setactive(false) String sql = xreport.getsql(); productlisttable.setsql(sql); 1 productlisttable.getparams().getfield("product_code").settype(datafield.type.string); 2 productlisttable.getparams().setstring("product_code", productidmap.getstring("product_code")); 3 productlisttable.setactive(true); DataTableWrapper rowset = new DataTableWrapper(productListTable); xreport.setrowset(rowset); xreport.createpdf(outputstream); outputstream.close(); outputstream = null; this.setstopresponse(true); 1XReport クラスの getsql メソッドで 帳票設計時に設定した SQL を取得することができます また DBActionTable の setsql メソッドで 取得した SQL を設定することにより 帳票設計時に設定した SQL を利用することができます DBActionTable に SQL を設定する際は Active 状態が false である必要があります SQL を設定する前に setactive(false) を実行してください
2 設定した SQL に含まれているパラメータの型を設定します SQL を設定する際 パラメータは自動的に追加されますが 型は設定されません 自動で追加されたパラメータを使用する際には 型を設定する必要があります DBActionTable の getparams() メソッドでパラメータの DataFields を取得し getfield メソッドで引数に指定した名称の DataField を取得します さらに 取得した DataField オブジェクトの settype メソッドを呼び出すことでパラメータの型を設定することができます 3パラメータに値を設定しています ここでは DataMap オブジェクトの productidmap からユーザから入力された値を取得して DBActionTable の値にデータを設定しています まとめ DataTableWrapper クラスを使用することで Ninja-VA の DataTable を WebReportCafe で使用できる XRowSet に変換し Ninja-VA から PDF 作成や 印刷を簡単に行うことができます Ninja-VA で PDF や帳票印刷を行う必要がある場合は ぜひ WebReportCafe の採用をご検討ください