C# 访问SSRS自定义代码中的参数集合以获取参数名称/值对
我有一个SSRS报告要求,通过连接所有报告参数名称和值对,通过自定义代码生成json字符串。为了实现这一点,我可以显式地访问每个报告参数并连接以生成预期的文本。但是,我试图找到是否有任何方法可以循环参数集合并动态生成它,这样就不需要在添加新参数时更新函数。谢谢C# 访问SSRS自定义代码中的参数集合以获取参数名称/值对,c#,vb.net,reporting-services,custom-code,C#,Vb.net,Reporting Services,Custom Code,我有一个SSRS报告要求,通过连接所有报告参数名称和值对,通过自定义代码生成json字符串。为了实现这一点,我可以显式地访问每个报告参数并连接以生成预期的文本。但是,我试图找到是否有任何方法可以循环参数集合并动态生成它,这样就不需要在添加新参数时更新函数。谢谢 好的,由于定制代码不太支持参数集合,因此只有在报表被解析到服务器后,这才有效。这使得调试变得很棘手,但我们可以在测试时通过硬编码参数来解决这个问题 这个答案看起来可能很长,但实际上很快就可以找到 要开始,请创建报告并添加参数 在我的样本报
好的,由于定制代码不太支持参数集合,因此只有在报表被解析到服务器后,这才有效。这使得调试变得很棘手,但我们可以在测试时通过硬编码参数来解决这个问题 这个答案看起来可能很长,但实际上很快就可以找到 要开始,请创建报告并添加参数 在我的样本报告中,我有两个参数
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
,它看起来像=“/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
注意我只为字符串
类型定义了报价,您可能需要根据需要进行调整
最后(几乎)创建一个文本框并将值表达式设置为
=Code.GetJSON(Parameters,
First(Fields!pNameList.Value, "dsParameters")
)
这是最终报告输出
最后我们需要使数据集参数动态化。返回数据集的参数并将@ReportPath
参数值设置为
=Globals!ReportFolder & "/" & Globals!ReportName
就这样。你能用你的报告参数样本和相同样本数据的预期输出编辑你的问题吗。现在你更新了问题,我删除了我的原始答案。我现在还不知道该怎么做,但我会考虑的。我能想出如何得到单个零件,但到目前为止还不能把它们粘在一起。艾伦,我想这可能行得通。嗨@aduguid,我确实找到了,但我认为可能有更好的方法。可能不需要特殊权限的。希望你今天能抽出时间来做这件事。。
=Globals!ReportFolder & "/" & Globals!ReportName