0

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

在此处输入图像描述

4

1 回答 1

1

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

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

开始创建报告并添加参数

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

  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

这将返回类似

PeriodID|Integer,CountryID|String

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

@ReportPath参数值设置为报表的路径和报表名称。您可以ReportServer.dbo.catalogPath列中得到它,它看起来像="/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

第一个函数接受参数对象和数据类型,并遍历参数值以返回单行,例如"CountryID":["89","94"]

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

输出将是这样的......

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

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

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

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

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

在此处输入图像描述

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

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

而已。

于 2020-11-20T12:55:28.580 回答