使用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;
}
完。
经常使用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;
}
完。