现在的位置: 首页 > 综合 > 正文

ireport子报表

2013年09月12日 ⁄ 综合 ⁄ 共 2921字 ⁄ 字号 评论关闭

主表中创建子表注意事项

创建的操作就不描述了,主要描述的是:主表里子表的属性内容设置问题

第一大突破点: 连接方式设置——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);


抱歉!评论已关闭.