博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快逸报表多数据源解决办法以及项目多数据源切换方法
阅读量:5174 次
发布时间:2019-06-13

本文共 2894 字,大约阅读时间需要 9 分钟。

数据源是报表中数据的来源。在的中报表设计器中一个数据集只能设置一个数据源。如下面的需求该如何实现呢?一个公司在全国各个省份都有分公司,各个分公司的数据存放在各自的数据库中,但是表结构是一样的。总公司要用统计各个分公司的数据,因为设计器中每个数据集只能设置一个数据源,所以要为每个省份做一套报表,这样工作量太大了。简单的方法就是做一套报表,动态的设置数据集的数据源查询各个省份的数据。比如查询北京分公司的数据时就把数据集的数据源设置为北京的数据源;查询山东的数据时就把数据集的数据源设置为山东的数据源。下面就介绍一下如何在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选择库

转载于:https://www.cnblogs.com/kaka-bing/archive/2013/04/28/3048623.html

你可能感兴趣的文章
创建数据库,表
查看>>
工厂模式
查看>>
计算机网络基础知识
查看>>
C#里如何遍历枚举所有的项
查看>>
超级强大的鼠标手势工具
查看>>
常用Dockerfile举例
查看>>
jquery的ajax用法
查看>>
设计模式-策略模式(Strategy)
查看>>
django orm 数据查询详解
查看>>
JarvisOJ Basic 熟悉的声音
查看>>
C# list导出Excel(二)
查看>>
CAS 单点登录模块学习
查看>>
Android应用开发-网络编程①
查看>>
input中的name,value以及label中的for
查看>>
静态库制作-混编(工程是oc为基础)
查看>>
jQuery 显示加载更多
查看>>
Confluence 6 系统运行信息中的 JVM 内存使用情况
查看>>
Confluence 6 升级以后
查看>>
用JS实现版面拖拽效果
查看>>
二丶CSS
查看>>