2011年9月7日 星期三

ireport的subreport使用心得(一)

客戶給的報表設計規範如圖(A4,中一刀)



主報表的版面配置如圖


SubReport配置如下

(子報表一和子報表二格式格同,可設計好一個再Copy,只要再改第X聯的呈現文字即可)



Main Report的SQL是呈現Master的資料

再透過設定Parameter的方式把Field值傳入SubReport



子報表的Header此時使用此方法抓Main Report設定好的參數

$P{REPORT_PARAMETERS_MAP}.get("my_main_report_param")



此報表有一個特殊需求:每十筆要換頁

 在這裡我是使用Group Footer的方式來解決

(Column Footer試了好久都會跑到頁面最下面,不是Below Detail >,<)

Step 1.設定Group Expression (為了每十筆做一個Group,我用 $V{COLUMN_COUNT} / 11 )

Step 2.把Group Band的Start On New Page 設定為True,確保每一個Group都在新的一頁

Step 3.其他設定,如圖第二個藍框 (不確定效用 XDDD)



ireport設計好後就可以用Servlet套程式了

我是參考此網頁的說明把程式套出來的:How to load subreport resources with Jasper?

Step 1. 加入新的參數


<parameter name="SubReportParam_1"
      class="net.sf.jasperreports.engine.JasperReport"
      isForPrompting="false"/>

<parameter name="SubReportParam_2"
      class="net.sf.jasperreports.engine.JasperReport"
isForPrompting="false"/>



Step 2.選擇Main Report的SubReport Element,在屬性中找到Subreport Expression,

設定其值為 $P{SubReportParam_1}

Step 3.選擇Main Report的SubReport Element,在屬性中找到Expression Class,

設定其值為 net.sf.jasperreports.engine.JasperReport

Step 2 和 3 的設定如圖



以上ireport設計完成,接下來開始套程式

關鍵程式碼就是要把編譯好的Subrepot Jasper Class

使用參數設定的方式塞給Main Report去使用

String sr1FilePath=getServletContext().getRealPath("/supplier/order/ShipDetailSub_1.jrxml");
JasperReport jasperReportSR1 = JasperCompileManager.compileReport(sr1FilePath);
parameters.put("SubReportParam_1", jasperReportSR1);



做完~收工!!!

沒有留言:

張貼留言