Requêtes: Too few parameters, expected n |
Author(s) Dev Ashish |
|
Too few parameters, expected n
(Q) Quand vous essayez d'exécuter une requête, depuis
votre code, qui possède une clause WHERE, vous obtenez l'erreur "Too Few
Parameters. Expected 1."
Qu'est-ce qui se passe??
(A) Votre clause WHERE contient probablement une
référence à un contrôle sur un formulaire. Par exemple:
strSQL="Select * from tblPeople where PeopleID= forms!SomeForm!PeopleID"
Vous devez vous rappeler que Jet ne connaît rien au sujet
des formulaires. Ici, il essaie d'évaluer forms!SomeForm!PeopleID comme un
paramètre, au lieu de consulter le contrôle auquel l'expression réfère. Vous
obtenez alors l'erreur annoncée.
La meilleure façon est de concaténer la valeur
retournée par le contrôle. (Note: si vous n'êtes pas certain de la
manipulation requise pour des dates et de chaînes, voir l'article Use
Variables in SQL behind forms)
strSQL="Select * from People where PeopleID=" &
forms!SomeForm!PeopleID
De Andy Baron:
Quand vous utilisez une requête paramétrée en Access, depuis l'interface utilisateur, Access vous offre
un service qui évalue plusieurs paramètres. Par exemple, la référence à
un contrôle d'un formulaire ouvert est effectuée automatiquement. Ce service
n'est cependant plus disponible lorsque vous utilisez le code VBA pour
exécuter une requête paramétrée.
Votre code doit fournir le nombre exact de paramètres, en passant par
l'objet QueryDef. Le QueryDef de votre requête possède une
collection Parameters contenant un Parameter par paramètre,
fournissant un Nom (name), une valeur (value) et un index en indiquant le
"rang" dans la collection. Ces objets peuvent être utilisés pour
spécifier les valeurs attendues.
Set db = CurrentDb
Set qdf = db.QueryDefs("MyQuery")
qdf(0) = Me!MyControl
qdf.Parameters(1) = 123
qdf![forms!frmParameters!txtNewDate] = #2/2/98#
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
Quand une requête paramétrée d'Access ne contient que de références à
des contrôles de formulaires ouverts, on peut alors simuler le service offert
par Access, en interface utilisateur, comme suit:
Set db = CurrentDb
Set qdf = db.QueryDefs("MyQuery")
For Each prm In qdf.Parameters
prm.Value = Eval(prm.Name)
Next prm
Set rs = qdf.OpenRecordset(dbOpenDynaset)
|