一对多关系新增,明细数据的处理
2019-06-18 15:24
197 查看
一对多关系新增在平时也不少见,比如一笔订单肯定会有它的订单明细,明细中有多少个项目,又比如一个处方单有处方单明细说明包含哪些药品,而我这要说是关于服装商品的。UI如图:
看了上面的UI之后我想大家应该清楚是怎么一个流程了,大概流程就是先新增table明细数据上面的商品信息,然后新增table中的明细信息。上面的商品信息获取难度不大,就是table明细数据获取复杂一点。那应该用什么来装这些数据呢?我想你们想到的应该是数组,数组的确可以用来装这些数据,声明六个数组,每个数组装一列的数据,然后把数组传递到后台新增。这样是没问题,但是这样写需要传递的数组太多了,后台接收也不方便。所以我想到一个方法,就是把每一行的值拼接成一个字符串,传递时只需要传一个字符串过去就行了。然后后台根据字符串分割成一个数组,循环这个数组,循环次数就是这个数组的长度/列数(这里为6),循环次数就是明细数据的条数。然后依次赋值新增就完成了,不像用数组那样需要传递多个。而且我这还加上了判断每条明细数据的产品编码/条码是否重复的方法。
不多说了直接上代码,代码中也有详细解释,先看jsp页面处理明细数据的三个方法:
外部申明变量直接可以调用该方法返回数据:注意记得把最后一个逗号截掉再传给后台
- 处理明细表格数据方法
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;//无重复返回明细数据字符串 } }
- 处理表格空值的方法
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;//返回 }
- 处理明细表格最后一条数据的方法
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; }
需要大家注意的是在给占位符赋值时,你一定要清楚的知道数组中每个位置对应的是什么数据,然后在结合你新增的列给对应的值,不要赋错值了。还有就是这个方法有一缺陷,那就是必须每列都有值,不然根据长度循环新增这里准确计算。所以我这就在前台把空值都处理了给了默认值。
相关文章推荐
- Django之ModelForm处理外键关系数据
- sql视图处理复杂的数据查询关系
- SQL Server数据库中导入导出数据及结构时主外键关系的处理
- 收集下关系数据库处理亿万级别的数据
- 学习altas笔记[客户端JS和Altas环境初始化关系和DataTable返回数据的客户端处理]
- 建模数据(一 处理关系集数据)
- sql视图处理复杂的数据查询关系
- 使用 ibatis 处理复杂对象数据关系的实例
- Matlab生物信息学工具箱新增功能——处理GEO系列数据
- 使用 ibatis 处理复杂对象数据关系的实例
- 【Web API系列教程】3.4 — 实战:处理数据(处理实体关系)
- 学习altas笔记[客户端JS和Altas环境初始化关系和DataTable返回数据的客户端处理]
- 了解传输信道的使用、传输信道特性、描述来自上层的数据在进行扩频前的处理过程、传输信道向物理信道的映射关系。
- 学习altas笔记[客户端JS和Altas环境初始化关系和DataTable返回数据的客户端处理]
- django中在数据中删除了关系表后怎么处理
- 一步一步学EF系列二【Fluent API的方式来处理实体与数据表之间的映射关系】
- 树形结构的处理--数据新增,修改、删除
- 使用 ibatis 处理复杂对象数据关系的实例
- 简析SQL Server数据库用视图来处理复杂的数据查询关系
- 关于JAVA处理大量新增数据的忠告