• 参数为空取全部数据的几种做法


    润乾报表中支持用户通过参数对数据过滤,而当多个条件联合查询时,如果某个条件没有输入值,用户会希望该条件失效,也就是条件为空则视为没有这个条件,取出所有满足其它条件的数据。

    例如,按照地区查询,参数值输入东北,则报表展示如下:

    如该参数为空,则结果如下:

    下面通过一个订单信息表来看下该需求的实现过程。

    首先在报表设计器中制作一个网格式报表,如图:

    并在该报表的基础上增加两个参数用于数据过滤:

    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

    来源:乾学院

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    k8s采坑记
    [dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。
    亲测可用,iptables实现NAT转发。
    【转】干货,Kubernetes中的Source Ip机制。
    k8s实践
    干货!分享一款windows下的磁盘分析神器。
    干货,不小心执行了rm -f,除了跑路,如何恢复?
    Java8函数式编程
    搭建git服务器
    Python3安装
  • 原文地址:https://www.cnblogs.com/IBelieve002/p/10038067.html
Copyright © 2020-2023  润新知