5 Stimmen

Wie übergibt man mehrere Werte an einen Parameter in Access?

Hintergrund / Gesamtziel

  • Ich habe eine Excel-Tabelle mit einer Liste von Elementen, die bestimmte Rollen testen müssen.
    • Rollen haben Mitglieder
    • Rollen können Mitgliedsrollen haben, die ihre eigenen Benutzer haben.
  • Ich muss die Gesamtzahl der Benutzer erfassen, die eine bestimmte Funktion testen konnten, um Namen und Zählnummern für einige Metriken zu erfassen.
  • Ich habe die Benutzer, Rollen und Mitgliedsrollen in einer Access-DB gespeichert, um eine schnelle Abfrage zu ermöglichen
  • Jetzt versuche ich nur noch, die richtigen Informationen herauszugeben. Es macht mir nichts aus, eine Liste von Rollen einzugeben und sie auf diese Weise wieder auszuspucken.
  • Ich möchte es vermeiden, alle Testaufgaben für jede Rolle zur DB hinzuzufügen (es gibt eine Menge davon und dies soll eine relativ schnelle Aufgabe sein).

DB-Struktur

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

Ziel

  • Übergabe einer Liste von Rollen an eine Abfrage (entweder durch einen aufgelisteten Parameter oder eine String-Liste)
  • Rückgabe einer Anzahl eindeutiger Benutzer, die einer dieser Rollen oder einer ihrer Mitgliedsrollen angehören
  • Schnell und schmutzig - es muss nicht ausgefallen sein

Aktuelle Zugriffsabfrage

  • Gibt Benutzer zurück, die einer Rolle oder deren Mitgliedsrollen für eine gegebene Rolle angehören, die über den Parameter
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);

Bisherige Ideen

  • Gefunden ein interessanter Beitrag wie man mit Instr() eine Textzeichenfolge in eine Where-Klausel einfügt. Ich bin mir nicht sicher, wie ich das unbedingt auf meine Situation anpassen könnte.

1voto

gangreen Punkte 789

Um Ziel 1 zu erreichen, können Sie den obigen Vorschlag von Remou verwenden und eine Liste von Rollennamen in das Feld WHERE Klausel mit der folgenden Abfrage. Es könnte jedoch sinnvoller sein, die "WHERE"-Klausel zu entfernen, die Abfrage auszuführen und sie dann in Excel einzufügen, um eine "schnelle und schmutzige" Filterung durchzuführen (Ziel 3).

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;  

Um die Anzahl der Benutzer zu ermitteln, die in der Lage sind, die verschiedenen Rollen zu erfüllen (Ziel 2), können Sie Folgendes ausführen.

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;  

Die obige SQL setzt voraus, dass jede Rolle sich selbst als Mitglied in der Tabelle RoleMemberRoles enthält. Sie sollten verwenden DISTINCT weil das Datenmodell nicht verhindert, dass ein einzelner Benutzer mehrere Rollen innehat und somit mehrfach in jeder Ergebnismenge auftaucht.

0voto

onedaywhen Punkte 52850

Anregung: Fragen Sie in Ihrem Access-Projekt die Tabellenkalkulationsdaten mit Access-SQL ab, z. B. erstellen Sie JOIN s zwischen Access-Tabellen und Excel-Daten, möglicherweise unter Verwendung von Linientabellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X