[A-03] Recordset DAO sur requete paramétrée Access
Bonsoir,
Je n'arrive pas à savoir si c'est un problème de faisabilité ou si je m'y prends comme un manche (ou les deux!! lol)
J'ai une requête Access paramétrée basée sur un formulaire. Elle se lance en fonction de 3 paramètres (combobox), ça marche nickel.
En fonction de cette requête (par le biais d'un .rowsource ), je renseigne un 4éme combobox, dont je veux faire à son tour un paramètre.
Comment puis-je utiliser ce 4ème paramètre sur la requête en cours? J'ai essayé de créer un recordset genre :
Code:
1 2
| strq="select * from marequete where param4=macombobox"
set rst=currentdb.OpenRecordset(strq) |
mais j'ai un message d'erreur me disant que trop peu de paramètres sont entrés (3, ce qui correspond aux paramètres de la requête). Or le formulaire est bien ouvert, (si je teste la requête, elle fonctionne et est bien fonction du formulaire).
Bref, votre aide est bienvenue, merci d'avance!!
JFB
Fonction générique pour ouvrir un Recordset avec "paramètres de formulaires"
Bonjour,
Citation:
Envoyé par
fxbrg
[...]
D'où l'idée de me servir de la requête initiale comme source de données - recordset (en plus c'est une requête avec des Join, en sql elle fait trois pages!! lol), filtrée à chaque fois du nouveau critère.
[...]
Je vais sans doute m'orienter vers une concaténation de clauses Where - même avec mes join, mais c'est dommage qu'on ne puisse récupérer cette requête, ça va m'obliger à écrire plein de fois la même chose, pas très propre...
Le problème auquel tu te retrouves confronté est que Access sait évaluer une requête comportant des expressions qui désignent un contrôle de formulaire; en revanche DAO/ADO/Jet ne connaissent pas Access et toute expression non reconnue par leur évaluateur est considérée comme un paramètre.
Il y a un remède simple qui consiste à faire appel à la fonction Eval() qui rend le contrôle à Access pour évaluer ces expressions.
Ainsi, dans ta requête, au lieu du code suivant:
Code:
select * from marequete where param4=Forms!MonFormulaire!MaComboBox
Tu peux écrire:
Code:
select * from marequete where param4=Eval("Forms!MonFormulaire!MaComboBox")
Evidemment, ce n'est pas très pratique de réécrire toutes les requêtes qui sont basées sur des formulaires.
Alors il est possible de réutiliser leur code SQL comme expliqué dans cette discussion:
http://www.developpez.net/forums/d21...quete-critere/
Tu peux aussi lire cette discussion en anglais qui propose une fonction générique pour ouvrir un Recordset, à partir d'une requête Access ou d'une requête SQL:
http://www.utteraccess.com/forums/sh...ll#Post1627801
Je te donne ci-dessous le code "complet" de la fonction générique permettant d'ouvrir un Recordset DAO à partir d'une requête basée sur des "paramètres de formulaires" et/ou "paramètres demandés à l'utilisateur".
C'est la synthèse des 2 discussions mentionnées ci-dessus:
[EDIT]
J'ai amélioré la fonction générique:
* gestion d'erreur (un peu) plus complète,
* modification de la syntaxe d'expression "francophone" pour qu'elle se conforme à la syntaxe anglo-saxonne.
[/EDIT]
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| Public Function GenericOpenRecordset(strSQL As String, _
Optional intType As DAO.RecordsetTypeEnum = dbOpenDynaset, _
Optional intOptions As DAO.RecordsetOptionEnum, _
Optional intLock As DAO.LockTypeEnum, _
Optional pdb As DAO.Database) As DAO.Recordset
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Dim prm As DAO.Parameter
Dim sExpr As String
If Not pdb Is Nothing Then
Set db = pdb
Else
Set db = CurrentDb
End If
On Error Resume Next
Set qdf = db.QueryDefs(strSQL)
If Err = 3265 Then
Set qdf = db.CreateQueryDef("", strSQL)
End If
For Each prm In qdf.Parameters
Err.Clear
sExpr = prm.Name
sExpr = Replace(sExpr, "[Formulaires]!", "Forms!")
sExpr = Replace(sExpr, "Formulaires!", "Forms!")
prm.Value = Eval(sExpr)
Select Case Err.Number
Case 2482, 2450
' 2482 = Paramètre non évaluable.
' 2450 = Impossible de trouver le formulaire auquel il est fait référence
' dans une expression de macro ou un code Visual Basic.
' Demande la saisie du paramètre dans une inputbox
prm.Value = InputBox(prm.Name)
End Select
Next
On Error GoTo 0
If intOptions = 0 And intLock = 0 Then
Set rst = qdf.OpenRecordset(intType)
ElseIf intOptions > 0 And intLock = 0 Then
Set rst = qdf.OpenRecordset(intType, intOptions)
ElseIf intOptions = 0 And intLock > 0 Then
Set rst = qdf.OpenRecordset(intType, intLock)
ElseIf intOptions > 0 And intLock > 0 Then
Set rst = qdf.OpenRecordset(intType, intOptions, intLock)
End If
Set GenericOpenRecordset = rst
Set prm = Nothing
Set rst = Nothing
Set qdf = Nothing
Set db = Nothing
End Function |