行式报表新增行内数据的校验

需求描述

用户在网页端录入股票数据,要通过行式填报表在网页端插入空行,然后进行数据的录入,录入数据时要求实现校验功能,如下图:

红色区域在报表展现时为一行,现在通过行式报表的添加行功能添加了三行,要求在这三行内输入明细信息,主要问题在身份证号及证券名称代码这里,要求同一个身份证号下不能出现相同的证券代码,这就要求在填写证券代码时先判断当前行对应的身份证号是否在其他行出现过,如果出现过在判断当前证券代码是否和同一身份证号证券代码相同,如果相同则弹出出错信息,如下图:

可以看到,当输出第三行时身份证相同,证券号码相同,则弹出错误提示。

解决办法:

润乾报表支持校验,并且能够引用js函数校验,这样就可以通过自定义js函数实现该校验功能,但在使用中有几个注意事项。

在润乾的应用开发文档中介绍到了可以用document.getElementById(“report1_A1″).value方式获得单元格的值,这样就可以通过这种方式循环遍历扩展行看是否值相同,但在实际使用时发现这种方式只能获取固定单元格的值,并不能获取动态插入的这些行的单元格,例如,扩展区域在第10行,页面端插入了两行,此时用document.getElementById(“report1_A11″).value获得的值并不是插入的第11行,而是在报表设计时的第11行值,这样前边的需求就无法实现,只能通过其他方式实现。

实际上可以把标签生成的报表table当做一个数组,然后从这个数组中动态获得值,这个数组中的值是报表在页面端插入行后的值,如:document.getElementById(“report1″).rows[r].cells[2].value下面介绍下实现思路。

首先在证券代码单元格校验中引用js函数,并且传入相关参数:checkNo(J10,C10.toString(),E10.toString()),可以看到,这里传入三个参数,C10为身份证号单元格用于判断身份证是否相同,E10单元格是证券号单元格,但该函数又传入一个单元格J10,这个主要是因为将来做数据判断证券号和身份证号时必须要把当前行的单元格除去,否则肯定会报循环引用错误,所以J10单元格是通过流水号动态的获得当前是第几行,方便校验判断。

jsp中定义js函数:

function checkNo(num,sfz,zqh){//校验证券好函数,传入三个参数,行号,身份证号,证券号

var len=document.getElementById(“report1″).rows.length-5;//获得扩展区行数,减去5是因为扩展区下边有5个固定行,将这部分减去只判断扩展区的值

num=num-2;//以数组形式,要将行号-2

for(var r=9;r<len;r++){//从第10行开始动态判断

if(num!=r){//过滤掉当前行

var cellC10=document.getElementById(“report1″).rows[r].cells[2].value;//获得页面端身份证号,注意这里是用数组形式

var cellE10=document.getElementById(“report1″).rows[r].cells[3].value;//获得页面端证券号

if(sfz==cellC10){//如果身份证号和当前身份证相同,继续比较

if(zqh==cellE10){//判断证券号是否相同

return false;//如相同,返回false

}

}

}

}

return true;//返回true,校验通过

}

这样就可以实现上述业务需求。

热门文章