在进行报表设计时,经常会用到参数报表这时就会遇到一个参数传递的问题,当参数值为多值的时候,由于ODBC数据源不支持多值参数的传递,这样就会出现查询结果不存在的情况。今天我就来给大家提供一种思路来解决这个问题,那就是通过动态拼接SQL 语句的方法绕过ODBC不支持多值传参的问题。

该方法的核心就是把传入的参数用Split函数进行一个分割,具体操作是通过一个脚本代码,然后把传入的多值参数进行一个分割。然后再进行SQL语句的查询。

多值传参

具体操作步骤:

1、 新建一张RDL报表,然后添加一个参数,参数值选择为多值或者多行。

新建一张RDL报表,然后添加一个参数

2、 添加数据源和数据集

数据集中查询语句的写法,通过用Code.ArrayToString()函数调用脚本:

="select \* from Test2 WHERE 业务编号 In ('" +
Join(Split(Code.ArrayToString( Parameters!P1.Value ), ","), "', '") + "')"

3、 脚本的编写,给每个参数值后加一个逗号,便于用Split()函数分割:

Function ArrayToString(list As Object()) As String
    Dim re = ""
    For Each item As String In list
        If item Is Nothing Then
            Continue For
        End If

        If re <> "" Then
            re += ","
        End If

        re += item
    Next
    Return re 
End Function

4、 运行结果:

运行结果:

多行传参

操作步骤:

1、 第一步同上,然后参数值选择多行。

2、 参数传递:

从Excel中拷贝出来的多个单元格内容之间,除了ASCII码10(换行)之外,还有ASCII码13(回车),因此需要把这个13去掉。所以参数的表达式的写法应该如下:

=Split(Replace([\@hawblist], chr(13),""),chr(10))

3、 数据集中SQL语句的写法如下:

其实主要思想就是通过Replace函数和Split函数进行一个参数的转换,然后进行SQL语句的编写来实现参数的传递。

="select \* from Test2 WHERE 业务编号 In ('" + Join(Split(Replace(
Parameters!P1.Value, chr(13),""),chr(10)), "', '") + "')"

4、 运行结果:

运行结果