web-dev-qa-db-fra.com

Est-il possible de transmettre des paramètres par programme dans une requête de mise à jour Microsoft Access?

J'ai une requête plutôt volumineuse, qui regroupe plus d'une douzaine de tables et je souhaite extraire des enregistrements en fonction d'un champ id ( par exemple : between nStartID and nEndID).

J'ai créé deux paramètres et les ai testés comme critères et ils fonctionnent bien.

Le problème est que je dois exécuter une requête d’insertion à partir de cette requête principale et avoir besoin des paramètres là où ils se trouvent dans la requête principale. Donc, je dois lui passer des paramètres par programme. 

Quelqu'un sait-il comment cela peut être fait?

Merci.

32
Jav

Je viens de tester cela et cela fonctionne dans Access 2010.

Supposons que vous ayez une requête SELECT avec des paramètres:

PARAMETERS startID Long, endID Long;
SELECT Members.*
FROM Members
WHERE (((Members.memberID) Between [startID] And [endID]));

Vous exécutez cette requête de manière interactive et vous invite à indiquer [startID] et [endID]. Cela fonctionne, vous enregistrez donc la requête en tant que [MemberSubset].

Maintenant, vous créez une requête UPDATE basée sur cette requête:

UPDATE Members SET Members.age = [age]+1
WHERE (((Members.memberID) In (SELECT memberID FROM [MemberSubset])));

Vous exécutez cette requête de manière interactive et vous êtes invité à entrer [startID] et [endID] et cela fonctionne bien. Vous devez donc l'enregistrer sous le nom [MemberSubsetUpdate].

Vous pouvez exécuter [MemberSubsetUpdate] à partir de code VBA en spécifiant les valeurs [startID] et [endID] en tant que paramètres de [MemberSubsetUpdate], même s’ils sont en réalité des paramètres de [MemberSubset]. Ces valeurs de paramètre "se répercutent" là où elles sont nécessaires, et la requête fonctionne sans intervention humaine:

Sub paramTest()
    Dim qdf As DAO.QueryDef
    Set qdf = CurrentDb.QueryDefs("MemberSubsetUpdate")
    qdf!startID = 1  ' specify
    qdf!endID = 2    '     parameters
    qdf.Execute
    Set qdf = Nothing
End Sub
58
Gord Thompson

Essayez d’utiliser les QueryDefs. Créez la requête avec des paramètres. Ensuite, utilisez quelque chose comme ceci:

Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef

Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("Your Query Name")

qdf.Parameters("Parameter 1").Value = "Parameter Value"
qdf.Parameters("Parameter 2").Value = "Parameter Value"
qdf.Execute
qdf.Close

Set qdf = Nothing
Set dbs = Nothing
19
Jessica

Merci beaucoup pour les informations sur l'utilisation de la collection QueryDefs! Je m'interroge depuis un moment sur ce sujet.

Je l'ai fait d'une manière différente, sans utiliser VBA, en utilisant une table contenant les paramètres de requête.

E.g: SELECT a_table.a_field FROM QueryParameters, a_table WHERE a_table.a_field ENTRE DE QueryParameters.a_field_min ET QueryParameters.a_field_max

Où QueryParameters est une table avec deux champs, a_field_min et a_field_max

Il peut même être utilisé avec GROUP BY, si vous incluez les champs de paramètre de requête dans la clause GROUP BY et l'opérateur FIRST sur les champs de paramètre dans la clause HAVING.

4
Nigel

Vous pouvez également utiliser TempVars - notez '!' la syntaxe est essentielle You can also use TempVars - note '!' syntax is essential

1
Dougie