最近在使用wabacus作报表开发的时候,需要数据在保存时通过服务端进行JAVA验证及保存数据,现在将解决的方法做个简单的说明并帖出报表图和该部分代码,希望以后我再次碰到的时候不用到处去搜索找答案以及解决新人在使用wabacus时碰到的类似的问题:
1.报表:
如该张报表数据编辑中,有需要数据在提交至服务器端的时候对日期、是否已移交等进行逻辑上的判断,如果已移交就不进行数据的保存操作。
2.报表的简单XML:
<page id="chineseFoodCashier" js="/webresources/script/validate.js">
<report id="report1" title="中餐收银汇总" type="listform"
pagesize="-1" interceptor="com.wabacusdemo.Interceptor_serversavecallback_jeecms">
<display >
<col column="id" displaytype="hidden" />
<col column="foodDate" label="日期">
<inputbox type="datepicker" jsvalidate="isNotEmpty(${invalid.isnotempty}),isDate({0}格式不对,必须为yyyy-MM-dd格式)"/>
</col>
<col column="cash" label="现金" datatype="float"/>
<col column="banquet" label="内宴" datatype="float"/>
<col column="staffLosses" label="职员挂账" datatype="float"/>
<col column="agreeLosses" label="协议挂账" datatype="float"/>
<col column="bankcard" label="银联卡" datatype="float"/>
<col column="breakfastVoucher" label="早餐券(张数)" />
<col column="breakfastFee" label="早餐总额" datatype="float"/>
<col column="ifMove" label="是否已移交" />
</display>
<sql>
<select>
<value>
<![CDATA[select id,foodDate,cash,banquet,staffLosses,agreeLosses,bankcard,breakfastVoucher,breakfastFee,ifMove from t_chinesefood]]>
</value>
</select>
<insert>
insert into t_chinesefood(ifMove=0,foodDate=@{foodDate},cash=@{cash},breakfastFee=@{breakfastFee},banquet=@{banquet},staffLosses=@{staffLosses},@{agreeLosses},@{bankcard},@{breakfastVoucher});
</insert>
<update>
update t_chinesefood(foodDate=@{foodDate},cash=@{cash},banquet=@{banquet},breakfastFee=@{breakfastFee},staffLosses=@{staffLosses},@{agreeLosses},@{bankcard},@{breakfastVoucher}) where
id=@{id} and ifMove=0;
</update>
<delete>
delete from t_chinesefood where id=@{id} and ifMove=0;
</delete>
</sql>
<format>
<value>
if(ifMove.equals("1")) ifMove="已移交";
else if(ifMove.equals("0")) ifMove="未移交";
</value>
</format>
</report>
</page>
上面这个报表的XML比较简单,用到了一个服务端的拦截器,一个日期JS判断,以后一个根据状态ID来转换成“移交”与“未移交”的格式化方法,有使用过该快速开发框架的人,应该都不会默生。接下来重点讲JAVA服务端的拦截器,如上面即用:interceptor="com.wabacusdemo.Interceptor_serversavecallback_jeecms" 来引用包com.wabacusdemo下面的Interceptor_serversavecallback_jeecms.java类。这个类得自己创建,下面帖出这个类的所有代码:
package com.wabacusdemo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.wabacus.config.component.application.report.ReportBean;
import com.wabacus.system.ReportRequest;
import com.wabacus.system.intercept.AbsInterceptorDefaultAdapter;
public class Interceptor_serversavecallback_jeecms extends AbsInterceptorDefaultAdapter
{
public void doStart(ReportRequest rrequest,ReportBean rbean)
{
//这个方法在每次初始化报表时调用
}
public boolean beforeSave(ReportRequest rrequest,ReportBean rbean){
List<Map<String,String>> lstInsertData=rrequest.getLstInsertedData(rbean);//添加的记录集合
List<Map<String,String>> lstUpdateData=rrequest.getLstUpdatedData(rbean);//修改的记录集合
List<Map<String,String>> lstDeleteData=rrequest.getLstDeletedData(rbean);//删除的记录集合
if(lstInsertData!=null&&lstInsertData.size()>0)
{//当前在做添加数据的保存操作
Connection conn=rrequest.getConnection(rbean.getSbean().getDatasource());
PreparedStatement pstmt=null;
for(Map<String,String> mDataTmp:lstInsertData)
{//循环添加的每条记录
String insertSQL1="";
String insertSQL2="";
for(Entry<String,String> entry:mDataTmp.entrySet())
{
if(insertSQL1.equals("")){
insertSQL1=insertSQL1+entry.getKey();
}else{
insertSQL1=insertSQL1+","+entry.getKey();
}
if(insertSQL2.equals("")){
if(entry.getKey().equals("foodDate")){
insertSQL2=insertSQL2+"cast("+entry.getValue()+" as date)";
}else{
insertSQL2=insertSQL2+entry.getValue();
}
}else{
if(entry.getKey().equals("foodDate")){
insertSQL2=insertSQL2+",cast('"+entry.getValue()+"' as date)";
}else{
insertSQL2=insertSQL2+","+entry.getValue();
}
}
}
try{
pstmt=conn.prepareStatement("insert into t_chinesefood("+insertSQL1+",ifMove)values("+insertSQL2+",0)");
pstmt.executeUpdate();
rrequest.getWResponse().getMessageCollector().alert("保存数据成功",false);
}catch(Exception e){
e.printStackTrace();
}
}
try{
if(pstmt!=null) pstmt.close();
}catch(Exception e){
rrequest.getWResponse().getMessageCollector().alert("保存数据失败",true);
e.printStackTrace();
}
}
if(lstUpdateData!=null&&lstUpdateData.size()>0)
{//当前在做修改数据的保存操作
Connection conn=rrequest.getConnection(rbean.getSbean().getDatasource());
PreparedStatement pstmt=null;
for(Map<String,String> mDataTmp:lstUpdateData)
{//循环添加的每条记录
String insertSQL1="";
String idVal="";
for(Entry<String,String> entry:mDataTmp.entrySet())
{
if(entry.getKey().equals("id")){
idVal=entry.getValue();
}
if(insertSQL1.equals("")){
if(entry.getKey().equals("foodDate")){
insertSQL1=entry.getKey()+"="+"cast('"+entry.getValue()+"' as date)";
}else if(!entry.getKey().endsWith("_old")&&!entry.getKey().equals("ifMove")){
insertSQL1=entry.getKey()+"="+entry.getValue();
}
}else{
if(entry.getKey().equals("foodDate")){
insertSQL1=insertSQL1+","+entry.getKey()+"="+"cast('"+entry.getValue()+"' as date)";
}else if(!entry.getKey().endsWith("_old")&&!entry.getKey().equals("ifMove")){
insertSQL1=insertSQL1+","+entry.getKey()+"="+entry.getValue();
}
}
}
try{
pstmt=conn.prepareStatement("update t_chinesefood set "+insertSQL1+" where ifMove=0 and id="+idVal);
System.out.println("update t_chinesefood set "+insertSQL1+" where ifMove=0 and id="+idVal);
pstmt.executeUpdate();
rrequest.getWResponse().getMessageCollector().alert("更新数据成功",false);
}catch(Exception e){
e.printStackTrace();
}
}
try{
if(pstmt!=null) pstmt.close();
}catch(Exception e){
rrequest.getWResponse().getMessageCollector().alert("更新数据失败",true);
e.printStackTrace();
}
}
if(lstDeleteData!=null&&lstDeleteData.size()>0)
{//当前在做删除数据的保存操作
Connection conn=rrequest.getConnection(rbean.getSbean().getDatasource());
PreparedStatement pstmt=null;
for(Map<String,String> mDataTmp:lstDeleteData)
{//循环添加的每条记录
String idVal="";
for(Entry<String,String> entry:mDataTmp.entrySet())
{
if(entry.getKey().equals("id")){
idVal=entry.getValue();
}
}
try{
pstmt=conn.prepareStatement("delete from t_chinesefood where"+" ifMove=0 and id="+idVal);
int num=pstmt.executeUpdate();
if(num>0){
rrequest.getWResponse().getMessageCollector().alert("删除数据成功",false);}
else{
rrequest.getWResponse().getMessageCollector().alert("删除数据失败",true);}
}catch(Exception e){
e.printStackTrace();
}
}
try{
if(pstmt!=null) pstmt.close();
}catch(Exception e){
rrequest.getWResponse().getMessageCollector().alert("删除数据失败",true);
e.printStackTrace();
}
}
return false;
}
public void afterSave(ReportRequest rrequest,ReportBean rbean)
{
//这个方法会在每次保存后调用
}
public void doEnd(ReportRequest rrequest,ReportBean rbean)
{
//这个方法会在每次显示完报表后调用。
}
}
//注解:上面即该拦截器的所有的代码,需要继承AbsInterceptorDefaultAdapter接口,里面有一个beforeSave方法,这里就是用于在保存前判断并执行保存动作的地方。其中有涉及到添加、修改、删除的各个记录集合。即当执行添加动作时用添加的记录集合,当执行修改时用修改的记录集合。合修改的记录集合来着,里面有包含新的更换过的数据,以及旧的记录集,说明一下,旧的记录集都是在表数据的后面加一个“_old”标识。还有一个即数据修改完成后的客户端提示可以通过类似:rrequest.getWResponse().getMessageCollector().alert("更新数据失败",true);来提示说明。