2012-01-27 11 views
0

私はアイデアを必要とする...注文サブセット

私は以下の表含む、ひねりを加えた古典的なシナリオを持っている:ユーザー、ロール、UsersInRolesを。

私のWebページには、特定の役割のすべてのユーザーを含む各役割に対して1つのComboboxes(つまりDropDownList + TextBox)があります。私の意図が強調することである - 私が代わりに含まれているためにそれらのそれぞれを希望のみ与えられた役割の

  • ユーザー(名前順)...すべてのユーザーの完全なリストですが、グループ化されたので、同じよう命じましたこれらのアイテム。
  • (名前順)なしリピートを有するユーザーの残りの部分、

私はいくつかのSQLで遊んでてきたとVBが解決に向かって自分の道を動作するようにしようとしたが、それは明らかではないが、まだあります最善のアプローチ、またはソリューションを完全に実装する方法はありません。私は小さなビットとピースを考え出しただけです。私は今のところコードを投稿することを控えるように私を許してください。私はいくつかの新鮮なアイデアとサーバー上で多くの需要を置かない巧妙なソリューションを望んでいます。関連する提案のお手伝いを

は、ここに私のテーブルの構造です:

Users (ID, Username, Name) 
Roles (ID, Role) 
UsersInRoles (ID, UserID, RoleID) 

そして、私はそれに書いたクエリは、私が私が私が考えるたい場所に到達するために必要なすべてのサブグループを与えました。

select u.ID, Name, RoleID from UsersInRoles 
    inner join Users u on UserID = u.ID --This is only to return a name rather than ID 
    order by ReviewerRoleID, Name 

Timさんのお勧めを使用して、このようなコードビハインドを使用して、それぞれのドロップダウンリストにバインドすることがあります。私が持っている一つの懸念は、ユーザーがページにアクセスするたびにサーバーに潜在的な負担をかける、各ロールのクエリを実行していることです。

Private Sub PopulateUserInRoleCombobox(ByVal key As Integer, ByVal ddl As DropDownList) 
    Try 
     Dim dt As New DataTable 
     Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("tcomConnectionString").ConnectionString) 
      Dim spSelect As New SqlCommand("spGetUserInRoleList", connection) 
      spSelect.CommandType = CommandType.StoredProcedure 
      Dim RoleID As New SqlParameter("@GivenRoleID", SqlDbType.Int) 
      RoleID.Value = key 
      spSelect.Parameters.Add(RoleID) 
      Dim da As New SqlDataAdapter(spSelect) 
      da.Fill(dt) 
     End Using 
     ddl.DataSource = dt 
     ddl.DataBind() 'Bind results to the DropDownList 
    Catch ex As Exception 
     'Error Message 
    End Try 
End Sub 

そして、最後のステップは、それが与えられた役割のメンバーだかいないかに応じて、各リスト項目をスタイリングのためのJavascriptを書くために最善の方法を把握することです。 >。 <

ありがとうございました:)

答えて

1

を私は

;WITH UserRoles AS(
    SELECT U.UserName 
    ,R.RoleName 
    ,Row_Number()Over(Order By CASE WHEN R.RoleID= @GivenRoleID THEN 0 ELSE 1 END,UserName)As SortOrder 
    ,Row_Number()Over(Partition By UserName Order By CASE WHEN R.RoleID= @GivenRoleID THEN 0 ELSE 1 END,RoleName)As UserRoleNumber 
    FROM Users AS U INNER JOIN 
    UsersInRoles ON U.UserId = UsersInRoles.UserId INNER JOIN 
    Roles AS R ON UsersInRoles.RoleId = R.RoleId 
) 
SELECT UserName,RoleName 
FROM UserRoles 
WHERE UserRoleNumber=1 
ORDER By SortOrder 

これは、ADO.NETを介してデータを取得するための一つの方法である:

Public Shared Function GetUsers(forRoleID As Guid) As DataTable 
    Dim tblUser As New DataTable 
    Using sqlCon As New SqlClient.SqlConnection(My.Settings.ConnectionString) 
     Dim sqlCmd = New SqlClient.SqlCommand() 
     sqlCmd.CommandType = CommandType.StoredProcedure 
     sqlCmd.CommandText = "dbo.spGetUserInRoleList" 
     sqlCmd.Connection = sqlCon 
     sqlCmd.Parameters.AddWithValue("@GivenRoleID", forRoleID) 
     Using objAdapter As New SqlClient.SqlDataAdapter(sqlCmd) 
      Try 
       objAdapter.Fill(tblUser) 
      Catch ex As Exception 
       ' log exception etc. ' 
      End Try 
     End Using 
    End Using 

    Return tblUser 
End Function 
+0

おかげでティム、あなたは少しのことをしてくださいクリアする気でしょうか?あなたの提案を私のDBの構造にマッピングするのに少し面倒です。さらに、これは私の全体的な目標にはあまり役立たない。私はあなたが私の質問を再読することができれば感謝しています:( – Chiramisu

+0

あなたはどのような種類の構造やイベントを使用しているのかは言及していないので、私はSQL Serverを想定し、 Membership Provider。このsql-queryは、すべてのUsersnamesとそのロールを返します.SqlParameter 2として指定されたRoleIDの順番で並べられます。2. UserName。したがって、特定のグループに所属するユーザーが最初に表示されます(名前によってサブオーダーされます)。このグループに所属していないユーザーは、次のとおりです(名前でサブオーダー)。繰り返しユーザーはありません( 'WHERE UserRoleNumber = 1'によって引き起こされます)。現在のグループが常に表示されます(ユーザーがこのグループに属している場合)。 –

+0

私はこのソリューションが非常に私のデータ、優れた性能を得るために好きです。今、完璧なVB.NETコードにこれをどのように統合するかについてのアイデアを手伝ってくれるだけであれば。私は私の考えを含めて私の答えを編集します。ありがとう:) – Chiramisu