ireport子报表

主表中创建子表注意事项

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值