实际应用中通过程序动态修改报表模板的情况很常见,其中动态修改数据源SQL就是一种典型场景。常见于系统中有一些结构相同而数据源不同的报表,为减少报表开发工作量,只开发一套报表模板,使用时通过程序动态修改数据源来满足实际需要。

  下面通过一个使用JAVA程序修改集算报表数据源SQL的例子说明使用过程。

编辑报表模板:

wKioL1UwnlGwjbZCAABVo_syq58812.jpg

由于不同数据源的字段不同,因此这里使用动态表达式ds1.fname()获取字段名,ds1.field()获取字段值。此外,第一行和第一列为辅助行列,设置其隐藏。

 

编写代码:

1.读入报表

StringreportPath = request.getRealPath("/reportFiles/demo.rpx");

    ReportDefinerd = (ReportDefine)ReportUtils.read(reportPath);

 

2.更改报表数据源

DataSetMetaDatadsmd=newDataSetMetaData();   //构造数据集元数据

    SQLDataSetConfigsdc=newSQLDataSetConfig();   //构造数据集定义

    sdc.setName("ds1");   //设置数据集名

    Stringsql = "";

    //根据不同参数,为报表设置不同数据源SQL,实际使用中可以从配置文件中读取

    switch(Integer.parseInt(type)){

       case 1:

           sql="select * from 员工表";

           break;

       case 2:

           sql="select * from 订单明细 order by 订单ID";

           break;

       default:sql="select * from 客户销售表";

    }

    sdc.setSQL(sql);    //设置 sql语句

    dsmd.addDataSetConfig(sdc);   //把数据集定义添加到数据集元数据

    rd.setDataSetMetaData(dsmd);   //把数据集元数据赋给ReportDefine

 

3.      ReportDefine存入request后使用defineBean方式发布报表

    rd.setDataSetMetaData(dsmd);   //把数据集元数据赋给ReportDefine

    request.setAttribute("reportDefine",rd);

 

         <report:html name="report1"

           srcType="defineBean"

           beanName="reportDefine"

           exceptionPage="/reportJsp/jsp/myError.jsp"

  />

 

实现效果:

  type=1时显示员工信息表数据:

wKiom1UwnPzi7mbpAAGIhEWIFqE226.jpg

   type=2时显示订单明细表数据:

wKioL1UwnlKRVh-4AAFGuA_0ga8129.jpg


【附】changeds.jsp完整代码:

<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="/WEB-INF/raqsoftReport.tld"prefix="report" %>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.raqsoft.report.usermodel.Context"%>
<%@ page import="com.raqsoft.report.model.ReportDefine"%>
<%@ page import="com.raqsoft.report.util.ReportUtils"%>
<%@page import="com.raqsoft.report.usermodel.SQLDataSetConfig"%>
<%@page import="com.raqsoft.report.usermodel.DataSetMetaData"%>
 
 
<html>
<link type="text/css"href="css/style.css" rel="stylesheet"/>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<%
    request.setCharacterEncoding("GBK");
    Stringtype = request.getParameter("type");
    //取得报表真实路径
    StringreportPath = request.getRealPath("/reportFiles/demo.rpx"); 
    ReportDefinerd = (ReportDefine)ReportUtils.read(reportPath); 
    DataSetMetaDatadsmd=newDataSetMetaData();   //构造数据集元数据
    SQLDataSetConfigsdc=newSQLDataSetConfig();   //构造数据集定义
    sdc.setName("ds1");   //设置数据集名
    Stringsql = "";
    //根据不同参数,为报表设置不同数据源SQL,实际使用中可以从配置文件中读取
    switch(Integer.parseInt(type)){
       case 1:
           sql="select * from 员工表";
           break;
       case 2:
           sql="select * from 订单明细 order by 订单ID";
           break;
       default:sql="select * from 客户销售表";
    }
    sdc.setSQL(sql);    //设置 sql语句
    dsmd.addDataSetConfig(sdc);   //把数据集定义添加到数据集元数据
    rd.setDataSetMetaData(dsmd);   //把数据集元数据赋给ReportDefine 
    request.setAttribute("reportDefine",rd);
    
    
%>  
<jsp:include page="toolbar.jsp"flush="false" />
<table id="rpt"align="center" width=100% height=100%>
    <tr><td align=center valign=top height=100%>
       <report:html name="report1" 
           srcType="defineBean"
           beanName="reportDefine"
           exceptionPage="/reportJsp/jsp/myError.jsp"
  /> 
    </td></tr>
</table>
 
</body>
</html>