数据源是报表中数据的来源。在的中报表设计器中一个数据集只能设置一个数据源。如下面的需求该如何实现呢?一个公司在全国各个省份都有分公司,各个分公司的数据存放在各自的数据库中,但是表结构是一样的。总公司要用统计各个分公司的数据,因为设计器中每个数据集只能设置一个数据源,所以要为每个省份做一套报表,这样工作量太大了。简单的方法就是做一套报表,动态的设置数据集的数据源查询各个省份的数据。比如查询北京分公司的数据时就把数据集的数据源设置为北京的数据源;查询山东的数据时就把数据集的数据源设置为山东的数据源。下面就介绍一下如何在jsp中动态的设置数据集的数据源。
大致思路:
用的提供的API读取报表得到ReportDefine对象,再得到报表中数据集的数据源,然后遍历数据集,分别设置每个数据集的数据源,再把元数据设置到ReportDefine对象中,最后用Bean的方式发布报表。
这个过程只牵扯到jsp的写法,下面就列出jsp的内容
<%@ page contentType="text/html;charset=GBK" %>
<%@ taglib uri="/WEB-INF/runqianReport4.tld" prefix="report" %>
<%@ page import="java.util.*"%>
<%@ page import="com.runqian.report4.model.ReportDefine"%>
<%@ page import="com.runqian.report4.usermodel.DataSetMetaData"%>
<%@ page import="com.runqian.report4.usermodel.DataSetConfig"%>
<%@ page import="com.runqian.report4.util.ReportUtils"%>
<html>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<%
request.setCharacterEncoding( "GBK" );
String report = request.getParameter( "raq" );
//保证报表名称的完整性
int iTmp = 0;
if( (iTmp = report.lastIndexOf(".raq")) <= 0 ){
report = report + ".raq";
iTmp = 0;
}
//得到省份的简称
String province = request.getParameter("province");
//由省份的简称拼成该省份的数据源名(数据源名字根据自己的情况定)
String dataSource = province+"_DataSource";
//动态设置报表中数据集的数据源
String reportPath = request.getRealPath("/reportFiles/"+report);
ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath);//读取报表
DataSetMetaData dsmd = rd.getDataSetMetaData(); //取数据集元数据
for(int i=0; i<dsmd.getDataSetConfigCount(); i++){ //遍历数据集
DataSetConfig dsc = dsmd.getDataSetConfig( i ); //数据集配置 数据集的抽象定义
dsc.setDataSourceName( dataSource );//设置数据集引用到的数据源名称
dsmd.setDataSetConfig( i, dsc); //修改数据集配置
}
rd.setDataSetMetaData(dsmd); //设置数据集元数据
String rptName = "RPT_"+Double.toString(Math.random());
request.setAttribute(rptName,rd);//把ReportDefine对象在request中保存
//获得参数
StringBuffer param = new StringBuffer();
Enumeration paramNames = request.getParameterNames();
if(paramNames!=null){
while(paramNames.hasMoreElements()){
String paramName = (String) paramNames.nextElement();
String paramValue=request.getParameter(paramName);
if(paramValue!=null){
//把参数拼成name=value;name2=value2;.....的形式
param.append(paramName).append("=").append(paramValue).append(";");
}
}
}
%>
<!-- 发布报表 -->
<table align=center>
<tr><td>
<report:html name="report1"
funcBarLocation="top"
needPageMark="no"
generateParamForm="no"
params="<%=param.toString()%>"
exceptionPage="/reportJsp/myError2.jsp"
srcType="defineBean"
beanName="<%=rptName%>"
/>
</td></tr>
</table>
</body>
</html>
以后遇到类似的问题就可以用上面的方法解决了。
更多了解各种复杂问题的处理,可以参考:、
--------------------------------------------------------------------------------
1、用户选择库(spring.xml中配置两个数据源,其中一个为默认)后 将数据库key 如放入 session
2、过滤器 拦截用户请求 2.1 如果session中没有key 则将用户重定向到 选择库界面 选中 2.2 否则绑定key到ThreadLocal变量 2.3 请求结束 删除ThreadLocal 3、AbstractRoutingDataSource 根据ThreadLocal选择库