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

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

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


 
     具体做法:
第一步:在<display/>中声明所有你要显示的列;
<display>
<col column="no" label="工号" clickorderby="true"valuestyleproperty="style='mso-number-format:\@'"/>
<col column="{non-fromdb}" 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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值