在实际应用中,多个数据库中表结构相同,要求报表展示时能动态控制报表从想要的数据库中取数,这个需求实现的方法比较多,最简单的方法是使用集算器脚本方式,在里边直接通过内置的一些函数就可以实现,具体实现可以参考: 动态切换数据源–通过参数实现动态数据源
另外一种方式可以通过 api 接口实现,下面主要是介绍下如何通过 api 接口实现报表数据源的动态切换。
一:在报表配置中增加多数据源,例如:
- <DB name="demo">
- <property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" >property>
- <property name="driver" value="org.hsqldb.jdbcDriver" >property>
- <property name="type" value="13" >property>
- <property name="user" value="sa" >property>
- <property name="password" >property>
- <property name="batchSize" value="1000" >property>
- <property name="autoConnect" value="false" >property>
- <property name="useSchema" value="false" >property>
- <property name="addTilde" value="false" >property>
- <property name="dbCharset" value="UTF-8" >property>
- <property name="clientCharset" value="UTF-8" >property>
- <property name="needTransContent" value="false" >property>
- <property name="needTransSentence" value="false" >property>
- <property name="caseSentence" value="false" >property>
- DB>
-
- <DB name="demo1">
- <property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" >property>
- <property name="driver" value="org.hsqldb.jdbcDriver" >property>
- <property name="type" value="13" >property>
- <property name="user" value="sa" >property>
- <property name="password" >property>
- <property name="batchSize" value="1000" >property>
- <property name="autoConnect" value="false" >property>
- <property name="useSchema" value="false" >property>
- <property name="addTilde" value="false" >property>
- <property name="dbCharset" value="UTF-8" >property>
- <property name="clientCharset" value="UTF-8" >property>
- <property name="needTransContent" value="false" >property>
- <property name="needTransSentence" value="false" >property>
- <property name="caseSentence" value="false" >property>
- DB>
这里边的 DB name 属性也就是配置的数据源名称,这里配置了两个数据源 demo 和 demo1。
二:制作报表
具体报表制作这里不做具体介绍,按照实际需求制作报表就行,主要是在数据集中指定数据源名称,这里设置成 demo,如图:
三:在显示报表的 jsp 中增加代码,这里使用报表自带的 showReport.jsp
- String ds = request.getParameter( "ds" );//数据源名称通过url参数传入,本例中ds值为demo或者demo1
- Context context=new Context();//生成运算环境
- context.setConnection("demo",context.getConnectionFactory(ds).getConnection());//设置连接,其中demo为报表数据集中指定数据源名称,context.getConnectionFactory(ds).getConnection()根据传入的ds参数名,从raqsoftConfig.xml中获取数据源链接
- session.setAttribute("dsname",context);//将环境对象放到session中,名字为dsname
在jsp的tag标签(report:html)中增加标签:
contextName="dsname"
这样,报表就能通过 url 上 ds 参数的值动态从不同数据源中取数。
更多复杂计算相关问题请查看:复杂计算相关问题分类导航