使用wabacus框架实现多个数据源集合到一个报表上中的做法

使用wabacus框架开发项目有一段时间了,开发起来确实快速,普通增、删、改、查配置几下就实现了,对于复杂的业务也支持的很好,今天用它开发了一个从多个数据库中取数据进行显示的报表应用,由于第一次开发这种需求,花了点时间研究,终于搞出来了,实现也很简单,现在介绍一下实现思路,和大家分享一下,也方便以后自己再实现类似需求时参考。

经常使用wabacus框架的朋友应该知道,其实就是报表<sql/>中加载一个数据源的数据,第二个数据源的数据在加载数据后置动作中加载出来并修改,然后存放到pojo对象中。
想了解wabacus的朋友也可以通过http://code.google.com/p/wabacus/ 了解。
先看一下集合出来的效果:

[img]http://dl.iteye.com/upload/picture/pic/112053/90a490c7-f329-3732-9a80-70204bf17c54.jpg[/img]

具体做法:
第一步:在<display/>中声明所有你要显示的列;
<display>
<col column="no" label="工号" clickorderby="true"valuestyleproperty="style='mso-number-format:\@'"/>
<col column[color=red]="{[size=large]non-fromdb[/size]}[/color]" property="工资" label="工资"/>
</display>
第二步:在<sql/>中配置查一个数据源的SQL语句
<sql datasource="mysql">
<select>
<value>
<![CDATA[SELECT * from tbl_baseinfo order by no]]>
</value>
</select>
</sql>
第三步:开发一拦截器,实现查询数据后置动作,在后置动作中,先调用ReportDataAssistant类取到当前页面的第一个数据源的数 据,然后自己查询第二个数据源,把值设置到相应的记录中。最后显示会使用你修改后的数据。
ReportDataAssistant这个类有很多读写报表数据的方法,大家可以看一下源码,有详细的注释。

源码在我们下载的 src 包里面, ReportDataAssistant这个类在 com.wabacus.system.assistant包里面。

至于怎么查询第二个数据源的数据我们可以用rrequest.getConnection("ds_name")得到连接(不要写成 (Connection) Config.getInstance().getDataSource("name").getConnection(); 不要用这种方式去取,否则用完要你自己去关闭,性能也不好,除非是在与框架无关的场合使用这种方式。)

至于怎么修改数据,我们可以用 public void setColValue(ReportRequest rrequest,String reportid,String property,Object dataObj,Object colvalue) 这个方法来修改数据,
其中的 property 默认就是每个<col/>的column属性,除非为为<col/>配置了property属性,则传入配置的property属性值。
dataObj 存放某记录行数据的POJO对象,对于细览报表,只有一个记录行。
colvalue 要设置的值,必须与其<col/>的datatype指定的类型一致。

以下是拦截器里面的具体内容
public Object afterLoadData(ReportRequest rrequest,ReportBean rbean,Object typeObj,Object dataObj){
if(typeObj instanceof AbsReportType){
List list=(List)dataObj;

for(int i=0;i<list.size();i++){

Object test=list.get(i);
String no=String.valueOf(ReportAssistant.getInstanc ().getPropertyValue(test,"no"));
String sql="select * from wafer where no='"+no+"'";
Connection conn=rrequest.getConnection("ds_mysql");
Statement stmt=null;

try {
stmt=(Statement) conn.createStatement();
ResultSet rs=(ResultSet) stmt.executeQuery(sql);

while(rs.next()){

String wafer= rs.getString("salary");

ReportDataAssistant.getInstance().setColValue(rrequest,"report1","工资",test,wafer);

}
}
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

return dataObj;
}


完。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值