Récupérer la valeur d'une liste déroulante dans une requête SQL

Fermé
Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013 - 17 juil. 2013 à 11:04
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 - 22 juil. 2013 à 10:29
Bonjour à tous,



Je viens ici solliciter votre aide pour une question qui ne parait pas très difficile en apparence mais qui s'avère être assez technique.

Le titre est assez explicite mais voilà mon problème : je n'arrive pas à inclure la valeur sélectionnée d'une liste déroulante de mon formulaire, dans une requête SQL que je lance via du code VBA.

Le code permettant de récupérer cette valeur est le suivant : Me.liste.Column(0)

or, si inclus dans une requête du style :

SQL = " SELECT * FROM Tb_congés WHERE mois = ' " & Me.liste.Column(0) & "'"


ça ne fonctionne pas, Access me sort une Table vide, alors que le mois sélectionné correspond à plusieurs enregistrements dans ma Table.

Avec le code suivant :

SQL = " SELECT * FROM Tb_congés WHERE mois = liste.Value " 

( ou même avec Me.liste.Value )

Access me sort une fenêtre et me demande d'entrer une valeur pour " Me.liste.valeur" et si je tape n'importe quel mois, il me sort ce que je souhaite, c'est à dire les lignes de ma Table qui correspondent au mois tapé à la main

Même résultat avec le code :

SQL = " SELECT * FROM Tb_congés WHERE mois =" & Me.mois_etat.Column(0)


à la différence que le message sorti par Access contient maintenant la mention " Février" ou celle du mois que j'ai sélectionné.



J'ai vérifié en récupérant dans un messageBox la valeur de Me.liste.Column(0) et il contient bien le mois sélectionné.

Je précise également 2 choses :

1) Mon code est inclus dans un If qui vérifie qu'on a bien sélectionné un mois

2) Le code que j'utilise pour sortir une Table qui contient le résultat de ma requête fonctionne bien sur une autre base de données et même sur celle-ci avec tout autre code ne contenant pas de liste déroulante.


Afin d'y voir plus clair, je vous fournis le code entier de l'événement clic sur mon bouton censé ce sortir ma requête :

Private Sub bouton_Etat_Click()


Dim SQL As String
Dim dbs As Database

Dim qdf As QueryDef


Set dbs = CurrentDb()




If Me.liste.Column(0) = "" Then

MsgBox " Choississez un mois "

Else

'--SQL = " SELECT * FROM Tb_congés WHERE mois = ' " & Me.liste.Column(0) & "'"
SQL = " SELECT * FROM Tb_congés WHERE mois =" & Me.liste.Column(0)

'--SQL = " SELECT * FROM Tb_congés WHERE mois = Me.liste.Value "


With dbs
Set qdf = .CreateQueryDef("congés_du_mois", SQL)
DoCmd.OpenQuery "congés_du_mois"
.QueryDefs.Delete "congés_du_mois"
End With
dbs.Close
qdf.Close

End If




End Sub



Comme vous le voyez j'ai 3 SQL, dont 2 sous commentaires, c'était pour les essais.

Autre petite indication, si je n'ai rien sélectionné, le compilo me met une erreur " erreur de syntaxe (opérateur absent) dans mois = " donc il ne rentre pas dans le

If Me.liste.Column(0) = "" Then



Voilà, j'ai pas mal cherché pour cette question, et suis arrivé dans une impasse .... j'ai même essayé ce que j'ai vu sur un message contenant une question similaire :

" Bonjour
Oui effectivement les requêtes avec le Qbe n'ont pas l'air de prendre la colonne en compte. Il prend en fait la colonne liée.
Il faut donc contourner le problème.
- Dans le formulaire avoir une zone de texte masquée qui aura comme source la colonne de la ListBox et qui sera mise à jour sur l'évènement "Après mise à jour" de la ListeBox. La requête aura donc la Zone de texte en critère.
- Ou alors créer une fonction qui te renvoie la valeur de ta colonne et appeler cette fonction dans ta requête (plus élégant). "



Mais sans résultat ...la zone de texte contient bien ma valeur, mais même résultat qu'avant dans la requête ...

Voilà je pense vous avoir tout expliqué, merci d'avoir pris le temps de me lire, et je suis preneur de n'importe quelle solution à ce problème :P

