2009-08-25 11 views
0

レポートを作成するユーザーに利用可能にしたいレコード(注文)があります。フィルタを最適に適用する方法SQL Server Reporting Services

ユーザーはさまざまな部門から来ています。私はそれを作成したいので、各部門は自分のものだけを見ることができます。

私は正しい方法でこれを行う方法を理解できません。

私が今行っているものは次のとおりです。 - Orderテーブルにフィルタを配置したモデルです。

フィルタではGetUserID()を使用してユーザー名を取得できますが、ユーザーを特定の部門にマップする「UserDepartment」テーブルへのアクセス方法はわかりません。

私は新しいアクセスグループを作成したり、誰かが夢見る可能性のある部門ごとにモデルを編集する必要がないというソリューションを好むだろう。

手がかりはありますか?

EDIT(SQL Server 2008を使用して)

:このリンクhttp://blogs.msdn.com/bobmeyers/articles/Implementing_Data_Security_in_a_Report_Model.aspxは私が何をしようとしているの基本を示しているが、著者は、各レコードを一致させることができるユーザ名フィールドを持っていることを前提としているようです。

私の場合、私は部門Xのすべてのユーザーが回線にアクセスできるようにしたいと思います。

+1

を助け

ホープ・ユーザー/ userdepartmentとOrderの間のリンクは何ですか? – gbn

+0

各注文には、オーダーを所有する部門のDepartmentIdがあります。 – Soraz

答えて

0

これは、ユーザーに注文があることを前提としています。 したがって、フィルタユーザーと同じ部門に存在するユーザーによってフィルタリングします。オーダーを直接フィルタリングしないでください。

私は、スキーマやカラム名で推測している:あなたのアイデアを得るhoep ...

SELECT 
    MY STuff 
FROM 
    Order O 
    JOIN 
    UserDept UD ON O.UserCode = UD.UserCode 
WHERE 
    EXISTS (SELECT * 
     FROM 
      UserDept UD2 
     WHERE 
      UD2.UserCode = @MYUSerCode 
      AND 
      UD2.DeptID = UD.DeptID) 

--or 
SELECT 
    MY STuff 
FROM 
    Order O 
    JOIN 
    UserDept D ON O.UserCode = D.UserCode 
    JOIN 
    UserDept U ON D.DeptID = U.DeptID 
WHERE 
    U.UserCode = @MYUSerCode 
+0

SRSSのモデルを作成すると、フィルタとフィールドをモデルに追加することができます。 これは同じですか? データソースを定義するためにSQLを使用すると、モデルのGetUserID()を使用できなくなる恐れがあります。 – Soraz

+0

申し訳ありませんが、私はSSRSでモデルを使用していません。とにかくこれはデータ関数です:集合ベースの結合/フィルターで、レポート自体ではそうではありませんか? – gbn

+0

@Soraz:ユーザーIDをパラメータとしてデータソースに渡すことはできますか? – Faiz

0

何を達成しようとしていることGetUserID()メソッドを使用して困難です。 、あなたのソースクエリは、冗長データの多くを返す必要があろうと使用し、次のようなものを想像する:

/* 
Table: User 
Fields: UserID, LoginName, FullName 

Table: Department 
Fields: DepartmentID, Name 

Table: UserDepartments 
Fields: UserID, DepartmentID 

Table: Order 
Fields: OrderNumber, DepartmentID 
*/ 

SELECT O.OrderNumber, O.DepartmentID, U.LoginName 
FROM Order O 
JOIN Department D ON D.DepartmentID = O.DepartmentID 
JOIN UserDepartments UD ON UD.DepartmentID = D.DepartmentID 
JOIN User U ON U.UserID = UD.UserID 

これは、あなたが望むよりも多くの行で各ユーザーのための基本的にコピーを与えます注文を所有する部門。

ここでは、指定したリンクの説明に従ってフィルタを適用できます。これは、現在のユーザーが正しい部門にいる場合は、そのユーザーの注文行のコピーを1つだけに絞り込みます。

パフォーマンス上の問題がある場合は、ASP.NET、WinForms、WPFのいずれかでローカルレポート(.RDLC)を使用し、ユーザーの詳細をデータ呼び出しに渡すのが最も簡単な方法があります。 SQL。

1

これと同様の問題があり、SQLで関数を作成しました。 SRSS

  • からusernameパラメータを受信

    1. は、権限テーブルの検索を行い、(あなたのケースでは、部門IDが)レコードを取得した:

      機能は次のようでした。

    2. は、部門を返されたIDの

  • はその後、私たちのSQL文はこのように見えた:

    SELECT * 重要 FROM WHERE DepartmentIdのIN(fn_GetUserDepartmentAllocations FROM SELECT ID(@UserName))

    これがしましたすべてのSQLクエリを修正するように強制しますが、複雑なロジックを最小限に抑えて実行できました。

    もう1つのことは、部門境界を超えて1人のユーザーがいる場合です。たとえば、2つの部門のマネージャーです。

    CREATE FUNCTION [dbo].[fn_GetUserDepartmentAllocations] 
    (
        @UserName NVARCHAR(100) 
    ) 
    RETURNS 
        @TempPermissions TABLE 
    (
        DepartmentId Int 
    ) 
    AS 
    BEGIN 
    
         INSERT INTO @TempPermissions  
         SELECT DepartmentId 
         FROM DepartmentPermissions 
         WHERE DepartmentAllowedUsername = @UserName 
    
        RETURN 
    END 
    

    このようにそれをやっての主な利点は、それはまた、あなたが全体の権限の構造を変更するための一つの場所を編集することができますされ、あなたが変更代わりに、それを変更するために一人ひとりのレポートを通過する必要はありません1つの場所

    たとえば、2つの部門に所属しているマネージャーを持つことはできますが、thursdays以外は表示できません(私は愚かな例を知っていますが、うまくいけばポイントを得ることができます)。これは

    ピート

    関連する問題