1. 概述
1.1 预期效果
使用参数进行报表数据查询时,希望当参数值为空时,点击查询后,显示报表中的全部数据。即在没有筛选条件的时候,显示报表所有内容,相当于不选值就不过滤。
如下图所示:
1.2 解决思路
参数过滤查询,一般都是通过模板参数或者数据集参数实现,所以要想实现此场景,就需要修改过滤条件和数据集定义方式。修改的原则:
数据集参数:当参数值为空时,查询报表所有内容
模板参数:当参数值为空时,不进行过滤
2. 实现方法
2.1 数据集参数
正常定义 数据集参数 时,参数有值,则将值拼接到 SQL 中执行查询,参数无值,则 SQL 查询语句查询条件为一个空字符,查不出值。如下:
SELECT * FROM 销量 where 地区 = '${area}'
area 参数有值时,如华东,则查询语句为 SELECT * FROM 订单 where 货主地区='华东',查询出华东地区的数据。area 参数无值时,则查询语句为 SELECT * FROM 订单 where 货主地区='',查询无数据。
现在要实现参数无值时查询全部,则在查询前,需要先判断参数是否有值,有值则执行带有查询条件的查询;无值则查询数据。
即有值时:SELECT * FROM 销量 where 地区 = '${area}'
无值时:SELECT * FROM 销量
这时就要考虑判断条件如何实现了,因为定义数据集参数时,支持使用 FineReport 所有内置函数,所以就可以通过 IF 函数来构造判断;参数为空如何判断呢,参数为空即参数值长度为 0,所以就可以使用 Len 函数来判断参数是否为空。
组合起来,定义数据集参数的SQL语句如下:
SELECT * FROM 销量 ${if(len(area) == 0,"","where 地区 = '" + area + "'")}
这样,当参数有值和无值时,将分别执行不同的 SQL 语句。当参数值为空时执行 SELECT * FROM 销量 ,不加任何条件即查询所有数据。
2.2 模板参数
模板参数实现查询时,是通过报表的过滤功能实现。如下图所示
给单元格添加过滤条件,过滤条件为 地区值=area值,这时若 area 参数为空,则过滤条件为地区='',所以过滤后就没有对应地区的数据。
现在要实现参数无值时查询全部,则在查询前,需要先判断参数是否有值,有值则执行过滤;无值则不过滤。可以通过 IF 函数来构造判断;参数为空可以使用 Len 函数来判断,参数长度为 0 时参数即为空,FineReport 过滤条件中,nofilter 表示不过滤,如此结合则得到过滤条件:
if(len($area)==0,nofilter,$area)
这样,当参数有值和无值时,就分别执行不同过滤机制。当参数值为空时不过滤,即查询出所有数据。
3. 示例
3.1 数据集参数
定义好数据集参数后,在参数面板添加一个「下拉框控件」,给控件绑定好数据字典,查询时控件不选择值,即参数值为空查询时查询出所有报表数据。如下图所示:
详细实现步骤可见:下拉框参数为空选择全部
3.2 模板参数
定义好模板参数、设置好过滤条件后,在参数面板添加一个「下拉框控件」,给控件绑定好数据字典,查询时控件不选择值,即参数值为空查询时查询出所有报表数据。效果如 3.1 节所示。
详细实现步骤可见:下拉框参数为空选择全部