|
|
|
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ère 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ée, elles sont "oubliées"; 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 exemple
Fin
|