报表如何动态切换数据源

在实际应用中,多个数据库中表结构相同,要求报表展示时能动态控制报表从想要的数据库中取数,这个需求实现的方法比较多,最简单的方法是使用集算器脚本方式,在里边直接通过内置的一些函数就可以实现,具体实现可以参考: 动态切换数据源–通过参数实现动态数据源 ](https://c.raqsoft.com.cn/article/1556095184387)

另外一种方式可以通过 api 接口实现,下面主要是介绍下如何通过 api 接口实现报表数据源的动态切换。

一:在报表配置中增加多数据源,例如:

<DB name="demo">

 <property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" />

 <property name="driver" value="org.hsqldb.jdbcDriver" />

 <property name="type" value="13" />

 <property name="user" value="sa" />

 <property name="password" />

 <property name="batchSize" value="1000" />

 <property name="autoConnect" value="false" />

 <property name="useSchema" value="false" />

 <property name="addTilde" value="false" />

 <property name="dbCharset" value="UTF-8" />

 <property name="clientCharset" value="UTF-8" />

 <property name="needTransContent" value="false" />

 <property name="needTransSentence" value="false" />

 <property name="caseSentence" value="false" />

 </DB>

 <DB name="demo1">

 <property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" />

 <property name="driver" value="org.hsqldb.jdbcDriver" />

 <property name="type" value="13" />

 <property name="user" value="sa" />

 <property name="password" />

 <property name="batchSize" value="1000" />

 <property name="autoConnect" value="false" />

 <property name="useSchema" value="false" />

 <property name="addTilde" value="false" />

 <property name="dbCharset" value="UTF-8" />

 <property name="clientCharset" value="UTF-8" />

 <property name="needTransContent" value="false" />

 <property name="needTransSentence" value="false" />

 <property name="caseSentence" value="false" />

 </DB>

这里边的 DB name 属性也就是配置的数据源名称,这里配置了两个数据源 demo 和 demo1。

二:制作报表

具体报表制作这里不做具体介绍,按照实际需求制作报表就行,主要是在数据集中指定数据源名称,这里设置成 demo,如图:

1jpg

三:在显示报表的 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 参数的值动态从不同数据源中取数。

更多复杂计算相关问题请查看:复杂计算相关问题分类导航