Multi-Filtres réalisés avec des combobox's
Filtrer grâce à une table contenant les opérateurs logiques
Exposé : Pouvoir composer une requête SQL et filtrer un formulaire sur des champs choisis
- Première opération : créer une table contenant les opérateurs logiques ; deux champs de type texte
- Ensuite, nous créons notre application. Ici, elle sera simple, une table avec 3 champs : Noms, Prenoms, Age
- On bâtit des requêtes sur ces tables (Q_Operateurs et Q_Personnel) et un formulaire tabulaire (F_Formulaire)
- Dans ce formulaire, on ajoute au dessus des étiquettes de champs des listes déroulantes qui se réfèrent aux mêmes champs dans la requête Q_Personnel et on ajoute la mention "DISTINCT" (ce qui nous permet de visualiser les saisies du champ en un seul exemplaire
- Pour les personnes qui n'ont jamais réaliser la pose d'une liste déroulante, regardez cette vidéo
- Ensuite, nous renommons les listes déroulantes en LNoms, LPrenoms, LAge , LOperateur1, LOperateur2, ces noms me semblent couler de source. Posons maintenant deux boutons de commande, l'un qui nous permettra de poser le filtre et l'autre pour récupérer tous les enregistrements
- Le code du bouton "Tous" , très simple
Private Sub B_Tous_Click() DoCmd.ShowAllRecords 'remettre les combo's à rien LNoms = "": LOperateur1 = "": LPrenoms = "": LAge = "": LOperateur2 = "" End Sub
- Ensuite, cela reste un jeu de patience et de syntaxe pour prévoir tous les cas qui peuvent se présenter. En voici quelques uns :
Private Sub B_Filtrer_Click() Dim Filtre As String If LOperateur1 = "rien" Or LOperateur1 = "" And LOperateur2 = "rien" Or LOperateur2 = "" _ And LNoms <> "" And LPrenoms <> "" And LAge <> "" Then DoCmd.ShowAllRecords Exit Sub End If If LNoms <> "" And LOperateur1 = "" And LOperateur2 = "" Then Filtre = "Noms = '" & LNoms & "'" ElseIf LPrenoms <> "" And LOperateur1 = "" And LOperateur2 = "" Then Filtre = "Prenoms = '" & LPrenoms & "'" ElseIf LAge <> "" And LOperateur1 = "" And LOperateur2 = "" Then Filtre = "Age = " & LAge & "" ElseIf LOperateur1 <> "" Or LOperateur1 <> "RIEN" Then If LOperateur1 = "AND" And LAge = "" Then 'ne pas oublier les espaces devant et après l'opérateur Filtre = "Noms = '" & LNoms & "'" & " AND " & "Prenoms = '" & LPrenoms & "'" ElseIf LOperateur1 = "NOT" And LAge = "" Then Filtre = "Noms='" & LNoms & "' AND (Not (Prenoms)='" & LPrenoms & "')" ElseIf LOperateur1 = "OR" And LAge = "" Then Filtre = "Noms = '" & LNoms & "'" & " OR " & "Prenoms = '" & LPrenoms & "'" ElseIf LOperateur1 = "XOR" And LAge = "" Then Filtre = "Noms = '" & LNoms & "'" & " XOR " & "Prenoms = '" & LPrenoms & "'" End If If LOperateur1 = "AND" And LPrenoms = "" Then 'ne pas oublier les espaces devant et après l'opérateur 'Attention à la syntaxe, Age est de type numérique donc pas d'apostrophe Filtre = "Noms = '" & LNoms & "'" & " AND " & "Age = " & LAge & "" ElseIf LOperateur1 = "NOT" And LPrenoms = "" Then Filtre = "Noms='" & LNoms & "' AND (Not (Age)= " & LAge & ")" ElseIf LOperateur1 = "OR" And LPrenoms = "" Then Filtre = "Noms = '" & LNoms & "'" & " OR " & "Age = " & LAge & "" ElseIf LOperateur1 = "XOR" And LPrenoms = "" Then Filtre = "Noms = '" & LNoms & "'" & " XOR " & "Age = " & LAge & "" End If If LOperateur1 = "AND" And LNoms = "" Then MsgBox "Utilisez la combobox d'à côté" LOperateur1 = "" Exit Sub End If If LOperateur2 = "AND" And LNoms = "" Then 'ne pas oublier les espaces devant et après l'opérateur 'Attention à la syntaxe, Age est de type numérique donc pas d'apostrophe Filtre = "Prenoms = '" & LPrenoms & "'" & " AND " & "Age = " & LAge & "" ElseIf LOperateur2 = "NOT" And LNoms = "" Then Filtre = "Prenoms='" & LPrenoms & "' AND (Not (Age)= " & LAge & ")" ElseIf LOperateur2 = "OR" And LNoms = "" Then Filtre = "Prenoms = '" & LPrenoms & "'" & " OR " & "Age = " & LAge & "" ElseIf LOperateur2 = "XOR" And LNoms = "" Then Filtre = "Prenoms = '" & LPrenoms & "'" & " XOR " & "Age = " & LAge & "" End If '.......à suivre ......... Else 'pour ne pas provoquer un bug si les cases sont vides Exit Sub End If 'Commande pour filtrer le formulaire DoCmd.ApplyFilter , Filtre End Sub
Cliquez ici pour télécharger le fichier exemple (Tous les cas ne sont pas prévus, ici on peut utiliser 2 champs et un opérateur, si vous voulez utiliser les 3 champs et les 2 opérateurs, il faut compléter le code) MultiFiltres
Fin