2010-08-12 5 views
0

Je travaille avec une assez grande base de données d'informations. J'ai besoin d'utiliser un ensemble distinct de valeurs dans une requête sauvegardée comme paramètre dans la clause 'where' pour une autre requête. Quelle est la meilleure façon de parcourir l'ensemble de résultats de valeurs distinctes? Je suis relativement nouveau à Access et VBA.Access 2007 itérer via une requête sauvegardée

Répondre

0

Est-ce une requête passthrough ou une autre requête Access? Si passthrough, utilisez VBA pour remplacer la propriété .sql de la deuxième requête par les valeurs de la première requête. Si Access, vous pouvez probablement utiliser une jointure.

+0

Qu'est-ce que le passthrough a à voir avec cela?Cela s'applique uniquement à une base de données de serveur, et il n'y a aucune mention de quelque chose dans la question autre qu'Access lui-même. –

+0

Eh bien, comme vous l'avez mentionné dans votre méthode 1, si ce n'est pas une requête pt, ils devraient être en mesure d'utiliser une jointure à la place de VBA. S'il souhaite parcourir un ensemble de résultats, il doit utiliser VBA, mais je l'ai fait uniquement pour remplacer les variables dans les requêtes pt. Je ne vois vraiment pas assez d'informations pour bien comprendre ce qu'il essaie de faire. – Beth

0

@ La réponse de Beth est probablement la meilleure et si vous souhaitez poster quelques détails de vos tables et requêtes, je suis sûr qu'une réponse plus détaillée peut être fournie, cependant, si vous avez besoin de parcourir les résultats de la requête autre que d'obtenir un second jeu de résultats, vous pouvez utiliser un jeu d'enregistrements. En VBA:

Dim rs As DAO.Recordset 
Dim rs2 As DAO.Recordset 
Dim sSQL As String 

''You open an SQL string, a table, or a query as a recordset 
Set rs = CurrentDB.OpenRecordset("QueryName") 

Do While Not rs.EOF 
    sSQL= "SELECT Some, Fields FROM ATable WHERE ID = " & rs!NumericID 

    Set rs2 = CurrentDB.OpenRecordset(sSQL) 
    ''Now what? 
    rs.MoveNext 
Loop 
1

Je ne comprends peut-être pas la question, parce que je l'interprète complètement différemment des autres réponses. Il me semble que les autres ont répondu en supposant que "Quelle est la meilleure façon d'itérer à travers le jeu de résultats de valeurs distinctes" est la partie clé, où je me concentre sur "Je dois utiliser un ensemble distinct de valeurs dans une requête enregistrée en tant que paramètre dans la clause 'where' pour une autre requête ".

Il y a deux façons d'aborder ce:

  1. la manière standard d'accès: sauver l'autre requête, l'ajouter à la première requête et rejoindre sur le champ que vous êtes sur le filtrage.

  2. utilisez la clause IN comme sous-requête.

Supposons que votre requête principale est:

SELECT tblBook.BookID, tblBook.AuthorID, tblBook.Title 
    FROM tblBook 

... et que vous souhaitez filtrer un ensemble d'auteurs utilisant cette requête:

SELECT tblAuthor.AuthorID 
    FROM tblAuthor 
    WHERE tblAuthor.BirthYear < 1900 

Vous pouvez enregistrer cette dernière requête comme, dites "qryAuthorsBefore1900" et ensuite l'utiliser dans une jointure dans la première requête:

SELECT tblBook.BookID, tblBook.AuthorID, tblBook.Title 
    FROM tblBook INNER JOIN qryAuthorsBefore1900 ON tblBook.AuthorID = qryAuthorsBefore1900.AuthorID 

C'est la méthode 1.

Méthode 2 serait:

SELECT tblBook.BookID, tblBook.AuthorID, tblBook.Title 
    FROM tblBook 
    WHERE tblBook.AuthorID IN (SELECT tblAuthor.AuthorID FROM tblAuthor WHERE tblAuthor.BirthYear < 1900) 

Maintenant, les deux sont inutiles - vous pouvez faire tout cela sans sous-requête ou d'un QueryDef sauvé:

SELECT tblBook.BookID, tblBook.AuthorID, tblBook.Title 
    FROM tblBook INNER JOIN tblAuthor ON tblBook.AuthorID = tblAuthor.AuthorID 
    WHERE tblAuthor.BirthYear < 1900 

Cet ensemble de résultats devrait être modifiable. Toutes les requêtes ci-dessus peuvent être créées en utilisant la grille Query By Example standard, pas besoin de plonger dans la vue SQL (sauf pour copier le SQL de la sous-requête, si vous décidez de suivre cette route). Mais, bien sûr, j'ai peut-être complètement mal interprété la question entière.