润乾报表中支持用户通过参数对数据过滤,而当多个条件联合查询时,如果某个条件没有输入值,用户会希望该条件失效,也就是条件为空则视为没有这个条件,取出所有满足其它条件的数据。
例如,按照地区查询,参数值输入东北,则报表展示如下:
如该参数为空,则结果如下:
下面通过一个订单信息表来看下该需求的实现过程。
首先在报表设计器中制作一个网格式报表,如图:
并在该报表的基础上增加两个参数用于数据过滤:
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 中进行过滤。回顾一下,我们首先解决的了单一参数值为空时,忽略该条件的问题;然后通过数组类型解决了参数中同时传递多个值的问题;最后通过分析,利用润乾报表可以在参数表达式中写函数的方式,彻底解决了传递多个参数值可能会遇到的问题。
作者:gxy
链接:http://c.raqsoft.com.cn/article/1543386793666?r=IBelieve
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。