簡體   English   中英

訪問 SSRS 自定義代碼中的參數集合以獲取參數名稱/值對

[英]Accessing Parameter Collection in SSRS Custom Code to get Parameter Name/Value Pairs

我有一個 SSRS 報告要求,通過連接所有報告參數名稱和值對,通過自定義代碼生成 json 字符串。 為了實現這一點,我可以顯式訪問每個報告參數並連接以生成預期的文本。 但是,我試圖找出是否有辦法循環遍歷參數集合並動態生成它,以便在添加新參數時無需更新函數。 謝謝!!

在此處輸入圖片說明

好的,因此由於自定義代碼對參數收集的支持不是很好,因此這僅在將報告發送到服務器后才有效。 這使得調試變得棘手,但我們可以通過在測試時對參數進行硬編碼來解決這個問題。

這個答案可能看起來很長,但實際上它很快就可以完成。

開始創建報告並添加參數

在我的示例報告中,我有兩個參數,

  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參數值設置為報告的路徑和報告名稱。 您可以在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

第一個函數接受參數對象和數據類型,並通過參數值循環返回一行,例如"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

就是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM