如何在关联过滤中使用模糊匹配查询
填报表的下拉数据集提供了关联过滤的功能,可以动态的根据某个单元格的值过滤下拉列表中的内容,一般大家都是用等号做完全匹配。具体可参考http://192.168.0.6:80/reportmis/RBP-11819文章。
其实,通过一些小技巧,就可以做到模糊匹配。
在实现功能之前,需要了解的一点是,因为这个关联过滤是在网页中完成的,所以它一定是一个javascript表达式。
尽管我们可以用报表中的表达式编辑器来编辑关联过滤表达式,但实际上它们都是报表自己的函数,无法被网页识别,我们要自己通过javascript来实现。
这里介绍一下用正则表达式实现模糊查询的方法。
比如要判断一个字符串中有没有”abc”这个字符串,正则表达式可以这样写:/.*abc.*/
一个简单的模糊匹配代码如下:
function testStirng1(str){
var regex=/.*abc.*/; // 定义正则表达式对象
return regex.test(str); // 判断是否匹配,返回布尔值
}
由于这里我们可能要动态的替换abc,因此正则表达式对象也是动态创建的,上面的代码可修改为:
function testString2(str1,str2){
// eval可以将一个字符串当作javascript的表达式来执行
// 这里借助它来实现动态的定义一个正则表达式
var regex = eval(”/.*”+str1+”.*/”);
return regex.test(str2);
}
将上面两句代码和在一起,就变成了:eval(”/.*”+str1+”.*/”).test(str2),这个就是我们要写在关联过滤表达式里面的内容。
接下来,就要对这个表达式来进行一下处理,使得报表可以识别并在解析时进行处理。
第一步:替换引号。
我们把双引号换成单引号:eval(’/.*’+str1+’.*/’).test(str2)
这么做是为了避免报表在解析表达式并生成html的时候出现混淆而导致错误,在具体编写表达式的时候要特别注意。
第二步:将str1换成要关联的单元格的名字。
将str2换成我们要关联的字段名,由于在javaScript中对数据类型不敏感,所以最好在字段名后面加上”.toString()”。
举例来说,现在我们有两个单元格A1和B1。其中A1是可写单元格;B1是下拉数据集,其中的col3字段要跟A1做模糊匹配。那么关联过滤的表达式为:
eval(’/.*’+A1+’.*/’).test(col3.toString())
上面的给出的例子是任意位置匹配,其实我们还可以实现左匹配和右匹配:
左匹配:eval(’/’+A1+’.*/’).test(col3.toString())
右匹配:eval(’/.*’+A1+’/’).test(col3.toString())
最后,要注意的一点是对于扩展格,需要把单元格的名字用${}括起来,这点和一般的完全匹配规则一样。