
主報表的版面配置如圖

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);

做完~收工!!!
沒有留言:
張貼留言