Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Formulaire de suppression d'enregistrements
Dans la
formation Access précédente, nous avons démontré une méthode relativement simple pour bâtir un
formulaire d'insertion . Ici, nous souhaitons offrir un outil tout aussi intéressant. Au choix d'une référence et au clic sur un bouton, l'utilisateur doit pouvoir commander la suppression de l'enregistrement lié.
Bien sûr,
Access propose une commande nommée
Supprimer un enregistrement . Elle peut être liée à un bouton. Et cette commande peut être exécutée sur un
formulaire classique. Mais précisément, le rôle d'un formulaire classique est de permettre la consultation et la modification des données. D'ailleurs le réglage d'une simple propriété permet d'interdire cette action délicate sur un tel formulaire. Afin de préserver l'intégrité des informations, nous suggérons donc de détacher cette fonctionnalité, qui doit être actionnée par les utilisateurs privilégiés et avertis.
Source et présentation de la problématique
Pour supprimer des enregistrements, encore faut-il disposer de données à manipuler. C'est pourquoi, nous devons commencer par réceptionner une petite
base de données Access .
Comme le résume le
volet des objets Access sur la gauche de l'écran, cette
base de données n'est constituée que de deux éléments à ce stade. On note la présence de la
table Parc et du
formulaire Supprimer_vehicule .
Double cliquer sur la table Parc pour afficher son contenu en mode feuille de données,
Nous y retrouvons l'ensemble des véhicules en transit dans le parc automobile de la société. Chacun est identifié de façon unique par son immatriculation. Ce champ est fort naturellement exploité comme
clé primaire . Chaque automobile est décrite sur trois autres champs : la marque, le modèle et le nombre de chevaux.
Les administrateurs doivent donc pouvoir gérer les entrées et sorties dans ce parc. Nous avions à ce titre réalisé une
formation Access pour bâtir un formulaire d'ajout . Mais lorsqu'une voiture est vendue, elle doit être sortie des références. Son enregistrement complet doit être supprimé. Nous devons donc bâtir ce fameux
formulaire Access de suppression . Et c'est la raison pour laquelle cette petite base de données, propose un
formulaire préconçu.
Fermer la table Parc en cliquant sur la croix de son onglet,
Puis, dans le volet sur la gauche, double cliquer sur le formulaire Supprimer_vehicule ,
Nous l'affichons ainsi en mode exécution.
La structure du
formulaire existe certes. Mais pour l'instant, aucune fonctionnalité ne permet de l'articuler. C'est tout l'enjeu de cette formation. Si vous déployez la
liste déroulante , vous constatez que son contenu est vide.
L'administrateur doit pouvoir désigner une immatriculation correspondant au véhicule à sortir du parc automobile. Nous allons concevoir une
requête isolant ces identifiants. Nous l'utiliserons dès lors comme source de la
liste déroulante .
Et comme cette action est délicate, nous souhaitons charger l'enregistrement correspondant à ce choix dans le
sous formulaire , situé juste en-dessus. Le détail du véhicule permettra de confirmer à l'utilisateur qu'il ne s'est pas trompé, avant d'engager la suppression irréversible. C'est de nouveau une
requête qui doit charger le contenu de ce
sous formulaire . Mais son critère doit être dynamique. Il dépend en effet du choix initié dans la liste déroulante.
Enfin, l'administrateur n'aura plus qu'Ã cliquer sur le bouton pour engager la suppression. Et comme il est question de contourner le code VBA, nous exploiterons les
actions de macro .
Créer la source d'une liste déroulante
Ces immatriculations sont uniques par définition. Nous n'avons donc pas besoin de les purger de leurs doublons. Une simple
requête isolant le
champ de la clé primaire fera l'affaire pour nourrir la
liste déroulante du formulaire .
En haut de la fenêtre Access, cliquer sur l'onglet Créer pour activer son ruban,
Dans la section Requêtes, cliquer sur le bouton Création de requête ,
Dans la boîte de dialogue qui suit, sélectionner la table Parc ,
Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer ,
Les champs de la table désignée sont listés dans une représentation schématique.
Glisser le champ immatriculation sur la grille de requête en bas de l'écran,
Puis, dans sa zone Tri , choisir Croissant ,
Pour faciliter le repérage par l'utilisateur, nous remplirons ainsi la liste déroulante des immatriculations, dans l'ordre alphabétique.
Enregistrer cette requête (CTRL + S),
Dans la petite boîte de dialogue qui suit, la nommer Requete_immat et valider par Ok,
Elle apparaît désormais listée dans le volet des objets Access, sur la gauche de l'écran.
Si vous double cliquez sur son nom, vous visualisez le résultat de son extraction en mode feuille de données (Cf. figure ci-dessus). Il s'agit bien de toutes les immatriculations pour les véhicules recensés dans le parc automobile.
Fermer la requête en cliquant sur la croix de son onglet puis revenir sur le formulaire,
Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage ,
Dans la liste, choisir Mode création ,
Nous affichons ainsi le formulaire en conception pour pouvoir manipuler ses différents contrôles. La feuille de propriétés est nécessaire pour nos travaux. Si elle n'est pas visible dans votre environnement, vous devez cliquer sur le
bouton Feuille de propriétés dans le
ruban contextuel Création .
Cliquer sur la liste déroulante pour la sélectionner,
Il peut être nécessaire de réaliser un
CTRL + Clic pour la désigner, en raison de l'empilement de plusieurs contrôles sur le même emplacement.
Comme vous le savez, la
feuille de propriétés est contextuelle. Elle offre tous les réglages qu'il est possible de paramétrer pour l'objet désigné sur le formulaire.
Et comme nous pouvons le lire, cette
liste déroulante est nommée
Immat . Ces noms d'objets sont fondamentaux pour pouvoir les désigner dans les interactions. Et ces interactions peuvent être engendrées par le code, comme par les macros ou les requêtes. Le contenu de cette liste doit donc être rempli de la sélection réalisée par notre requête.
Dans la feuille de propriétés, cliquer sur l'onglet Données pour l'activer,
Dans la propriété Contenu , choisir la requête Requete_immat ,
La liaison est désormais établie.
Enregistrer les modifications du formulaire (CTRL + S),
Puis, enfoncer la touche F5 du clavier pour l'exécuter,
Déployer la liste déroulante,
Comme vous le constatez, toutes les immatriculations sont désormais proposées à la sélection. Notre
liste déroulante se nourrit de la sélection réalisée en amont par la
requête . Si les données évoluent dans la table, le résultat de la requête s'actualise fort naturellement. De fait, le contenu de la liste déroulante s'adapte.
Charger le contenu correspondant au choix
Au choix d'une immatriculation dans la liste déroulante, l'enregistrement correspondant doit être récupéré et affiché dans le sous formulaire. La source de ce dernier doit être construite sur la base d'une
requête dynamique . Son critère intervient donc sur le
champ immatriculation . Il doit dépendre du choix effectué par l'administrateur depuis le formulaire. Donc, le résultat de l'extraction proposé par cette requête doit s'actualiser continuellement.
Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage ,
Dans la liste, choisir Mode création ,
Cliquer ensuite sur l'onglet Créer en haut de la fenêtre Access pour activer son ruban,
Dans la section Requêtes, cliquer sur le bouton Création de requête ,
Dans la boîte de dialogue qui suit, choisir la table Parc ,
Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer ,
Cliquer sur le premier champ immatriculation pour le désigner,
Tout en maintenant la touche Maj enfoncée , cliquer sur le dernier (Chevaux),
Cette technique permet d'inclure tous les champs dans la sélection.
Glisser cette sélection sur la grille de requête,
Nous incluons ainsi toutes les colonnes de la table pour l'extraction à fournir. La
condition dynamique doit être posée sur le
champ immatriculation .
Dans la zone Critères du champ immatriculation , cliquer avec le bouton droit de la souris,
Dans le menu contextuel, choisir Créer ,
Cette action a pour effet de déclencher l'affichage du
générateur d'expression .
Dans la liste de gauche, déployer l'arborescence jusqu'à sélectionner le formulaire Supprimer_vehicule ,
Dans la liste du centre, double cliquer sur le contrôle Immat ,
Nous réalisons ainsi la correspondance dynamique pour le critère à poser sur le
champ immatriculation , en fonction du choix réalisé sur le
formulaire , depuis la
liste déroulante Immat . A ce titre, vous notez l'inscription de la syntaxe de correspondance dans la partie supérieure de la boîte de dialogue.
Cliquer sur le bouton Ok pour valider cette condition dynamique,
De retour sur la grille de requête, vous constatez que l'expression construite est désormais renseignée dans la
zone de critères du champ immatriculation . Nous ne pouvons pas exécuter la
requête en l'état. En l'absence de valeur sélectionnée depuis le formulaire, elle ne peut produire aucun résultat d'extraction.
Enregistrer la requête (CTRL + S) sous le nom Requete_contenu ,
Puis, la fermer en cliquant sur la croix de son onglet,
Liaison dynamique du contenu
Cette requête doit désormais être exploitée pour remplir dynamiquement le contenu du
sous formulaire .
Revenir sur le formulaire en mode conception,
Cliquer sur le sous-formulaire pour le sélectionner,
Souvenez-vous, un
CTRL + Clic peut être nécessaire pour l'atteindre. En consultant sa feuille de propriétés, vous remarquez que ce contrôle se nomme
Confirmation .
Activer l'onglet Données de sa feuille de propriétés,
Puis, définir sa propriété Objet source sur Requête.Requete_contenu ,
Enregistrer les modifications (CTRL + S) et exécuter le formulaire,
Au chargement, vous remarquez que le contenu du sous-formulaire n'est plus vide. Il restitue l'enregistrement correspondant à l'immatriculation active par défaut dans la liste déroulante.
Dans la liste déroulante, choisir une autre immatriculation,
Malheureusement, le contenu du sous-formulaire n'est pas réactualisé. Il conserve en mémoire le résultat de l'extraction opérée à l'ouverture. C'est pourquoi, à chaque nouveau choix dans la liste, nous devons déclencher l'exécution d'une macro, ordonnant de rétablir la liaison.
Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage ,
Dans la liste, choisir Mode création ,
Cliquer sur la liste déroulante du formulaire pour la sélectionner,
Activer l'onglet Evénement de sa feuille de propriétés,
Puis, cliquer sur le petit bouton de son évènement Sur changement ,
Dans la boîte de dialogue qui suit, choisir Générateur de macro et valider par Ok,
Nous basculons ainsi dans l'
éditeur de macro qui permet d'empiler les actions à engager, les unes en dessous des autres.
Dans la liste déroulante, choisir l'action AfficherTousEnreg ,
Cette action a pour effet de forcer la réactualisation des liaisons entre les objets Access. Comme elle intervient sur l'
évènement Sur changement , dès qu'une nouvelle immatriculation est sélectionnée, la source du sous formulaire doit être réactualisée.
Dans le ruban, cliquer sur le bouton Enregistrer puis sur le bouton Fermer ,
De retour sur le formulaire, réaliser le raccourci CTRL + S pour l'enregistrer à son tour,
Puis l'exécuter à l'aide de la touche F5 du clavier ,
Dans la liste déroulante, choisir une nouvelle immatriculation,
Cette fois, le contenu du sous formulaire s'adapte. La liaison est désormais dynamique. Nous offrons le niveau de détail suffisant pour que l'administrateur puisse s'assurer du véhicule à supprimer.
Requête suppression
Pour parfaire l'application, nous devons la rendre pleinement fonctionnelle. L'administrateur peut désormais sélectionner l'immatriculation du véhicule à supprimer du parc. A titre de vérification, il peut consulter le détail de l'automobile désignée, dans le sous-formulaire. Mais surtout, il doit pouvoir déclencher la
suppression de l'enregistrement complet, au
clic sur le bouton . Ce clic doit déclencher l'exécution d'une
macro . Et cette
macro doit elle-même déclencher l'exécution d'une
requête suppression . Mais il ne s'agit pas de n'importe quelle
requête suppression . Elle doit seulement supprimer l'enregistrement correspondant à l'immatriculation choisie dans la liste déroulante. Son critère est donc dynamique. Et il s'agit du même critère que celui de la requête source du sous-formulaire. C'est pourquoi nous proposons de dupliquer cette dernière puis de modifier sa nature.
Dans le volet des objets Access, sélectionner la requête Requete_contenu ,
La copier (CTRL + C) puis la coller (CTRL + V),
Dans la boîte de dialogue qui se déclenche, la renommer Requete_suppression et valider,
Cliquer avec le bouton droit de la souris sur son nom, dans le volet de gauche,
Dans le menu contextuel, choisir Mode création ,
Dans le ruban Créer, en haut de la fenêtre Access, cliquer sur le bouton Suppression ,
Nous venons de changer la nature de la requête. Elle ne sélectionne plus. Elle supprime. Et comme vous le constatez, elle a conservé les réglages de la précédente requête. Dans la grille de requête, vous observez l'apparition d'une zone nommée
Supprimer . Elle identifie explicitement la
table Parc pour procéder, tout en tenant compte du
critère dynamique , toujours en vigueur sur le
champ immatriculation .
Nous devons ordonner l'exécution de cette requête sur ordre, soit
au clic sur le bouton du formulaire .
Enregistrer les modifications de la requête (CTRL + S),
Puis, la fermer en cliquant sur la croix de son onglet,
Revenir sur le formulaire en mode création ,
Cliquer sur le bouton pour le sélectionner,
Activer l'onglet Evénement de sa feuille de propriétés,
Cliquer sur le petit bouton de son évènement Au clic ,
Dans la boîte de dialogue, choisir Générateur de macro et valider par Ok,
Comme il s'agit d'une action délicate, nous souhaitons demander confirmation à l'utilisateur avant de procéder. Donc l'action à enclencher dépend de la réponse fournie par l'administrateur. Le traitement doit donc être imbriqué dans une
instruction conditionnelle .
Avec la liste déroulante, choisir la commande Si ,
Le raisonnement est identique à celui opéré avec les
fonctions Si d'Excel . Si le critère est vrai, alors nous engageons une action, sinon nous engageons une autre action. Ici, si l'utilisateur souhaite poursuivre, alors nous devons déclencher l'exécution de la
requête suppression . Dans le cas contraire, nous devons stopper le traitement. Il s'agit donc de lui poser la question par le biais d'une boîte de dialogue. Cette boîte de dialogue doit offrir les
boutons Oui et Non en guise de réponse. Ensuite, nous devrons être en mesure d'interpréter le choix effectué.
A l'extrémité droite de la zone du Si , cliquer sur l'icône de la baguette magique,
Nous appelons ainsi le générateur d'expression pour construire le critère de l'instruction conditionnelle.
Dans la liste de gauche, déployer l'arborescence des fonctions jusqu'à sélectionner les fonctions intégrées ,
Dans la liste du centre, sélectionner la catégorie Message ,
Dans la liste de droite, double cliquer sur la valeur BoîteMsg ,
La syntaxe de la fonction ainsi désignée s'inscrit dans la partie supérieure du
générateur d'expression . Nous devons renseigner ses arguments, sachant qu'ils sont tous facultatifs, sauf le premier. Celui-ci (Prompt) correspond au message destiné à l'utilisateur.
A la place de l'argument «prompt», inscrire le message de confirmation entre guillemets, comme par exemple : 'Confirmez-vous la suppression ?',
A la place de l'argument «boutons», saisir le chiffre 4 ,
Comme l'enseigne l'aide en ligne, cette valeur numérique permet de greffer les boutons Oui et Non sur la boîte de message.
Supprimer les autres arguments facultatifs et les points-virgules associés,
La parenthèse fermante doit être conservée bien entendu. L'expression construite à ce stade, est la suivante :
BoîteMsg('Confirmez-vous la suppression ?'; 4)
Pour que le critère de l'expression conditionnelle puisse être évalué, il faut étudier la valeur numérique retournée, correspondant au clic sur l'un ou l'autre bouton. Là encore, comme l'indique l'aide en ligne, un clic sur le
bouton Oui retourne la valeur 6 et 7 dans l'autre cas.
Cliquer sur le bouton Ok du générateur d'expression pour valider la syntaxe,
De retour dans l'éditeur de macro, ajouter le test suivant à la suite : =6 ,
Puis, déployer la liste déroulante du dessous et choisir l'action OuvrirRequête ,
Dans la zone Nom de la requête, désigner la Requete_suppression ,
Nous venons de construire l'expression consistant à déclencher l'exécution de la
requête dynamique de suppression , au clic sur le bouton Oui de la boîte de dialogue, par l'utilisateur.
Dans le ruban, cliquer sur le bouton Enregistrer puis sur le bouton Fermer ,
De retour sur le formulaire, réaliser le raccourci CTRL + S pour l'enregistrer,
Puis, l'exécuter à l'aide de la touche F5 du clavier ,
Choisir une immatriculation dans la liste déroulante,
Puis, cliquer sur le bouton Confirmer la suppression ,
La boîte de dialogue paramétrée avec le générateur d'expression se déclenche.
Cliquer sur le bouton Oui pour confirmer la suppression de l'enregistrement,
Un autre message apparaît, mais cette fois, il est issu du système. Nous sommes en train de déclencher l'exécution d'une
requête action qui aura des incidences sur les données source.
Valider ce message et cliquer sur le bouton Oui du message qui suit,
La mention
Supprimé s'affiche dans les champs du sous-formulaire. Elle semble indiquer que l'enregistrement correspondant a été effacé de la source de données. L'immatriculation quant à elle, est toujours visible et sélectionnée dans la liste déroulante.
Si vous double cliquez sur la
table Parc pour afficher son contenu, vous constatez que le véhicule a effectivement été supprimé de la base de données.
Dans la liste déroulante du formulaire, choisir une nouvelle immatriculation,
Puis, cliquer sur le bouton Confirmer la suppression ,
Dans la boîte de message qui suit, cliquer sur le bouton Non cette fois,
Le traitement semble effectivement s'interrompre. Plus aucun message d'alerte ne suit. Si vous double cliquez sur la
table Parc pour afficher son contenu, vous remarquez que le véhicule est en effet toujours présent.
Notre
formulaire Access de suppression est donc à la fois fonctionnel et sécurisé. Mais il peut être amélioré. Nous souhaitons couper les messages d'alerte enclenchés par
Access , avant l'exécution de la
requête suppression . De même, il est opportun de réactualiser l'affichage du formulaire et de son sous-formulaire, dans le cas d'un enregistrement supprimé. Pour ce faire, nous proposons de commander la fermeture et la réouverture de l'objet.
Revenir sur le formulaire en mode création,
Cliquer sur le bouton pour le sélectionner,
Cliquer sur le bouton de son évènement Au clic dans sa feuille de propriétés,
Nous revenons ainsi dans l'éditeur de macro qui nous permet de compléter les actions précédentes.
Dans le ruban Création, cliquer sur le bouton Afficher toutes les actions ,
Nous avons désormais accès à des commandes inaccessibles par défaut.
Dans la liste déroulante de l'éditeur, choisir l'action Avertissements ,
Conserver son paramétrage par défaut sur Non ,
Cette action permet de neutraliser les messages d'alerte qui suivent. Faut-il encore bien la placer dans la chronologie.
Glisser l'action Avertissements au-dessus de l'action OuvriRequête ,
Deux actions supplémentaires sont encore nécessaires. Mais cette fois, elles doivent intervenir après l'exécution de la requête, et bien entendu, dans l'instruction conditionnelle.
Sous l'action OuvrirRequête, ajouter l'action FermerFenêtre ,
Dans la zone Type d'objet, choisir Formulaire ,
Dans la zone Nom d'objet, sélectionner le formulaire Supprimer_vehicule ,
Dans la zone Enregistrer, choisir Non ,
Ajouter alors l'action OuvrirFormulaire ,
Dans la zone Nom de formulaire, choisir Supprimer_vehicule ,
Cette fois, tous les comportements sont prévus. Il ne nous reste plus qu'à tester.
Dans le ruban, cliquer sur le bouton Enregistrer puis sur le bouton Fermer ,
De retour sur le formulaire, réaliser le raccourci CTRL + S pour l'enregistrer à son tour,
Puis, enfoncer la touche F5 du clavier pour l'exécuter,
Choisir une immatriculation dans la liste déroulante,
Cliquer sur le bouton Confirmer la suppression du formulaire,
Dans la boîte de message qui suit, confirmer par Oui ,
Aucune alerte ne suit désormais. Le formulaire semble se réinitialiser. D'ailleurs, en déployant sa liste déroulante, nous pouvons constater que l'immatriculation précédemment désignée, a effectivement disparu. La confirmation est apportée en affichant le contenu de la
table Parc .
Notre
formulaire Access de suppression est cette fois pleinement fonctionnel et sécurisé.