Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Adapter la vue d'un état
Pour des raisons d'optimisation d'une
base de données et d'une
application Access, il est important de ne pas multiplier la création des objets. Par exemple,
une seule et même requête doit être en mesure d'adapter ses filtres et tris en fonction des sollicitations émises depuis un
formulaire. De la même façon,
un seul et même état doit être capable de livrer une vue adaptée à la demande dynamique effectuée depuis un
formulaire.
Sur l'exemple illustré par la capture, un
formulaire tabulaire énumère des activités de sorties recensées dans différents départements. L'utilisateur peut choisir l'un de ces départements à l'aide d'une
liste déroulante placée en haut à droite de la fenêtre. Dès lors, s'il clique sur le
bouton Aperçu, il obtient une vue prête à l'impression de toutes les activités de sorties dans le département demandé. La
source de données de l'état cible a donc été modifiée dynamiquement en fonction du choix utilisateur depuis le
formulaire.
Base de données à télécharger
Pour la démonstration de cette nouvelle
astuce VBA Access, nous suggérons d'appuyer l'étude sur une
base de données offrant ces
activités de sorties.
Comme l'indique le
volet de navigation sur la gauche de l'écran, cette petite
base de données est constituée d'une
table listant les
activités de sorties ainsi que d'un
formulaire et d'un
état.
- Double cliquer sur le formulaire f_societes pour l'ouvrir,
Il est fidèle à celui de la présentation. En mode tabulaire, il énumère pêle-mêle, toutes les
activités de sorties recensées dans la
table societes. En haut à droite de ce
formulaire, l'utilisateur peut définir un département avec une
liste déroulante. Mais à ce stade bien entendu, s'il clique ensuite sur le
bouton Aperçu, rien ne se produit encore. L'objectif et nous l'avons dit, est d'afficher une vue filtrée de ces activités sur le département choisi.
- Dans le volet de navigation, double cliquer sur l'état e_societes pour commander l'aperçu,
Nous débouchons sur un affichage de toutes les sorties mélangées, dans une
vue prête à l'impression. Cet
état a simplement été construit sur la
table societes sans clause Where. C'est lui que nous devons afficher
au clic sur le bouton du formulaire, en adaptant dynamiquement sa
source de données, pour imposer le
filtre sur le département désigné par l'utilisateur.
Code VBA Access au clic
Nous devons donc commencer par créer la
procédure événementielle associée au
bouton du formulaire.
- Fermer l'état pour revenir sur le formulaire en exécution,
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans les propositions, choisir le mode Création,
- Sur le formulaire en conception, cliquer sur le bouton en haut à droite, pour le sélectionner,
- Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
Si elle n'est pas visible dans votre environnement, vous devez l'afficher. Pour cela, vous devez cliquer sur le
bouton Feuille de propriétés dans le
ruban Création ou le
ruban Conception de formulaire (Selon la version).
- Dans l'onglet Evénement donc, cliquer sur le bouton de son événement Au clic,
- Dans la boîte de dialogue qui suit, choisir le générateur de code et valider par le bouton Ok,
Nous basculons ainsi dans l'
éditeur VBA Access entre les bornes de la
procédure événementielle Apercu_Click :
Private Sub Apercu_Click()
End Sub
Son code se déclenchera naturellement au clic de l'utilisateur sur ce bouton. C'est lui qui doit ajuster la
source de données de l'état pour ensuite l'afficher. Et pour la suite des démonstrations nous proposons de procéder par étapes.
Les variables
Nous avons tout d'abord besoin de calibrer une
requête à utiliser comme source de données mais aussi de piloter l'
état à afficher. C'est la raison pour laquelle, nous devons déclarer
deux variables dédiées.
- Dans les bornes de la procédure événementielle, ajouter les deux déclarations suivantes :
Dim requete As String: Dim Etat As Report
Nous déclarons la
variable requete et la typons comme un texte (As String). Elle doit en effet recevoir la
syntaxe Sql de la requête à utiliser comme
source de données de l'état. Et précisément pour pouvoir piloter ce dernier, nous déclarons la
variable Etat comme un
objet de type Report, soit un
objet Etat.
Etat et requête
Nous devons maintenant
initialiser ces deux variables en commençant par la
syntaxe Sql à stocker dans la
variable requete. Il s'agit d'une
requête sélection classique mais sa
clause Where est dynamique. Elle dépend du choix du département effectué par l'utilisateur avec la
liste déroulante nommée
ListeDep. Elle doit agir sur le
champ societes_departement de la
table societes.
- A la suite du code de la procédure événementielle, ajouter l'affectation suivante :
requete = "SELECT * FROM societes WHERE societes_departement = '" & ListeDep.Value & "' ORDER BY societes_nom;"
Nous sélectionnons (SELECT)
tous les champs (*) de la
table societes (FROM societes) pour lesquels (WHERE) le
département (societes_departement) équivaut à celui choisi par l'utilisateur avec la
liste déroulante (ListeDep.Value). Notez la présence des
simples côtes avant la double côte fermante ('") et après la double côte ouvrante ("') pour la concaténation de la partie dynamique. En effet, il s'agit d'une valeur textuelle. Elle doit donc être encadrée. Enfin, nous organisons un
tri croissant sur le nom des activités (ORDER BY societes_nom).
Maintenant et avant de pouvoir
piloter l'état avec la variable objet, nous devons l'ouvrir en
mode création par le
code VBA. C'est seulement ainsi que nous pourrons influer sur ses propriétés pour modifier sa
source de données. Et c'est alors que nous retrouvons sur notre chemin, le précieux
objet DoCmd (Do Command) qui permet d'engager de très nombreuses actions grâce à ses riches
méthodes.
- A la suite du code, ajouter l'instruction VBA suivante :
DoCmd.OpenReport "e_societes", acViewDesign, , , acHidden
Grâce à la
méthode OpenReport de l'
objet DoCmd, nous définissons tout d'abord le nom de l'état ("e_societes") à ouvrir, en premier paramètre. En deuxième paramètre, nous indiquons que nous souhaitons l'atteindre en mode conception avec la
valeur acViewDesign. Nous ignorons le troisième et quatrième paramètres. Ils sont facultatifs. C'est ainsi que nous atteignons le cinquième paramètre. Avec la
valeur acHidden, nous conservons le formulaire masqué pour agir en arrière-plan.
Désormais, nous devons initialiser la
variable objet pour qu'elle prenne possession de l'
état.
- A la suite du code VBA, ajouter l'initialisation suivante :
Set Etat = Application.Reports("e_societes")
Grâce à la
propriété Reports de l'
objet Application, nous
instancions la classe permettant à la variable de
piloter un état. Le nom de cet état est passé en paramètre de la propriété. D'ailleurs, nous aurions pu le stocker dans une variable pour éviter de le répéter à chaque reprise. Dès lors, la
variable objet Etat hérite des
propriétés et
méthodes pour piloter cet élément par le
code VBA.
Changer la source de l'état
Puisque l'
état est ouvert en
mode création, nous allons pouvoir exploiter cette
variable objet pour
modifier la source de l'état en corrélation avec le
choix du département effectué par l'utilisateur.
- A la suite du code, ajouter l'instruction VBA suivante :
Etat.RecordSource = requete
C'est donc la
propriété RecordSource d'un
objet de type Report qui permet de définir la
source de données de l'état représenté par la variable. Et cette source, nous la définissons dynamiquement grâce à la
requête Sql que nous avons stockée dans la
variable requete.
Enregistrer les modifications et afficher l'état
Puisque la
source a été redéfinie en arrière-plan, nous devons maintenant sauvegarder ces réglages en
fermant le formulaire pour le
rouvrir en mode normal. C'est ainsi que nous offrirons à l'utilisateur la
vue filtrée correspondant à son choix.
- A la suite du code de la procédure, ajouter les deux lignes VBA suivantes :
DoCmd.Close acReport, "e_societes", acSaveYes
DoCmd.OpenReport "e_societes", acViewReport, , , acWindowNormal
Nous retrouvons notre
objet DoCmd. Grâce à sa
méthode Close, nous définissons que l'objet à fermer est un
état (acReport). En deuxième paramètre, nous renseignons bien entendu le nom de cet état. En dernier paramètre, nous indiquons que les modifications opérées sur la source de données doivent être conservées (acSaveYes). Ensuite, nous utilisons de nouveau la
méthode OpenReport. Mais cette fois, nous ouvrons le
formulaire e_societes en mode exécution (
acViewReport).
- Enregistrer les modifications (CTRL + S) puis fermer l'éditeur VBA Access,
- De retour sur le formulaire, l'enregistrer à son tour,
- Puis, l'exécuter avec la touche F5 du clavier,
- Dès lors, choisir un département avec la liste déroulante, par exemple : 38-Isère,
- Puis, cliquer sur le bouton Aperçu,
Comme vous pouvez l'apprécier, le
rendu de l'état est aussitôt livré mais il est dynamiquement calibré sur les activités de sorties du département choisi par l'utilisateur. Bien entendu, si vous fermez l'état, que vous choisissez un nouveau département sur le formulaire et que vous cliquez de nouveau sur le bouton Aperçu, c'est une nouvelle vue qui est proposée en corrélation avec ce nouveau choix
Pour un tel résultat, le code complet de la
procédure événementielle que nous avons construite, est relativement simple :
Private Sub Apercu_Click()
Dim requete As String: Dim Etat As Report
requete = "SELECT * FROM societes WHERE societes_departement='" & ListeDep.Value & "' ORDER BY societes_nom;"
DoCmd.OpenReport "e_societes", acViewDesign, , , acHidden
Set Etat = Application.Reports("e_societes")
Etat.RecordSource = requete
DoCmd.Close acReport, "e_societes", acSaveYes
DoCmd.OpenReport "e_societes", acViewReport, , , acWindowNormal
End Sub