williamluo 发表于 2020-3-11 17:11:17

【报表-参数过滤】报表动态参数的实现

本帖最后由 James.Lv 于 2023-1-5 18:11 编辑

报表参数主要用于数据过滤,实际业务中,有些过滤条件是可输可不输的,这种过滤条件就需要用到动态参数,也叫可选参数。
Wyn Enterprise报表的动态参数有两种实现方式:(1)动态SQL语句、(2)直接使用SQL语句的OR子句。

(一)动态SQL语句

动态SQL语句是指数据集的查询语句,就是根据用户是否输入作为查询条件的参数值,动态生成SQL语句。
例如:
在对一个销售订单数据表【Demo_销售明细】查询时,如果用户没有输入查询条件,SQL语句是这样:
select * from Demo_销售明细
如果用户输入了【销售大区】这个过滤条件,SQL语句就要变成这样:
select * from Demo_销售明细 where 销售大区=@大区参数



实现这种动态SQL语句的方法如下:
(1)定义报表参数
定义一个报表参数,名称为:大区参数,可不输入,添加一个空字符串的默认值,如下图:

(2)创建数据集,先写普通的SQL语句,验证一下,以便得到数据集字段列表


(3)将SQL语句改成表达式形式的动态SQL语句
表达式形式的SQL语句如下图:

所谓表达式,就是以等于号开头的一个字符串,比如图中的:
="select * from Demo_销售明细 " & IIF(Parameters!大区参数.Value="", "", " where 销售大区='" & Parameters!大区参数.Value & "'" )

这个表达式的核心是一个IIF函数,其含义是,如果大区参数值是一个空字符串,也就是说用户没有输入参数值,那么select语句就不要where条件,否则,就加上一个 where 销售大区='参数值' 这样一个where条件子句。

这样修改数据集的查询语句之后,预览报表时,就是根据用户是否输入了参数值,动态执行有或者没有where条件的SQL语句了。

(二)直接使用OR子句

表达式形式的动态SQL语句,需要设计人员理解IIF函数的用法。
更简捷的方法是在SQL语句中的where条件中使用OR子句,如下图:

这时的SQL语句如下:
select * from Demo_销售明细
where (销售大区=@大区参数 OR @大区参数='' )

其中,where 条件中含有OR子句,其含义是:要么销售大区字段等于用户输入的大区参数的值,要么用户输入的大区参数是一个空的字符串(也就是没输入参数值)。两个条件满足一个即可,这样就可以根据用户是否输入查询条件,决定是显示全部记录还是仅显示部分符合查询条件的记录。

注意:
(1)这种方法需要先定义一个【查询参数】,通过 =Parameters!大区参数.Value 这样的表达式,绑定报表参数,以传递用户输入的查询条件。
(2)尽管这种方式具有简捷方便的特点,但是仅适用于where条件,如果报表需要根据参数的不同,动态决定from哪个表,或者动态决定select哪些字段,那就必须使用上面的动态SQL语句的方法。

不会游泳DE鱼 发表于 2022-2-28 14:37:08

参数有字符串型:大区、日期型:开始时间、结束时间,那OR子句该如何实现?查询语句:
       select * from 销售明细 where(销售大区 like concat('%',@大区,'%') or @大区='')and(创建时间 >= @开始时间 or @开始时间 = null) and (创建时间 <= @结束时间 or @结束时间 = null)

Bella.Yuan 发表于 2022-2-28 15:37:38

不会游泳DE鱼 发表于 2022-2-28 14:37
参数有字符串型:大区、日期型:开始时间、结束时间,那OR子句该如何实现?查询语句:
       select * fr ...

您好,该问题在下面帖子已回复,您可以查看一下。
报表展示数据时,参数多个有字符串型、日期型,如何展示全部再条件查询
https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=142024&fromuid=65049
(出处: 葡萄城产品技术社区)
页: [1]
查看完整版本: 【报表-参数过滤】报表动态参数的实现