最新历史版本 :参数为空查询全部 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

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 数据集参数

定义好数据集参数后,在参数面板添加一个「下拉框控件」,给控件绑定好数据字典,查询时控件不选择值,即参数值为空查询时查询出所有报表数据。如下图所示:

详细实现步骤可见:下拉框参数为空选择全部

1567596912453576.gif

3.2 模板参数

定义好模板参数、设置好过滤条件后,在参数面板添加一个「下拉框控件」,给控件绑定好数据字典,查询时控件不选择值,即参数值为空查询时查询出所有报表数据。效果如 3.1 节所示。

详细实现步骤可见:下拉框参数为空选择全部