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

 

Personnalisé par Bipbipcoyote.

AVERTISSEMENT !

La plupart des vidéos sur ce site ne m'appartiennent pas. Elles restent hébergées sur YouTube et vous pouvez aller les visionner sur place.
Elles sont éditées en mode public par leur auteur. Je les extrais de la plateforme pour pouvoir éventuellement ajouter des explications complémentaires 
et surtout pour les retrouver plus facilement. Je rappelle que ce site est d'abord MON aide-mémoire même si chacun peut en profiter.
Si un auteur ne souhaite pas que sa vidéo soit visible ici, il peut très facilement modifier les réglages YouTube et en empêcher la diffusion sur un site externe à YouTube..

Lisez aussi en bas de page, l'avis sur l'utilisation des cookies

Ceci fermera dans 30 secondes