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

快逸报表多数据源解决办法以及项目多数据源切换方法相关推荐

  1. 快逸报表数据源找不到的一个原因

    快逸报表在设计器中编辑的时候,如果数据集不指定数据源名称,那么设计器会默认用当前数据库来设计报表. 但是,如果报表部署的应用服务器中存在多个数据源的话,所有的报表都会默认的去连接第一个数据源.那么用第 ...

  2. java 多选列表框_快逸报表:填报中的下拉多选列表框

    在快逸报表应用的填报页面中,下拉框是最常见的了.下拉选择框可以简化用户的输入,可以避免用户的错误录入,还可以轻松实现中文与代码的映射关系,可谓用途多多. 可是随着业务的越来越复杂,各种奇怪的需求均可能 ...

  3. 快逸报表API直接生成v4统计图

    客户需求: 之前遇到过客户希望后台直接获取到快逸生成统计图,当时给客户解决的方法是通过先在快逸报表中设置统计图,后台运算后,获取到报表单元格的值,转化成ImageValue对象. 实现准备: 1:了解 ...

  4. 深度经验总结:快逸报表工具单数据集版本和多数据集版本的主要区别之一

    快逸报表工具单数据集版本和多数据集版本的主要 区别之一,深度经验总结: 为了展现复杂含有计 算报表必须要union多个子查询出来形成一个数据 集 我现在是子查询1 union all 子查询2 uni ...

  5. 快逸报表日志文件的配置方法

    日志系统是一种不可或缺的跟踪调试工具,特别是在任何无人职守的后台程序以及那些没有跟踪调试环境的系统中有着广泛的应用. 长期以来, 日志系统作为一种应用程序服务,对于跟踪调试.程序状态记录.崩溃数据恢复 ...

  6. Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini和my.ini文件以及服务无法启动的解决办法以及修改初始密码的方法

    Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini和my.ini文件以及服务无法启动的解决办法以及修改初始密码的方法 参考文章: (1)Wind ...

  7. FineReport帆软报表常见问题及解决办法合辑(不断更新)

    如何动态设置坐标轴的最大值? max(value('数据集名称',数值所在列序号)) + 一个动态值或者固定数值 柱状图的分类顺序跟表格中的数据顺序相反? 图标计算逻辑和单元格计算逻辑不同导致的,解决 ...

  8. 快逸报表部署 (一)-- demo连接mysql数据库

    1. 设计器连接mysql数据库, 创建first.raq报表文件 2. 创建demo.jsp,嵌入报表,jsp顶部加入下面两行 <%@ page contentType="text/ ...

  9. vue同一浏览器只允许同时登录一个账号的解决办法-真实项目使用

    上篇文章介绍了:同一浏览器只允许同时登录一个账号的解决办法 这篇文章记录下项目中确定的最终方案. 场景: 同一浏览器,登陆账号A后,打开新的tab标签页,登陆账号B,用户A将会强制返回登陆页面: 这个 ...

  10. Ubuntu中的输入法突然变成了繁体字解决办法及中英输入法切换

    虚拟机中ubuntu输入法的切换 出现的问题 解决办法 输入法的切换 出现的问题 在ubuntu系统下,输入法使用一段时间之后,输入拼音之后,莫名其妙变成显示繁体字. 不知道是不小心点到了什么还是不小 ...

最新文章

  1. CQRS学习——最小单元的Cqrs(CommandEvent)[其一]
  2. java和python哪个好学-学java好还是Python好?
  3. php ssd性能影响,SATA SSD有无缓存,是否影响速度性能实例
  4. [caffe]深度学习之图像分类模型VGG解读
  5. 贪心算法之活动选择问题
  6. DB Manager access to SQLite
  7. js校验明细列表字段是否存在相同值(js循环嵌套初始值问题)
  8. 英伟达显卡不同架构_NVIDIA显卡架构代号的另一面:他们都是伟大的科学先驱
  9. 单片微型计算机第三版课后习题答案,单片微型计算机原理与应用_课后习题答案_山东理工.docx...
  10. 桌面图标的背景颜色怎么改成透明?
  11. 举一反三快速学会如何全面超频
  12. 基于javaweb的宠物商城系统(java+jsp+javascript+servlet+mysql)
  13. vite 不支持 ie 11?configureBuild Hook 帮你定制 bundle 打包过程
  14. css图片不断放大缩小的动画效果
  15. 两点告诉您品牌控价(管控低价乱价)的重要性
  16. C语言中-条件编译#ifdef的妙用详解_透彻
  17. 【camera】Mtk相机冷启动的拆解笔记
  18. 通用课程表教师表php,利用Access实现学校课程表的科学管理
  19. 光格科技产品系列之分布式光纤温度传感
  20. 多媒体艺术家jaime levy在网站甚至还没有存在之前就处于网页设计的最前沿

热门文章

  1. 小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景
  2. Trait这个类的特性
  3. Mysql mysqld_safe启动与myslqd启动坑
  4. tinymce 编辑器 上传图片
  5. asp.net 生成图形验证码(字母和数字混合)
  6. Can't add self as subview crash错误
  7. A*算法 带cocos2d-x例子 a*寻路算法
  8. 关于asp.net导出Excel [zz]
  9. GARFIELD@02-21-2005
  10. servlet三种方式实现servlet接口