Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问SSRS自定义代码中的参数集合以获取参数名称/值对_C#_Vb.net_Reporting Services_Custom Code - Fatal编程技术网

C# 访问SSRS自定义代码中的参数集合以获取参数名称/值对

C# 访问SSRS自定义代码中的参数集合以获取参数名称/值对,c#,vb.net,reporting-services,custom-code,C#,Vb.net,Reporting Services,Custom Code,我有一个SSRS报告要求,通过连接所有报告参数名称和值对,通过自定义代码生成json字符串。为了实现这一点,我可以显式地访问每个报告参数并连接以生成预期的文本。但是,我试图找到是否有任何方法可以循环参数集合并动态生成它,这样就不需要在添加新参数时更新函数。谢谢 好的,由于定制代码不太支持参数集合,因此只有在报表被解析到服务器后,这才有效。这使得调试变得很棘手,但我们可以在测试时通过硬编码参数来解决这个问题 这个答案看起来可能很长,但实际上很快就可以找到 要开始,请创建报告并添加参数 在我的样本报

我有一个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
    
    这将返回类似于

    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