MultiFiltres

Retour vers Access

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