Recherche multicritères
Recherche multicritères
Les critères seront soit ces critères exact (choix parmi une liste), soit des critères contenu (la réponse doit contenir le critère). Pour les critères exacts nous utiliseront des listes déroulantes ou Combo Box, et pour les autres des boites de saisie (Text Box).
Exemple de recherche sur une liste de pays
(source: cafeine.developpez.com)
Dans un formulaire indépendant (pas de mise à jour possible sur la table), une case à cocher permétra soit d'afficher tous les pays (si cochée), soit d'afficher une zone de texte de recherche si non cochée.
Nous avons besoin de 3 contrôles :
1 - Glissez une case à cocher (CheckBox) depuis la boîte à outils et la nommer "chkPays" (fenêtre propriétés, onglet Autre, première option "Nom"). Annuler l'assistant si celui-ci se manifeste.
2 - Glissez ensuite une zone de texte (TextBox) et nommer-là "txtRechPays".
3 - Glissez enfin une zone de liste (Label) et nommer-là "lblResultats". Supprimer son étiquette (pas besoin). Enregistrez votre formulaire ("F_Recheche_Pays" par exemple).
Nous distinguerons deux types de codes : celui de l'interface utilisateur et celui de l'accès au données.
Code d'interface utilisateur
Masquer ou afficher la saisie du critère selon la case à cocher qui s'y rapporte. Si l'utilisateur coche la case, valeur récupérée par Me.chkPays, le textbox de recherche est affiché pour permettre une saisie.
Pour cela, sélectionnez la case à cocher "chkPays". Le code suivant est à saisir à partir de l'onglet "Evénement" de la fenêtre "Proriétés" (F4), option "Click". Choisir "Procédure événementielle", cliquer sur le petit bouton gris puis saisir le code Dans l'éditeur VBA :
' Evénement clic d'une case à cocher
Private Sub chkAuteur_Click()
Me.txtRechPays.Visible = Not Me.txtRechPays.Visible
'MAJRequetes 'Appel de procédure distante (à mettre en commentaire)
End Sub
Private Sub chkAuteur_Click()
Me.txtRechPays.Visible = Not Me.txtRechPays.Visible
'MAJRequetes 'Appel de procédure distante (à mettre en commentaire)
End Sub
Liste déroulante
Pour remplir la liste déroulante (ComboBox) "cboRechType", aller dans sa propriété "Contenu" [RowSource], onglet "Données" et cliquer sur le tout petit bouton gris (pour génerer une expression SQL).
Cela ouvre le générateur de requêtes. Insérer la table "T_Types". Choisissez le champ "Nom_type".
Cliquer ensuite sur le bouton Sigma (somme) de la barre d'outils pour faire apparaitre l'opération "Regroupement" pour n'avoir qu'une seule fois les infos. Choisissez enfin le tri croissant. Enregistre votre requête ("R_affiche_types" par exemple) et mettez à jour les liasons (si demandé par Access).
' Evénement BeforeUpDate d'une liste déroulante (ComboBox)
Private Sub cboRechType_BeforeUpdate(Cancel As Integer)
'MAJRequetes
End Sub
Private Sub cboRechType_BeforeUpdate(Cancel As Integer)
'MAJRequetes
End Sub
Mise à jour dynamique
Pour une mise à jour dynamique (soit sans utiliser de bouton cliquable) il nous faut une procédure de mise à jour (nommée "MAJRequetes" par exemple). Nous allons associer cette sub à chaque événement : pour une liste déroulante (ComboBox) ou une Zone de texte (TextBox) l'événement BeforeUpdate et pour les case à cocher (CheckBox) dans l'événement Click.
Code d'accès aux données
Résultat dans la Zone de liste (Label) "lblResultats" :
A réaliser depuis l'onglet "Données" des Propriétés, option "Contenu".
Private Sub MAJRequetes()
Dim str_SQL As String
Dim str_SQLWhere As String
str_SQL = "SELECT t_pays.nom_pays FROM t_pays WHERE t_pays!id_pays <> 0 "
If Me.chkPays Then
str_SQL = str_SQL & "And t_pays.nom_pays like '*" & Me.txtRechPays & "*' "
End If
str_SQLWhere = Trim(Right(str_SQL, Len(str_SQL) - InStr(str_SQL, "Where ") - Len("Where ") + 1))
str_SQL = str_SQL & ";"
Me.lblResultats.RowSource = str_SQL
Me.lblResultats.Requery
End Sub
Dim str_SQL As String
Dim str_SQLWhere As String
str_SQL = "SELECT t_pays.nom_pays FROM t_pays WHERE t_pays!id_pays <> 0 "
If Me.chkPays Then
str_SQL = str_SQL & "And t_pays.nom_pays like '*" & Me.txtRechPays & "*' "
End If
str_SQLWhere = Trim(Right(str_SQL, Len(str_SQL) - InStr(str_SQL, "Where ") - Len("Where ") + 1))
str_SQL = str_SQL & ";"
Me.lblResultats.RowSource = str_SQL
Me.lblResultats.Requery
End Sub
Afin d'afficher tous les résultats, donnez à votre Zone de liste "lblResultats" un nombre de colonnes nécessaire à l'affichage des données (onglet Formats).