主表中创建子表注意事项
创建的操作就不描述了,主要描述的是:主表里子表的属性内容设置问题
第一大突破点: 连接方式设置——JDBC和JAVABean
在Connection/Data Source Expression中根据子表的连接方法选择
一 。利用JDBC连接子表
选择use connecion expression
里面的内容为连接参数— $P{REPORT_CONNECTION}
方法一。通过java代码来传递连接参数
假如:$P{REPORT_CONNECTION} 是从java代码中传递过来的一个类型为Connection参数,这个Connection说明了子表的JDBC连接。
例如代码中可以这样写:
写子表连接方法,返回类型为Connection
/**
* 子表数据库连接
* @return Connection
*/
public Connection getSubCon()
{
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
conn = DriverManager.getConnection(url,"root","123");
return conn;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
.....
.....
public bytes makePDFReport(){
Map parameters = new HashMap();
parameters.put("REPORT_CONNECTION", getSubCon());//把子表连接作为参数传递
byte[] bytes = JasperRunManager.runReportToPdf(jasperReport,parameters,this.getCon());
}
需要注意的是: $P{REPORT_CONNECTION} 是系统参数,使用这种方式有时候会报错,改变参数名即可。
方法二。在iReport中直接使用子表的连接
如果在子表里,已经在report query中写了连接语句(必须连接成功),如下图
那么直接在Connection/Data Source Expression中 选择use connecion expression这个即可
刚才已经说了$P{REPORT_CONNECTION}是系统参数,所以当子表已经写好sql语句,连接成功的时候, $P{REPORT_CONNECTION}就自动被赋予了这个值。
二 。利用JAVABEAN连接子表
在Connection/Data Source Expression中 选择use Data Source expression
会有一个默认的系统参数出现 $P{MyDatasource},与$P{REPORT_CONNECTION}类似。
方法一。通过java代码来传递连接参数
在
Connection/Data Source Expression中写:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{subdatasource})
$P{subdatasource}
为传递的数据源参数,这里我没有用系统默认参数,避免冲突
创建$P{subdatasource}
参数,类型选择:java.util.Collection
java代码中写:
public void write(){
....
ArrayList lists=null; // 根据需要传递数据list
JRBeanCollectionDataSource dataSet=new JRBeanCollectionDataSource(lists);//设置数据源
try {
Map parameters = new HashMap();
parameters.put("subdatasource", dataSet);//把数据源作为参数传递
byte[] bytes = JasperRunManager.runReportToPdf(jasperReport,parameters
,this.getCon());
.....
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
方法二。在iReport中直接使用子表的连接
如果利用iReport中的 Report Query ---》 Javabean Data Source 连接数据库,连接成功,就会自动把这个连接的数据源赋给$P{MyDatasource}。
第二大突破点:子报表路径的设置——String路径和JasperReport对象
一。String路径
如下图所示,类型选择String 直接传递一个绝对或者相对路径即可
二。JasperReport对象
如下图所示,类型选择net .sf.jasperreports.engine.JasperReport
Subreport Expression中写一个参数,这个参数通过后台java代码传递一个JasperReport对象,这个对象就是子表JasperReport对象。
后台java代码:
protected final static String SUB_DESIGN_FILE = "/report/subReport.jrxml";
JasperReport subReport = JasperCompileManager .compileReport(
getClass().getResourceAsStream(SUB_DESIGN_FILE )
);
params.put("tikDetailsJasper
", subReport
);
。。。。
pdfBytes = this.makePDFReport(reportPath, params, jrds);