Merci ;)
A voir également:

4 réponses

alu1308 Messages postés 4 Date d'inscription vendredi 19 juillet 2013 Statut Membre Dernière intervention 31 juillet 2013 1
19 juil. 2013 à 16:07
Bonjour,

Je suis confrontée au même problème que Random Dude.
Je veux faire la même chose que lui, je me suis donc inspirée de son code.
Cependant, j'obtiens un Run time error 3270.. Apparemment cela viendrait du problème que mes champs dont j'ai besoin dans ma requête soient en type nombre et pas texte.
comment puis-je modifier ce code pour faire en sorte que la requête fonctionne?

Mon code :
Private Sub CreateProjectConsolidation_Click()
Dim SQL As String
Dim dbs As Database

Dim qdf As QueryDef


Set dbs = CurrentDb()



SQL = " SELECT * FROM T_Weeklys WHERE ProjectName = '" & Me.ProjectName.Value & "'"

With dbs
Set qdf = .CreateQueryDef("Project_Consolidation", SQL)
DoCmd.OpenQuery "Project_Consolidation"
.QueryDefs.Delete "Project_Consolidation"
End With
dbs.Close
qdf.Close
End Sub


Quand je clique sur le bouton que j'ai créé pour générer le formulaire j'obtiens donc une fenetre avec ce run time error, et quand je clique sur debug, la ligne surligné est :
DoCmd.OpenQuery "Project_Consolidation"


Merci d'avance pour votre aide :)
1
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
19 juil. 2013 à 16:10
Il faut savoir ce que renvoie Me.Project.Value.
Un MsgBox SQL avant le .openquery peut permettre d'y voir plus clair.
0
alu1308 Messages postés 4 Date d'inscription vendredi 19 juillet 2013 Statut Membre Dernière intervention 31 juillet 2013 1
22 juil. 2013 à 08:44
Le Me.ProjectName.Value renvoie à un champ étant dans ma table. le choix du nom de projet se fait sous forme de liste déroulante. Ma requête veut sélectionner les enregistrements selon le nom de projet qui aura été sélectionné.
Pourrais tu m'expliquer ton éventuelle solution avec le MsgBox? Qu'est ce que à me permettrait de faire?
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
22 juil. 2013 à 09:14
Quand je disais "il faut savoir...", je pensais à sa valeur...
Valeur que l'on peut avoir en faisant un msgbox Me.Project.Value, ça doit afficher un résultat dont on pourra regarder s'il est cohérent avec la requête...
0
alu1308 Messages postés 4 Date d'inscription vendredi 19 juillet 2013 Statut Membre Dernière intervention 31 juillet 2013 1
22 juil. 2013 à 09:49
Project renvoie du texte. Cependant, j'ai fait en sorte que des listes dépendent du résultats de la liste précédente et en faisant ces manip, la valeur a été changé en Nombre... je ne sais pas du tout pourquoi...
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
22 juil. 2013 à 10:29
C'est la valeur de la "colonne liée" de ta liste qui est renvoyée.
Pour plus d'infos, voir ici.
Il te suffit donc de paramétrer correctement ta zone de liste et ça devrait aller...
0
Thorak83 Messages postés 1051 Date d'inscription jeudi 20 juin 2013 Statut Membre Dernière intervention 22 décembre 2017 156
17 juil. 2013 à 11:19
Bonjour,

le champ "mois" est en type texte ?

Si oui
SQL = " SELECT * FROM Tb_congés WHERE mois = '" & Me.liste.value & "'"
ATTENTION A l'ESPACE entre le ' et le "

Cordialement
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
17 juil. 2013 à 11:22
Salut,

si mois est de type texte, il faut l'enquoter, sinon, pas besoin des quotes....
0
Random Dude Messages postés 24 Date d'inscription mercredi 3 juillet 2013 Statut Membre Dernière intervention 6 août 2013
17 juil. 2013 à 11:33
Merci beaucoup ;)

Problème résolu avec :

SQL = " SELECT * FROM Tb_congés WHERE mois = '" & Me.liste.value & "'" 


En faisant attention à ne pas mettre d'espace.

Enfin :P
0