2010-02-17 44 views
0

我對你所有的SQL Server 2008報告大師有一個腦筋急轉彎:-)Reporting Services - 動態選擇正確的數據源/動態更改WHERE子句?

我有一個報告顯示一堆數據,包括用戶的UserID和OrgUnitID。這是一個服務器報告,我在ASP.NET應用程序中在服務器上呈現。

我的要求是,

  • 「正常」用戶只能看到自己的數據行(基本上
    SELECT (fields) FROM dbo.DataView WHERE UserID = @UserID

  • 特權用戶可以看到他的所有下屬;我有一個表值函數,提供該功能(基本上SELECT (fields) FROM dbo.DataView
    INNER JOIN dbo.OrgHierarchy ON DataView.OrgUnitID = OrgHierarchy.OrgUnitID

本身這兩種情況都工作得很好 - 問題是:我應該結合這些成一個單一的報告。

我該怎麼做?如何根據我傳入的報表參數(@UserLevel; 0 =正常用戶,1 =特權)動態地生成報表,而使用一個查詢或另一個查詢?

我真的不想進入動態重寫SQL查詢....任何其他的想法?

  • 我在想有兩個獨立的不同的數據集,然後就在激活基礎上的UserLevel參數「正確」的一個 - 但我似乎無法找出如何定義子報表上的數據集或一個文本框......

  • 然後,我希望我能夠在我的服務器報告中動態地從我的客戶端應用程序添加一個過濾器到我的數據集 - 但這似乎不可能, .....我可以創建一個「UserID = @UserID」設置的過濾器,並根據需要以某種方式啓用/禁用它,在報表本身的嵌入式VB代碼中?

任何接受者?野外的想法?讓我知道!

回答

1

你可以嘗試做一個適用於每個人的查詢嗎?這裏只是根據你在你的問題包括表/列的猜測:

--always returns the data for the one given @UserID 
SELECT 
    (fields) 
    FROM dbo.DataView 
    WHERE UserID = @UserID 
UNION 
--only returns data for the subordinates of @UserID, nothing if there are none 
SELECT 
    (d2.fields) 
    FROM dbo.DataView    d1 
     INNER JOIN dbo.DataView  d2 ON d1.OrgUnitID = d2.OrgUnitID 
     INNER JOIN dbo.OrgHierarchy h ON d1.OrgUnitID = h.OrgUnitID 
    WHERE d1.UserID = @UserID and d1.UserLevel=1 
+0

有趣的想法 - 我將不得不認爲通過 - 謝謝! – 2010-02-17 16:31:07

+0

你給我的啓發:-)我沒有使用這種確切的語法,但你的迴應讓我走上了正確的軌道 - 謝謝! – 2010-02-25 11:52:52

0

你可以嘗試定義表值函數,不斷根據用戶(無論是DB_USER或report_user)

的所有邏輯
CREATE FUNCTION [dbo].[get_employee_data](@UserId nvarchar(200)) 
RETURNS TABLE 
AS 
    RETURN 
    (
     SELECT * 
     FROM yourdata 
     where @UserId = yourdata.user_id and .... 

    )