在 SSRS 自定义代码中访问参数集合以获取参数 Name/Value 对

Accessing Parameter Collection in SSRS Custom Code to get Parameter Name/Value Pairs

我有一个 SSRS 报告要求,通过连接所有报告参数名称和值对,通过自定义代码生成 json 字符串。为实现这一点,我可以显式访问每个报告参数并连接以生成预期的文本。但是,我试图找到是否有循环遍历参数集合并动态生成它的方法,这样就不需要在添加新参数时更新函数。谢谢!!

好的,由于通过自定义代码不能很好地支持参数收集这一事实,这只有在将报告发送到服务器后才有效。这使得调试变得棘手,但我们可以通过在测试时对参数进行硬编码来解决这个问题。

这个答案可能看起来很长,但实际上做起来很快。

开始创建报告并添加参数

在我的示例报告中,我有两个参数,

  1. CountryID(文本 - 多值)
  2. PeriodID(整数 - 单值)

立即部署报告 即使尚未完成,我们也需要立即部署才能让其余部分正常工作。

所以我们需要做的第一件事就是获取参数列表。如果我们知道报告的完整路径,我们就可以这样做。我们现在将对该值进行硬编码,但在完成之前将其动态化。

创建一个名为 dsParameters 的数据集并将查询设置为以下内容。

DECLARE @pNameList varchar(1000) =''
SELECT  @pNameList = eachParam.value('Name[1]', 'VARCHAR(250)') +'|' + eachParam.value('Type[1]', 'VARCHAR(250)') + CASE @pNameList WHEN '' THEN '' ELSE ',' + @pNameList END 
    FROM (
            SELECT CONVERT(XML, c.Parameter) AS pxml 
                FROM  ReportServer.dbo.Catalog c  
                WHERE c.[Path] = @ReportPath
            ) a  
            CROSS APPLY pxml.nodes('//Parameters/Parameter') ( eachParam )
SELECT @pNameList  as pNameList

这会return有点像

PeriodID|Integer,CountryID|String

现在右键单击数据集,选择“数据集属性”,然后选择“参数”。

@ReportPath 参数值设置为报告的路径和报告名称。你可以在 Path 列中得到这个 ReportServer.dbo.catalog ,它看起来像 ="/Sales Reports Folder/My Sales Report"注意 正斜杠。

一旦一切正常,我们稍后会回到硬编码值。

接下来,转到报表的属性并单击“代码”选项卡。

粘贴以下两个函数。

Public Function GetParameterValues(ByVal parameter as Parameter, ByVal pType as string)  as String  
   Dim s as String = ":["
   If parameter.IsMultiValue then  
      For i as integer = 0 to parameter.Count-1  
         if i >0 then 
            s = s + "," 
         end if
         if pType = "String" then
            s = s + """" + CStr(parameter.Value(i)) + """"
         else
            s = s + CStr(parameter.Value(i)) 
         end if
      Next  
   Else  
      s = s + CStr(parameter.Value)  
   End If  
   Return s + "]" 
End Function  


Public Function GetJSON(ByVal parameters as Parameters, pNameTypeList as String) as string
' pass in a list of parameter names
' for each name GetParameterValues
'     append the result to json txt

    Dim pList() AS String = Split(pNameTypeList, ",")
    Dim pParts() AS String
    Dim i as Integer
    Dim pName as string
    Dim pType as string
    Dim json as String ="{"

    While i <= pList.Length - 1
        pParts = Split(pList(i), "|")
        pName = pParts(0)
        pType = pParts(1)
         if i >0 then 
            json = json + "," 
         end if        
        json = json & """" & pName & """" 
        json &= GetParameterValues(parameters(pName), pType) 
        json = json & vbcrlf
        i += 1
    End While

    json = json & "}"

    Return json
End Function

第一个函数接受参数对象和数据类型,并将参数值循环到 return 一行,例如 "CountryID":["89","94"]

第二个函数采用 Name1|Type1,Name2|Type1 形式的参数集合和参数名称和类型列表。它以 json“header”开头,根据需要重复调​​用第一个添加逗号的函数,然后关闭 json.

输出将是这样的...

{"PeriodID":[2020300]
,"CountryID":["89","94"]
}

注意 我只为 String 类型定义了引号,您可能需要根据需要进行调整。

最后(几乎)创建一个文本框并将值表达式设置为

=Code.GetJSON(Parameters, 
            First(Fields!pNameList.Value, "dsParameters")
            )

这是最终的报告输出...

最终 我们需要使该数据集参数动态化。返回数据集的参数并将 @ReportPath 参数值设置为

=Globals!ReportFolder & "/" & Globals!ReportName

就是这样。