2014年3月11日 星期二

[SQL Server 2008R2][SSRS] 使用者基礎報表資料篩選

在企業報表中,為了達到報表減量,通常會採用參數化報表,但是,實務上不可能讓所有具有此報表讀取權限的使用者可以任意設定參數,以看到全公司的營運資訊,舉例來說,一家分店的店長,不應看到全公司或其他分店的營運報表,只能讀取到屬於自己分店的資訊。此時,必須要做到動態根據使用者身份以決定可以瀏覽的報表內容。

要完成此種設定必須使用兩種技術:

  • 使用內建欄位 User!UserID,從傳回的「網域\登錄帳號」或是「電腦名稱\登入帳號」格式中取出登入帳號以進行篩選。
  • 根據取出的使用者帳號帶入篩選條件中,並使用資料集的篩選功能,將登入者帳號作為參數來限制他所能讀取到的資料範圍。
先設計一個資料表,根據使用者的身份決定瀏覽的內容,不同的帳號可以看到的產品大類項目。帳號 Administrator 可以看到 1 ~ 6 產品類別的資料;T165212 只可看到 1、2、6 這三類的產品類別。


在報表設計時,新增一個報表參數「UserName」,來儲存使用者登錄時的帳號,可以從內建欄位 User!UserID 中取出資料。
在報表資料視窗的參數上按右鍵,加入參數。


切換至預設值,點選「指定值」,並點選運算式圖示。


運算式如下:=Mid(User!UserID,InStr(User!UserID,"\")+1,Len(User!UserID)-InStr(User!UserID,"\"))


由於使用者帳號是自動傳入,不希望被任意修改,因此將此參數設定為「內部」,如此參數只供內部傳遞,不會讓使用者看到。※也可以使用「隱藏」的設定值,差異點說明在文章最後。



建立產品大類的資料集,資料集的限定條件是依 SECURITYPRODUCTCATEGORY 資料表中帳號可存取的類別代碼。


WHERE PRODUCTCATEGORY_KEY IN
    (SELECT PRODUCTCATEGORY_KEY
        FROM SECURITYPRODUCTCATEGORY
        WHERE (USERNAME = @UserName))

另建立銷售資料集,使用 PRODUCTCATEGORYKEY 為參數。


進入  PRODUCTCATEGORYKEY 的報表參數屬性,「資料類型」選「整數」( 依資料庫中的資料型態選擇 ),勾選「允許多個值」。


在「可用的值」頁籤中,點選「從查詢取得值」,選擇建好的「產品大類」資料集,並指定好「值欄位」及「標籤欄位」。


設計好報表要呈現的資料及排版一下。


將報表部署至報表伺服器。


以不同帳號登錄至報表管理員,會有不同的產品大類供選擇。




在「報表參數屬性」視窗「一般」頁籤中,有個「選取參數可見性」的選項,在這裡可以選用「隱藏」或「內部」;都是不希望使用者看到或是變更參數內容時使用。
這兩者的差異點在於使用「內部」的設定時,無法在報表 URL 或在訂閱定義中設定參數的值。
但在「參數」頁籤中,不管那一個設定,在下圖的畫面中,好像都一樣。


2 則留言:

Unknown 提到...

您好!想請問您,我在報表端設定ㄧ個參數,它的指定值使用您的指定方式( =Mid(User!UserID,InStr(User!UserID,"\")+1,Len(User!UserID)-InStr(User!UserID,"\")) )-->登入的人僅能看到自己的報表資訊,但是問題來了,透過管理訂閱透過EMAIL寄送報表時,會有相依性的問題導致報表無法寄送,請問您,有甚麼方式可以解決這個問題嗎?!

小鯨 提到...

透過目前的方式只限登入者的權限才能看到部分資料。