您的位置:首页 > 其它

一对多关系新增,明细数据的处理

2019-06-18 15:24 197 查看

  一对多关系新增在平时也不少见,比如一笔订单肯定会有它的订单明细,明细中有多少个项目,又比如一个处方单有处方单明细说明包含哪些药品,而我这要说是关于服装商品的。UI如图:

  看了上面的UI之后我想大家应该清楚是怎么一个流程了,大概流程就是先新增table明细数据上面的商品信息,然后新增table中的明细信息。上面的商品信息获取难度不大,就是table明细数据获取复杂一点。那应该用什么来装这些数据呢?我想你们想到的应该是数组,数组的确可以用来装这些数据,声明六个数组,每个数组装一列的数据,然后把数组传递到后台新增。这样是没问题,但是这样写需要传递的数组太多了,后台接收也不方便。所以我想到一个方法,就是把每一行的值拼接成一个字符串,传递时只需要传一个字符串过去就行了。然后后台根据字符串分割成一个数组,循环这个数组,循环次数就是这个数组的长度/列数(这里为6),循环次数就是明细数据的条数。然后依次赋值新增就完成了,不像用数组那样需要传递多个。而且我这还加上了判断每条明细数据的产品编码/条码是否重复的方法。
  不多说了直接上代码,代码中也有详细解释,先看jsp页面处理明细数据的三个方法:
外部申明变量直接可以调用该方法返回数据:注意记得把最后一个逗号截掉再传给后台

  1. 处理明细表格数据方法
function HandleTbData(CommodityStyleNumber) {
var trContent = "";//数据字符串
var code = ""; //商品编码
var code2 = "";//条码
var repeat = false; //重复状态
var tr = $(".table-box table tbody tr");//所有的tr
if (tr.length > 1) {//如果明细数据有多条
for ( var i = 0; i < tr.length - 1; i++) {//第一层循环,循环对象为每行明细数据:tr,最后一条另外处理所以-1
for ( var f = 1; f < $(tr[i]).find("td").length; f++) {//第二层循环,循环对象为第i行数据的每列的明细数据:td
if ($($(tr[i]).find("td")[f]).find("select").length > 0) {//查找td下的下拉框控件,有就给字符串拼上它的值
trContent += $($(tr[i]).find("td")[f]).find("select").val() + ",";
} else {//没有下拉框就拼td的值
var val = $(tr[i]).find("td")[f].innerHTML;//第i行第f列的值
//如果为空就进行空值处理,保证它有个值,当然我这需求就是为空时等于CommodityStyleNumber的值
if (val == "") {
//HandleNullTd(x,y):处理空值的方法。x表示第几列数据(td),y表示为空时要设置的值
val=HandleNullTd(f,CommodityStyleNumber);
}
trContent += val + ",";//把处理好的数据拼接到字符串中
if (i == 0 && f == 3) {
//保证是第一条且为第四列数据,只赋值一次用来跟后面的数据判断是否重复
code = val;
}
if (i == 0 && f == 4) {//上同,改为判断第五列数据
code2 = val;
}
if (i != 0 && f == 3 && code == val) {
//不为第一条且第四列数据,同时code与val相等表示重复了
repeat = true;//设置重复状态为真
}
if (i != 0 && f == 4 && code2 == val) {
repeat = true;//上同,改为判断第五列数据是否相同
}
}
}
}
//HandleLastTrData(x,y,z):处理最后一条数据的方法,x表示第几条数据(tr),y表示多条数据为真,z表示为空时要设置的值
trContent+=HandleLastTrData(tr[tr.length-1],true,CommodityStyleNumber);
} else {
//上同,只不过这里进入了esle表示只有一条数据,所以tr索引直接给0,多条数据为假
trContent+=HandleLastTrData(tr[0],false,CommodityStyleNumber);
}
if (repeat) {
return "";//重复返回空,外部调用判断为空时提示重复
} else {
return trContent;//无重复返回明细数据字符串
}
}
  1. 处理表格空值的方法
function HandleNullTd(column,CommodityStyleNumber){
var val="";//申明返回对象
if (column == 3 || column == 4) {//如果为第四或第五列赋CommodityStyleNumber值
val = CommodityStyleNumber;
} else if (column == 5) {//如果为第六列赋50
val = 50;
} else if (column == 6) {//如果为第六列赋10
val = 10;
}
return val;//返回
}
  1. 处理明细表格最后一条数据的方法
function HandleLastTrData(tr,states,CommodityStyleNumber){
//获取每列的值
var one =$($(tr).find("td")[1]).find("select").val();
var two =$($(tr).find("td")[2]).find("select").val();
var three =$(tr).find("td")[3].innerHTML;
var four =$(tr).find("td")[4].innerHTML;
var five =$(tr).find("td")[5].innerHTML;
var six =$(tr).find("td")[6].innerHTML;
var content="";//申明返回对象
if(states){//多条数据条件为真
//如果每列数据都没操作则不作处理
if(one==0&&two==0&&three==""&&four==""&&five==""&&six==""){
}else {//只要其中有一列选择或输入了值则进行处理
content=one+","+two+",";//首先拼接下拉框的值
for(var i=3;i<$(tr).find("td").length;i++){//然后从第四列开始循环每一列(td)
var val=$(tr).find("td")[i].innerHTML;//第i列的值
if(val==""){//接下来又是判断空值,并进行空值处理
val=HandleNullTd(i,CommodityStyleNumber);
}
content+=val+",";//最后拼接
}
}
}else {//多条数据条件为假,表示只有一条数据
content=one+","+two+",";//以下上同
for(var i=3;i<$(tr).find("td").length;i++){
var val=$(tr).find("td")[i].innerHTML;
if(val==""){
val=HandleNullTd(i,CommodityStyleNumber);
}
content+=val+",";
}
}
return content;//返回明细数据字符串
}

  数据处理好了就传递给后台,传递我就不给写出来了。servlet我也不写了,就是直接调用接口方法保存就行了,直接给大家看接口方法怎么分割怎么循环吧。

public String insertDetail(String dataString, int id) {
String msg = "保存失败!";
String[] dataStr = dataString.split(",");
for (int i = 0; i < dataStr.length / 6; i++) {
con = JdbcUitl.getConnection();
try {
ps = con.prepareStatement("INSERT INTO b_commoditydetail VALUES(?,?,?,?,?,?,?,?)",Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, 0);
ps.setInt(2, id);
if (dataStr[i * 6].equals("0")) {
ps.setString(3, null);
} else {
ps.setShort(3, Short.valueOf(dataStr[i * 6+1]));
}
if (dataStr[i * 6 + 1].equals("0")) {
ps.setString(4, null);
} else {
ps.setShort(4, Short.valueOf(dataStr[i * 6]));
}
ps.setString(5, dataStr[i * 6 + 2]);
ps.setString(6, dataStr[i * 6 + 3]);
ps.setShort(7, Short.valueOf(dataStr[i * 6 + 4]));
ps.setShort(8, Short.valueOf(dataStr[i * 6 + 5]));
ps.executeUpdate();
rs = ps.getGeneratedKeys();
if(rs.next()){
msg="保存成功!";
}
} catch (SQLException e)
{
e.printStackTrace();
}
}
return msg;
}

  需要大家注意的是在给占位符赋值时,你一定要清楚的知道数组中每个位置对应的是什么数据,然后在结合你新增的列给对应的值,不要赋错值了。还有就是这个方法有一缺陷,那就是必须每列都有值,不然根据长度循环新增这里准确计算。所以我这就在前台把空值都处理了给了默认值。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: