- 浏览: 4043 次
最新评论
最近在使用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);来提示说明。
相关推荐
基于java的开发源码-聊天程序,包括服务端和客户端.zip 基于java的开发源码-聊天程序,包括服务端和客户端.zip 基于java的开发源码-聊天程序,包括服务端和客户端.zip 基于java的开发源码-聊天程序,包括服务端和...
Java开发案例-springboot-12-集成socket.io服务端和客户端-源代码+文档.rar Java开发案例-springboot-12-集成socket.io服务端和客户端-源代码+文档.rar Java开发案例-springboot-12-集成socket.io服务端和客户端-源...
netty-mqtt是一个基于Java开发的MQTT 3.1.1协议服务端与客户端,包含113个文件,其中包括87个Java源文件、8个XML文件、7个Iml文件、3个YAML文件、3个JKS文件、2个Factories文件、1个LICENSE文件和1个Markdown文件。...
基于java的开发源码-SSH服务端 Apache SSHD.zip 基于java的开发源码-SSH服务端 Apache SSHD.zip 基于java的开发源码-SSH服务端 Apache SSHD.zip 基于java的开发源码-SSH服务端 Apache SSHD.zip 基于java的开发源码-...
基于java的开发源码-Tcp服务端与客户端的JAVA实例源代码.zip 基于java的开发源码-Tcp服务端与客户端的JAVA实例源代码.zip 基于java的开发源码-Tcp服务端与客户端的JAVA实例源代码.zip 基于java的开发源码-Tcp服务端...
该项目为基于Java的CareApp-Server护理类应用服务端开发设计源码,综合运用Java、CSS和JavaScript编程语言,共计156个文件,其中包含123个Java源代码文件、7个XML配置文件、5个PNG图片文件、5个属性文件以及5个JSP...
单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-...
该项目为ActiveTools-Server户外活动助手服务端,采用Java语言编写,并融入了JavaScript、CSS和HTML等技术,共包含712个文件,涵盖174个Java源文件、168个JavaScript文件、65个CSS文件、59个JSP文件、52个HTML文件等...
本Demo是基于C#和gRPC框架实现的一个微服务实例,实现了服务端和客户端的分离,这有助于提升系统的可扩展性和可维护性。 gRPC是一个高性能、开源和通用的RPC框架,面向移动和HTTP/2设计,由Google开发并贡献给开放...
这是网站版的电商系统,是Shop-for-iOS的服务端代码。 这是网站版的电商系统,是Shop-for-iOS的服务端代码。 这是网站版的电商系统,是Shop-for-iOS的服务端代码。 注意:如果用PHP开发,请使用 Shop-for-PHP-Yii2
前言---白日门服务端搭建和客户端编译 白日门传奇手游服务端的搭建和客户端的编译 本视频主要讲述对白日门手游的搭建和客户端的IP地址修改 改IP即可 所需工具,宝塔5.4或新版宝塔(注:新版只支持Windows server...
ArcGIS 是一款由 Esri 公司开发的全面的地理信息系统(GIS)软件,涵盖了从桌面应用到服务端解决方案的广泛领域。它旨在为用户提供一套可伸缩的 GIS 平台,满足从个人用户到大规模组织的各种需求。 【ArcGIS ...
这是网站版的电商系统,是Shop-for-iOS的服务端代码。注意:如果用PHP开发,请使用 Shop-for-PHP-Yii2 软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等...
正版个人毕设-基于SpringBoot 和 Nuxt 的服务端渲染博客系统.zip正版个人毕设-基于SpringBoot 和 Nuxt 的服务端渲染博客系统.zip正版个人毕设-基于SpringBoot 和 Nuxt 的服务端渲染博客系统.zip正版个人毕设-基于...
该规约是基于TCP/IP协议栈构建的,提供了高效、可靠的实时数据传输能力。 这个模拟器包含了服务端和客户端两部分,这意味着用户可以模拟发送和接收符合IEC60870-5-104标准的数据,这对于测试、调试和理解该规约的...
毕业设计之SpringCloud-B2C电子商务平台服务端
总的来说,这个压缩包提供了构建实时聊天或消息传递应用的后端服务端所需的所有组件,开发者可以基于此实现与前端的WebSocket连接,提供高效、低延迟的通信服务。在实际开发过程中,还需要根据具体需求进行定制和...
2、ngrok 内网穿透,域名映射 3、核心代码 1、填写服务器的配置 2、验证服务器地址的有效性 3、根据接口文档实现业务逻辑 4、功能实现流程 5、其他说明