我有一个 SSRS 报告要求,通过连接所有报告参数名称和值对来通过自定义代码生成 json 字符串。为此,我可以显式访问每个报告参数并连接以生成预期的文本。但是,我试图找出是否有循环遍历参数集合并动态生成它,以便在添加新参数时无需更新函数。谢谢!!
1 回答
好的,由于自定义代码不能很好地支持参数收集,这仅在将报告部署到服务器后才有效。这使得调试变得很棘手,但我们可以通过在测试时硬编码参数来解决这个问题。
这个答案可能看起来很长,但实际上做起来很快。
开始创建报告并添加参数
在我的示例报告中,我有两个参数,
- CountryID(文本 - 多值)
- 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.catalog
在Path
列中得到它,它看起来像="/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
而已。