在对多sheet进行填报的时候,往往需要从其他sheet取数参与计算,或者以其他sheet的数据为依据,对当前sheet的填报数据进行一定的约束,这个就是跨sheet校验。
提交校验
在提交数据之前对数据进行校验,比如说,当前模板有2个sheet,sheet1里面的某个数据与sheet2里面的某个数据的和必须满足特定条件。
如下图,点击模板>报表填报属性,切换到数据校验标签,添加一个内置校验,校验公式为sheet1!A2+sheet2!B2>1000,校验出错信息为shee1的A2单元格与sheet2的B2单元格和值太小:
注:校验公式中直接跨sheet取数进行计算,跨sheet取数详细请查看多sheet数据计算
js校验
使用js对多sheet进行校验,原理是将其他sheet的数值通过FR取数方法赋值给js里面定义的参数,然后参与校验。
比如说,在编辑sheet2里面的B2单元格的时候,如果sheet1的A2单元格与sheet2的B2单元格的和小于1000,则提示警告,如下图:
给sheet2的B2单元格的控件添加一个编辑结束事件,如下图:
js代码为:
- var para=contentPane.getCellValue(0,0,1);//获取sheet1里面的A2单元格数据
- var value=this.getValue();//获取当前单元格数据
- var sum=parseInt(para)+parseInt(value);//将字符串转换为整形并求和
- if(sum<1000){alert("shee1的A2单元格与sheet2的B2单元格和值太小");}
由上图的js代码可知,在js中进行跨sheet校验,获取其他sheet的单元格值可通过方法contentPane.getCellValue(sheet号,列号,行号); //sheet号,列号,行号是从0开始来获取,详细请参照填报预览JS实例
其它JS比较检验范例:
对B2单元格控件设置事件编辑,添加编辑结束事件,具体JS代码如下:
- var D2value = contentPane.curLGP.getCellValue("D2"); //获取D2单元格的值
- if (this.getValue()*1 < D2value){ //判断输入值是否小于D2单元格值
- FR.Msg.alert(FR.i18n.Alert, "该值不能小于" + D2value); //弹出对话框
- return false;
- }
其中获取填报单元格的值的详细介绍请查看填报预览JS实例
对B3单元格控件进行事件编辑,添加编辑结束事件,具体JS代码如下:
- var D3value = contentPane.curLGP.getCellValue("D3"); //获取D3单元格的值
- if (this.getValue()*1 != D3value){ //判断输入值是否与D3单元格相等
- FR.Msg.alert(FR.i18n.Alert, "该值应等于" + D3value); //弹出对话框
- return false;
- }
其中,D3value是自定义变量,用于获得D3单元格的值,if语句是用来判断该单元格输入后的值是否等于D3value,如果不是是则弹出警告:该值应等于abc。
2.数据集检验:检验某个单元格值是否在数据范围内
内置校验写法如下:INARRAY(D2,zzdyxy.group(diqu))>0 ;//D2的值要在数据集zzdyxy的diqu列的范围内,否则检验不通过。
引用数据集中的某个列固定写法:数据集名.group(列名)
3.填报单元格重复值检验:
根据要检查的重复值的列,分别取两个单元格:一个B6引用单元列数组求个数如:count([A2]) 为[A2]扩展出数组,
另一个D6为去掉重复值后的个数count(UNIQUEARRAY([A2]))
然后内置检验公式 B6=D6 提示A2重复
其它公式套用:
在B5单元格设置公式:JOINARRAY([A3], ""),取数组原始字符串,不加间隔符号,
在D5单元格设置公式:JOINARRAY(UNIQUEARRAY([A3]), ""),取数组去掉重复值后的字符串,不加间隔符号。
4.检验可强提交 在填报WEB属性自定义工具栏里面设置(只提交当前sheet也在其中)
----------------------------------------------------------------------------------------------------------------------------------------------
扩展:填报存在时不提交并提示已存在(重点)
控件添加编辑后事件,参考下面代码写js:
- //获取填报控件的值
- var name = contentPane.getWidgetByName("name").getValue();
- //判断填报内容在数据库中是否存在
- var sql ="SQL(\"FRDemo\",\"SELECT 销售员 FROM 销量 where 销售员='"+name+"'\",1,1)";
- var len = FR.remoteEvaluate(sql).length;
- if(len != 0)
- {
- FR.Msg.alert(FR.i18n.Alert,"该销售员已存在,请重新输入。");
- contentPane.getWidgetByName("name").setValue("");
- }
复制代码
或者用填报属性的数据校验写校验公式:
LEN(SQL("FRDemo", "SELECT 销售员 FROM 销量 where 销售员='" + A1 + "'", 1, 1)) == 0