在 SSRS 自定义代码中访问参数集合以获取参数 Name/Value 对
Accessing Parameter Collection in SSRS Custom Code to get Parameter Name/Value Pairs
我有一个 SSRS 报告要求,通过连接所有报告参数名称和值对,通过自定义代码生成 json 字符串。为实现这一点,我可以显式访问每个报告参数并连接以生成预期的文本。但是,我试图找到是否有循环遍历参数集合并动态生成它的方法,这样就不需要在添加新参数时更新函数。谢谢!!
好的,由于通过自定义代码不能很好地支持参数收集这一事实,这只有在将报告发送到服务器后才有效。这使得调试变得棘手,但我们可以通过在测试时对参数进行硬编码来解决这个问题。
这个答案可能看起来很长,但实际上做起来很快。
开始创建报告并添加参数
在我的示例报告中,我有两个参数,
- 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
这会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
就是这样。
我有一个 SSRS 报告要求,通过连接所有报告参数名称和值对,通过自定义代码生成 json 字符串。为实现这一点,我可以显式访问每个报告参数并连接以生成预期的文本。但是,我试图找到是否有循环遍历参数集合并动态生成它的方法,这样就不需要在添加新参数时更新函数。谢谢!!
好的,由于通过自定义代码不能很好地支持参数收集这一事实,这只有在将报告发送到服务器后才有效。这使得调试变得棘手,但我们可以通过在测试时对参数进行硬编码来解决这个问题。
这个答案可能看起来很长,但实际上做起来很快。
开始创建报告并添加参数
在我的示例报告中,我有两个参数,
- 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
这会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
就是这样。