Bonjour,
Transmettre un paramètre à une requête se fait assez simplement via plusieurs méthodes. Cela reste à la discrétion du développeur avec cependant 2 règles fondamentales à retenir :
- L’ihm doit rester pratique pour l’utilisateur, le développeur d’adapte.
- Le code doit être le plus simple possible, pensez aux autres qui devront le lire.
Concernant une liste In() le problème de passation de paramètres est un peu plus ardu. Voici comment je procède habituellement, bien évidemment c’est encore à la discrétion du développeur, à chacun sa méthode et ses habitudes.
D’abord concernant la captation des choix de la liste et de leur valeur. La méthode indiquée dans mon tutoriel http://loufab.developpez.com/tutoriels/access/operateur-in/ reste valable à un détail ; il ne traite que des valeurs numériques. Pour du texte voici ce qu’il faut modifier, ce qui, bien que pas très propre, fonctionnera aussi pour du numérique. Notez également que je factorise sous forme d’une fonction pour pouvoir récupérer la liste où bon me semble dans l’application.
Public Function fGetListe(zliste As ListBox) As String
Dim itm As Variant ' l'item choisi
Dim lstval As String ' la liste des id sélectionnés
For Each itm In zliste.ItemsSelected ' parcourt les items
'ICI LA LIGNE MODIFIEE
lstval = lstval & """" & zliste.ItemData(itm) & """," ' insère chaque valeur TEXTE
Next
fGetListe = Left(lstval, Len(lstval) - 1)
End Function
Donc l’appel est simple :
... = fGetListe(me.malistederoulante)
'ou encore
..." & fGetListe(me.malistederoulante) & "...
Pour l’inclusion dans une requête voici comment procéder (extrait tiré d’une de mes applications) :
Dim strChoix As String
Dim strSql As String
strSql = "SELECT [Nom] & "" "" & [Prenom] AS Adhérent, " & _
" tAdherent.FonctionAmap, tAdherent.Email, "
strSql = strSql & " tAdherent.Selection, " & _
"tAdherent.ID_adherent, tAdherent.Nom FROM tAdherent "
strChoix = fGetListe(Me.lstFonctionAmap)
If Len(strChoix) > 0 Then
strSql = strSql & " WHERE FonctionAmap " & _
" in(" & strChoix & ")"
End If
strSql = strSql & " ORDER BY tAdherent.Nom;"
- strSql contient la requête
- strChoix la liste des valeurs
Une fois strSql renseigné on peut imaginer l’utiliser tel quel ou bien l’enregistrer dans un objet requête comme ceci :
Dim Qrd As DAO.QueryDef
'Créer un objet requête
Set Qrd = CurrentDb.CreateQueryDef("MaNouvelleRequete", strSql)
'ou modifier un objet requête existant
Set Qrd = CurrentDb.QueryDefs("UneRequeteExistante")
Qrd.SQL = strSql
'dans ce dernier cas le code SQL existant est simplement remplacé par le nouveau
currentdb.QueryDefs.Refresh 'on force le rafraichissement.
La manipulation des objets requête n’impose pas de sauvegarde, cette méthode est d’ailleurs absente de la classe.
La liste à choix multiple est souvent boudée parce que moins pratique à poser dans une IHM et plus complexe à exploiter aussi bien pour l’utilisateur (ctrl et shift) que pour le développeur néophyte cependant elle est incontournable pour du choix multiple.
A bientôt pour un nouvel article,