CreerFiltres

Retour vers Access

Automatiser des filtres

Exposé : Voilà un souci qui revient constamment lors de la mise au point d'une application Access. Comment utiliser des critères de filtre génériques
Etat des lieux : nous allons créer une application toute simple

  • Une table nommée "T_Table" qui reprend  un champ "Noms"
  • Il nous faut une requête "Q_Table"
  • et un formulaire continu "F_Table"
  • Je veux filtrer et n'afficher que les "Dupont"
  • Je vais donc inscrire cette chaîne de caractères dans la case adéquate
  • Evidemment, ceci peut se concevoir si le filtre est statique. Ce n'est pas à l'utilisateur (encodeur) à venir modifier constamment cette clé. Le concepteur de l'application doit concevoir que le critère peut évoluer dans le temps, alors comment doit-il faire ?
  • Premièrement, il peut prévoir une interrogation de l'utilisateur et avoir recours à une inputbox. L'utilisateur introduit alors un nom. Pour réaliser cela, il inscrit une question de la manière suivante dans la requête en mode création
  • Avantage d'utiliser l'opérateur "Comme" ou "Like", il va nous permettre d'utiliser les caractères génériques "?" et "*" qui remplacent soit un caractère soit une chaîne de caractère
  • Bien sûr, on ne travaille normalement pas depuis les requêtes, l'ouverture de celles-ci s'opèrent à partir de boutons de commande posés sur des formulaires, il faut donc tenir compte que cette question sera posée lors de l'ouverture de chaque objet (autre formulaire ou rapport) construit sur base de cette requête, ce qui peut devenir vite énervant.
  • Alors comme ces requêtes servent le plus souvent à afficher des rapports ou des formulaires, nous allons tenter une autre approche. Utilisons notre requête de départ sans question et servons-nous en comme base pour bâtir un formulaire
  • Récupérer le contenu d'un champ pointé et l'appliquer comme filtre. Un utilisateur-encodeur travaille à partir de formulaires, alors vous pouvez soit poser un bouton de commande ou lui indiquer qu'un double clic dans le champ est suffisant pour traiter son filtre. Voici l'interface
  • Le code lié au bouton "Filtrer avec un inputbox"
    Private Sub Commande2_Click()
      Dim reponse As String
      reponse = InputBox("Donnez moi le nom")
      If reponse = "" Then
        Exit Sub
      Else
        DoCmd.ApplyFilter , "Noms like '" & reponse & "'"
      End If
    End Sub
  • Le code lié au bouton "Enlever les filtres"
    Private Sub Commande4_Click()
      DoCmd.ShowAllRecords
    End Sub
  • Finalement, le plus pratique certainement, le double clic
    Private Sub Noms_DblClick(Cancel As Integer)
      DoCmd.ApplyFilter , "Noms = '" & [Noms] & "'"
    End Sub
  • Pour ouvrir un rapport filtré
    Private Sub Commande5_Click()
      Dim Filtre As String
      Filtre = "[Noms] = '" & [Noms] & "'"
      DoCmd.OpenReport "R_Table", acViewPreview, , Filtre
    End Sub
  • J'attire votre attention sur la double virgule en fin d'instruction de "... acViewPreview, , Filtre" . On en oublie généralement une et bien sûr on obtient un résultat non escompté
  • Même technique pour ouvrir un autre formulaire
    Private Sub Commande6_Click()
      Dim Filtre As String
      Filtre = "[Noms] = '" & [Noms] & "'"
      DoCmd.OpenForm "F_Copie", acNormal, , Filtre
    End Sub
  • Créer des requêtes un peu plus complexes et dont on veut conserver les critères de filtre. Jusqu'à présent nos critères de filtre étaient "volatiles" dans le sens que l'on n'en conserve aucune trace dans la base de données, une fois appliqués, ils sont "oubliés"; pour obtenir le même résultat, on doit les relancer depuis leur point de départ...Il faut donc être capable de créer une requête et de la sauver avec ces paramètres
    Private Sub Commande7_Click()
      Dim DB As DAO.Database
      Dim SQLCommande As String
      Dim QD As DAO.QueryDef
      Dim Filtre As String
     Set DB = Application.CurrentDb'***** Effacer la requete si elle existe *******
    For Each QD In DB.QueryDefs
      If QD.Name = "Q_MaRequete" Then
        Application.CurrentDb.QueryDefs.Delete ("Q_MaRequete")
      End If
    Next
    Filtre = [Noms] 'le filtre est toujours l'enregistrement pointé 
    SQLCommande = "SELECT T_Table.Noms FROM T_Table WHERE T_Table.Noms = '" & Filtre & "';" 
      '****** enfin créer la requête ******
      '** Super, ça écrase la requête qui existe déjà ****
      Set QD = Application.CurrentDb.CreateQueryDef("Q_MaRequete", SQLCommande)
      DoCmd.SelectObject acQuery, "Q_MaRequete", True
    End Sub 

Visitez aussi la page suivante mais aussi celle-ci

Cliquez ici pour télécharger le fichier RequeteFormulaireRapportFiltres

Fin