formateur informatique

Modifier la source de données d'un état Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Modifier la source de données d'un état Access
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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.

Formulaire Access des activités de sorties à filtrer dynamiquement sur un état

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,
Associer un code VBA Access au clic sur un bouton de formulaire

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,
Adapter la vue de l-état au choix d-une valeur sur le formulaire Access

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


 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn