SeanKilleen
SeanKilleen

Reputation: 8977

How to pass multiple values to parameter in Access?

Background / Overall goal

DB Structure

                       +---------------+
    +------------+     |RolesUsers     |
    |Roles       |     |---------------|    +---------------+
    |+-----------|     |ID             |    |Users          |
 +-+|ID          |+---+|RoleID         |    |---------------|
 |  |RoleName    |     |UserID         |+--+|ID             |
 |  +------------+     +---------------+    |UserName       |
 |                                          +---------------+
 |
 |  +-----------------+
 |  |RolesMemberRoles |
 |  |-----------------|
 |  |ID               |
 +-+|RoleID           |
 +-+|MemberRoleID     |
    +-----------------+

Goal

Current Access Query

PARAMETERS p_RoleName Text ( 255 );
SELECT Roles.RoleName, Users.UserName
FROM 

(RolesUsers INNER JOIN Users ON RolesUsers.UserID = Users.ID) 
INNER JOIN Roles ON RolesUsers.RoleID = Roles.ID

Where RolesUsers.RoleID In (Select ID from Roles where Roles.RoleName = p_RoleName)

UNION SELECT Roles.RoleName, Users.UserName
FROM 

(RolesUsers INNER JOIN Users ON RolesUsers.UserID = Users.ID) 
INNER JOIN Roles ON RolesUsers.RoleID = Roles.ID

Where RolesUsers.RoleID IN (
SELECT RolesSubroles.SubRoleID FROM RolesSubroles INNER JOIN Roles ON RolesSubRoles.RoleID = Roles.ID 
where Roles.RoleName = p_RoleName);

Ideas So Far

Upvotes: 5

Views: 1910

Answers (2)

onedaywhen
onedaywhen

Reputation: 57023

Suggestion: In your Access project, query the spreadsheet data using Access SQL e.g. create JOINs between Access tables and Excel data, possibly using lined tables.

Upvotes: 0

gangreen
gangreen

Reputation: 909

To achieve Goal 1, you can use Remou's suggestion above to type a list of RoleNames into the WHERE clause with the following query. However, it might make more sense just to remove the 'WHERE' clause, run the query, and then paste into Excel for (Goal 3) "quick and dirty" filtering.

SELECT DISTINCT Roles_1.RoleName,
            Users.UserName
FROM   Users
   INNER JOIN ((Roles
                INNER JOIN (RolesMemberRoles
                            INNER JOIN Roles AS Roles_1
                              ON RolesMemberRoles.MemberRoleID = Roles_1.ID)
                  ON Roles.ID = RolesMemberRoles.RoleID)
               INNER JOIN RoleUsers
                 ON Roles.ID = RoleUsers.RoleID)
     ON Users.ID = RoleUsers.UserID
WHERE  Roles_1.RoleName In ( "Prez", "Veep", "Staffer" )
ORDER  BY Roles_1.RoleName,
      Users.UserName;  

To return the count of users capable of fulfilling the various roles (Goal 2) you can run the following.

SELECT InheritedRoles.RoleName,
   Count(*) AS NumOfTestersAvailable
FROM   (SELECT DISTINCT Roles_1.RoleName,
                    Users.UserName
    FROM   Users
           INNER JOIN ((Roles
                        INNER JOIN (RolesMemberRoles
                                    INNER JOIN Roles AS Roles_1
                                      ON RolesMemberRoles.MemberRoleID =
                                   Roles_1.ID)
                          ON Roles.ID = RolesMemberRoles.RoleID)
                       INNER JOIN RoleUsers
                         ON Roles.ID = RoleUsers.RoleID)
             ON Users.ID = RoleUsers.UserID) AS InheritedRoles
GROUP  BY InheritedRoles.RoleName
ORDER BY InheritedRoles.RoleName;  

The above SQL assumes that each Role contains itself as a Member in the table RoleMemberRoles. You should use DISTINCT because the data model doesn't prevent a single user from having multiple roles and thus appearing multiple times in each result set.

Upvotes: 1

Related Questions