在新增的时候会遇到同样一条数据可以重复提交的问题。
比如采购申请的时候我已经申请某药品,按理来说,不应该再重复新增的,它只是在原来申请数量的基础上改变它的数量就好了。但是在没有处理的情况下,再次申请这个药品的时候它还是会新增一条数据的,这样的话会显得数据好像有点冗余,虽说如此,不过,查看单据信息的时候还是比较清楚的。
因为新增一条数据,虽然申请的药品相同,但是它们的单据号肯定是不同的,因此就会考虑到单据的问题,由于之前建表的时候没有考虑到这个问题,所以还是要修改一下数据库的表,应该把单据信息放在一个表中(申请单据表),把申请的药品放在一个表中(申请药品表),然后再把申请药品表中的主键作为外键放入申请单据表中,因此,查询申请药品单据明细的时候也就清楚了。
单据信息(申请的药品相同,但申请数量不同,单据编号也不同):
申请的药品信息(查询出每一个药品申请的总数)
那是如何处理重复新增的问题呢?
其实很简单,大概思路就是如果申请药品表中存在某药品,就只执行新增单据信息的代码块(获取的是已经存在的那个申请药品ID),若不存在某药品,就执行新增申请药品信息以及新增单据信息的代码块。
1、在Dao实现类中查询出申请表中唯一的药品
@Override
public List<DrugInfo> selectTest() {
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
List<DrugInfo> drugInfos=new ArrayList<DrugInfo>();
String selectCGSQ="SELECT purchaseNuberID,dj.pharmacypurchase,sq.inventoryID " +
"FROM sys_applyreceipts dj " +
"join test sq on dj.pharmacypurchase=sq.pharmacypurchase " +
"JOIN pw_inventory kc ON sq.inventoryID=kc.inventoryID";
try {
con=DbUtil.getConnection();
ps=con.prepareStatement(selectCGSQ);
rs=ps.executeQuery();
while(rs.next()){
DrugInfo info=new DrugInfo();
info.setPurchaseNuberID(rs.getInt("purchaseNuberID"));
info.setInventoryID(rs.getInt("inventoryID"));
info.setPharmacypurchase(rs.getInt("pharmacypurchase"));
drugInfos.add(info);
}
} catch (SQLException e) {
e.printStackTrace();
}
return drugInfos;
}
2、在servlet新增的方法中,获取要新增的字段值,实例化po实体类,给对象赋值,在新增之前先执行Dao实现类中的查询方法,判断新增的数据是否为数据库中已经申请的药品,由于返回的是list集合,用foreach循环遍历,当存在同一药品时跳出循环,执行新增单据信息的代码块,若不存在相同的药品就执行新增申请药品信息和新增单据信息的代码块。
代码如下:
public int insertTest(HttpServletRequest request,HttpServletResponse response) throws IOException{
int msg=0;
//获取页面参数
String inventoryID=request.getParameter("inventoryID");
String medicinecompanyID=request.getParameter("medicinecompanyID");
String userid=request.getParameter("UserID");
String purchaseNuber=request.getParameter("purchaseNuber");
String purchasedate=request.getParameter("purchasedate");
String remark=request.getParameter("remark");
String purchaseshu=request.getParameter("purchaseshu");
//赋值
DrugInfo drugInfo=new DrugInfo();
drugInfo.setInventoryID(Integer.parseInt(inventoryID));
request.setAttribute("inventoryID", drugInfo.getInventoryID());
List<DrugInfo> drugInfos=drugService.selectTest();//执行查询方法
Integer Pharmacypurchase=0;//定义一个变量 用来获取已经存在的Pharmacypurchase值
for (DrugInfo drugInfo2 : drugInfos) {//foreach循环遍历
//获取值
Integer InventoryID=drugInfo2.getInventoryID();
Pharmacypurchase=drugInfo2.getPharmacypurchase();
//设置值
request.setAttribute("InventoryID", InventoryID);
request.setAttribute("Pharmacypurchase", Pharmacypurchase);
//判断新增的是否为已经存在的
if(request.getAttribute("inventoryID").equals(request.getAttribute("InventoryID"))){ //存在时跳出循环
break;
}
}
if(request.getAttribute("inventoryID").equals(request.getAttribute("InventoryID"))){//存在相同的药品时新增单据表
drugInfo.setPharmacypurchase(Pharmacypurchase);//已经存在的Pharmacypurchase值
drugInfo.setMedicinecompanyID(Integer.parseInt(medicinecompanyID));
drugInfo.setUserid(Integer.parseInt(userid));
drugInfo.setPurchaseNuber(purchaseNuber);
drugInfo.setPurchasedate(purchasedate);
drugInfo.setRemark(remark);
drugInfo.setPurchaseshu(Double.parseDouble(purchaseshu));
msg=drugService.insertTest1(drugInfo);
}else{//不存在就新增药品申请表 新增单据表
msg=drugService.insertTest(drugInfo);//执行新增药品申请表
if(msg>0){
drugInfo.setPharmacypurchase(msg);//新增的Pharmacypurchase值
drugInfo.setMedicinecompanyID(Integer.parseInt(medicinecompanyID));
drugInfo.setUserid(Integer.parseInt(userid));
drugInfo.setPurchaseNuber(purchaseNuber);
drugInfo.setPurchasedate(purchasedate);
drugInfo.setRemark(remark);
drugInfo.setPurchaseshu(Double.parseDouble(purchaseshu));
msg=drugService.insertTest1(drugInfo);//执行新增新增单据表
}
}
JsonReturn jsonReturn=new JsonReturn();
if(msg>0){
jsonReturn.setState(true);
jsonReturn.setMsg("采购申请成功!");
}else{
jsonReturn.setState(false);
}
//写入json
JSONObject jsonObject=JSONObject.fromObject(jsonReturn);
PrintWriter writer=response.getWriter();
writer.write(jsonObject.toString());
writer.flush();
writer.close();
return msg;
}
3、Jsp页面:获取要新增的字段的值,判断各个字段的值是否为空,为空时会提示;填写完整后把值传到Servlet的新增方法中,由于是用post提交,而返回的是JSON,所以需要解析一下data=JSON.parse(data),如果返回的状态为true就新增成功,反之,为false则新增失败。
//采购申请保存
$("#insertSave").click(function(){
var inventoryID = $("#inventoryID").val();
var UserID = $("#SelectCGY").val();
var medicinecompanyID=$("#medicinecompanyID").val();
var purchaseNuber=$("#purchaseNuber").val();
var purchasedate=$("#purchasedate").val();
var remark=$("#remark").val();
var purchaseshu = $("#purchaseshu").val();
var InventoryCount=$("#InventoryCount").val();
if(inventoryID>0 && UserID>0 && medicinecompanyID>0 && purchaseNube!="" && purchasedate!=""
&& remark!="" && purchaseshu!="" && InventoryCount!=""){
$.post("${ctx}/servlet/DrugServlet?type=insertTest",{inventoryID:inventoryID,
UserID:UserID,medicinecompanyID:medicinecompanyID,purchaseNuber:purchaseNuber,
purchasedate:purchasedate,remark:remark,purchaseshu:purchaseshu},function(data){
data=JSON.parse(data);//解析
if(data.state){
layer.alert(data.msg,{icon:1,title:"提示"});
$("#formDJBH").resetForm();
$("#formYPXX").resetForm();
tabInsertYP.refreshPage();
tabSQYP.refreshPage();
}else{
layer.alert("申请失败",{icon:0,title:"提示"});
}
});
}else{
layer.alert("请填写完整!",{icon:0,title:"提示"});
}
});