【摘要】
当通过多个参数对数据进行过滤并且不选择某个参数时,希望依然能够查询出其他带条件的数据,也就是参数为空时忽略掉该条件,点击 参数为空取全部数据的几种做法查看具体的实现方法以及特殊场景的一些操作
润乾报表中支持用户通过参数对数据过滤,而当多个条件联合查询时,如果某个条件没有输入值,用户会希望该条件失效,也就是条件为空则视为没有这个条件,取出所有满足其它条件的数据。
例如,按照地区查询,参数值输入东北,则报表展示如下:
如该参数为空,则结果如下:
下面通过一个订单信息表来看下该需求的实现过程。
首先在报表设计器中制作一个网格式报表,如图:
并在该报表的基础上增加两个参数用于数据过滤:
area:用于接收参数对地区进行过滤
amount:接收参数对订单金额过滤
接下来更改数据集,增加参数过滤,如图:
在 sql 语句中,条件写法为:(货主地区 =? or ? is null),在对应的参数表达式中写上两个相同的参数名(area),表示如果 area 参数有值,则用货主地区 =area 条件过滤数据,否则执行 or 参数 is null,这样参数为空时后边条件成立,取出所有数据。
注意:
1、 参数表达式中内容和 sql 语句中的问号要一一对应,此处可以写重复名称。
2、 如果有多个条件过滤数据,则用括号将每组条件括起来。
通过上述操作,可以实现用户的需求。在实际使用中,用户希望货主地区能够传递多个地区,一次查询出多个地区数据,比如要同时查询华北和东北地区数据,对于此种方式,需要将对应参数类型更改为数组方式,并且更改 sql 语句中的条件写法。
将 area 参数类型更改成字符串组,并更改 sql 语句中语法为:
如多选方式,sql 中要用 in (?) 方式。
现在预览报表,如果 area 参数为空,则取出所有地区数据,如下图:
但是当 area 参数多选时会报错,如下图:
主要原因:如参数类型是数组方式,参数值是多个时,sql 中的问号会自动根据值的个数解析出多个,这样 or 后边多个问号会出现语法错误。
解决办法:将 or 后对应的参数用 string 函数强制转换成字符串格式即可,如:
再次预览报表即能取出正确结果。
注意:
一:当数据为 db2 时,使用 or ? is null 会出错,此时需要更改 sql 语句为 cast(? as varchar(10)) is null) 把这个 varchar 改成数据库中的类型即可, 需要对参数进行类型转换 。
二:当参数类型为数组形式,按照上边做法使用 string()函数转换时,有可能数组值太多导致 sql 报错,此时可改成:where ( 货主地区 in (?) or ? =’!EOF’),在参数表达式中写入 if(@area==” OR @area==null ,’!EOF’),此种做法是如果参数为空则给对应的问号处返回!EOF,这样就取出所有数据了,同理,DB2 问题也可以用此种方式实现。
可以看到,数据集的参数表达式处不仅能够直接写参数,而且还可以写润乾的函数对参数值先行处理,将处理后的结果再传递到 sql 中进行过滤。回顾一下,我们首先解决的了单一参数值为空时,忽略该条件的问题;然后通过数组类型解决了参数中同时传递多个值的问题;最后通过分析,利用润乾报表可以在参数表达式中写函数的方式,彻底解决了传递多个参数值可能会遇到的问题。