Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Formulaires et macros de suppression
Dans l'
exercice Access précédent, nous avons apporté la solution pour rendre opérationnels les
formulaires de création encapsulés dans des
formulaires de navigation. Ils interagissent en effet avec une
macro et une
requête dynamique. C'est cette dernière qui réalise l'
insertion des données dans la
table source, en prélevant les informations inscrites sur le
formulaire, au moment de la demande. Et nous avons dû retravailler les expressions de correspondance pour atteindre les
contrôles des formulaires, imbriqués dans une construction par
onglets à deux niveaux. Ici, nous devons exploiter ces solutions pour que les
formulaires de suppression puissent répondre à la demande, depuis le
formulaire de navigation principal.
Sources et présentation de la problématique
Pour poursuivre la confection de notre
application de gestion, nous devons commencer par réceptionner les travaux au dernier indice.
Comme vous le remarquez, la décompression conduit au fichier de la
base de données accompagné d'un fichier de type texte. Celui-ci archive la syntaxe à générer pour qu'une requête puisse prélever les informations encapsulées dans les
formulaires de navigation à deux étages. Comme nous l'avons construite dans l'exercice précédent, nous proposons ici de l'exploiter directement.
- Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access,
- A l'invite, saisir le mot de passe d'accès : abc,
- Cliquer ensuite sur le bouton Activer le contenu du bandeau de sécurité,
- Puis, du fait de la régénération, valider de nouveau le même mot de passe : abc,
L'accès est désormais déverrouillé. Le
formulaire de navigation principal se propose par défaut, grâce à une
macro Access AutoExec, que nous avions configurée.
- Cliquer sur le dernier onglet à droite intitulé Outils actions,
- Saisir le mot de passe administrateur : abc123,
Nous accédons ainsi à la seconde navigation imbriquée. Les onglets sont disposés à la verticale. Ils permettent d'exploiter des formulaires agissant sur les données de la base.
Les deux premiers,
Créer un client et
Créer un produit, ont été résolus au cours de l'exercice précédent. Ils permettent désormais de créer un nouveau client ainsi qu'un nouvel article.
Ce sont les deux derniers onglets,
Supprimer un client et
Supprimer un produit, qui nous intéressent dans cet exercice. Dans les deux cas, une liste déroulante permet de sélectionner une référence à éliminer dans la table source.
Au choix d'une valeur dans l'une comme dans l'autre, toutes les informations attachées sont rapatriées, à titre de confirmation. Pour cela, nous avions exploité la
fonction Access RechDom. Et c'est une
action de macro Access qui permet d'actualiser les informations. Bref, au fil des exercices, nous avons progressé. Désormais, au clic sur le
bouton Supprimer, l'intégralité de l'enregistrement désigné par la référence, doit être supprimé de la
table source.
Pour ce faire, nous avons besoin de bâtir des
requêtes de suppression dynamiques. Elles doivent être en mesure de récolter l'identifiant choisi depuis le
formulaire, au moment de la demande. Et comme ces
formulaires sont imbriqués dans des
navigations à deux niveaux, nous devons exploiter la syntaxe proposée dans le fichier texte, résultant de la décompression.
- Dans le volet de navigation, cliquer droit sur la requête R_creer_client,
- Dans le menu contextuel, choisir Mode création,
Nous basculons ainsi dans l'éditeur de requête. Cette dernière est exécutée au clic sur le
bouton du formulaire F_creer_client. Elle récolte les informations qui sont inscrites dans les différents contrôles. Puis, elles les insère dans la
table Clients pour créer un nouvel enregistrement.
- Cliquer droit dans la zone Champ de la première colonne,
- Dans le menu contextuel, choisir Créer,
Nous affichons ainsi le
générateur d'expression. Il retranscrit explicitement la syntaxe établie pour réaliser la correspondance entre le
contrôle Civilite du
formulaire et le champ de destination
Client_civilite de la
table. C'est ainsi que sont prélevées les données au moment de la demande. Et à ce titre, du fait de l'
imbrication des formulaires de navigation, vous notez la complexité de la syntaxe pour atteindre et désigner ces contrôles.
Pour animer les
formulaires de suppression, nous devons fort logiquement construire des
requêtes suppression. Mais avant d'agir, ces dernières doivent prélever l'identifiant désigné dans la liste déroulante du formulaire source. En conséquence, une expression semblable doit être bâtie.
Requêtes suppression dynamiques
Il est temps d'entrer dans le vif du sujet. Les deux
requêtes suppression doivent être bâties avec les
expressions de correspondance dynamiques. Ensuite, au clic sur le
bouton du formulaire, elles doivent être exécutées par
action de macro.
- Fermer le générateur d'expression puis fermer la requête en cliquant sur la croix de son onglet,
- Fermer le formulaire de navigation principal : _F_navig_principal,
Dans le volet de navigation, en queue de liste de la
catégorie des requêtes, vous pouvez noter la présence d'une requête nommée :
R_Suppr_ref. Il s'agit d'une
requête paramétrée que nous avions construite à l'occasion d'un
exercice sur les requêtes. Sous forme de boîte de dialogue, elle demande à l'utilisateur la référence de l'article à supprimer de la table source. Il suffit d'adapter ce critère paramétré avec l'expression de correspondance dynamique. Concernant la requête de suppression d'un client, aucun modèle n'existe. Nous devons donc la bâtir entièrement. Et nous proposons de commencer par cette dernière.
- En haut de la fenêtre Access, cliquer sur l'onglet Créer pour activer son ruban,
- Dans la section Requêtes du ruban, cliquer sur le bouton Création de requête,
- Dans la boîte de dialogue qui suit, sélectionner la table Clients,
- Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer,
Nous basculons ainsi dans l'
éditeur de requête Access. Nous devons transformer cette dernière. Par défaut, il s'agit d'une
requête sélection.
- Dans le ruban Créer, cliquer sur le bouton Suppression,
Nous transformons ainsi la requête classique en requête action pour supprimer des
enregistrements. Faut-il encore les définir. Et ce critère est dynamique. Il dépend de la référence choisie par l'utilisateur sur le
formulaire, par le biais de la liste déroulante. A ce titre, vous notez l'apparition d'une ligne nommée
Supprimer, dans la grille de requête. Elle permet de définir l'
opérateur de la clause WHERE, soit de la condition à remplir. Pour
supprimer un enregistrement complet, il suffit simplement de désigner le champ sur lequel la condition doit être satisfaite. Et ce champ correspond à celui de l'identifiant sélectionné depuis le formulaire.
- Dans la zone Champ, choisir le champ Client_id,
Comme vous pouvez le voir, les
zones Table et Supprimer se remplissent automatiquement. Il ne nous reste plus qu'à définir le
critère de suppression. Il dépend de l'identifiant choisi depuis le
formulaire, au moment de la demande.
- A la racine du dossier de décompression, double cliquer sur le fichier texte,
- Sélectionner intégralement l'expression de correspondance (CTRL + A) :
[Formulaires]![_F_navig_principal]![SousFormulaireNavigation].[Formulaire]![SousFormulaireNavigation].[Formulaire]!
- La copier par le raccourci clavier CTRL + C par exemple,
- Fermer le fichier texte et revenir dans l'éditeur de requête Access,
- Pour la première colonne, cliquer droit dans la zone Critères,
- Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
- Coller la syntaxe de l'expression de correspondance (CTRL + V),
- A la fin de l'expression, ajouter le nom du contrôle issu du formulaire entre crochets,
L'expression finalisée devient :
[Formulaires]![_F_navig_principal]![SousFormulaireNavigation].[Formulaire]![SousFormulaireNavigation].[Formulaire]![Id]
Comme cette
expression de correspondance est inscrite dans la
zone de critères du
champ Client_id, la
requête suppression doit éliminer l'enregistrement dont l'identifiant concorde.
- Cliquer sur le bouton Ok du générateur d'expression pour valider la syntaxe,
- Puis, enregistrer la requête (CTRL + S), sous le nom : R_Suppr_client,
- Ensuite, fermer la requête en cliquant sur la croix de son onglet,
Nous devons désormais préparer la requête permettant de supprimer dynamiquement un produit.
- Dans le volet de navigation, cliquer droit sur la requête R_Suppr_ref,
- Dans le menu contextuel, choisir Mode création,
Nous basculons dans l'éditeur de la
requête suppression. Vous notez bien la présence d'un critère paramétré posé sur le
champ produit_ref de la
clé primaire.
- Cliquer droit sur cette zone de critères,
- Puis, dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
- Sélectionner l'intégralité de la syntaxe présente (CTRL + A) et la supprimer,
- A la place, coller l'expression de correspondance issue du fichier texte,
- A la fin de la syntaxe, ajouter le nom du contrôle correspondant sur le formulaire,
La syntaxe finalisée de l'expression de correspondance dynamique devient la suivante :
[Formulaires]![_F_navig_principal]![SousFormulaireNavigation].[Formulaire]![SousFormulaireNavigation].[Formulaire]![Reference]
- Cliquer sur le bouton Ok du générateur d'expression pour revenir dans l'éditeur de requête,
- Enregistrer la requête (CTRL + S) et la fermer,
Exécuter les requêtes suppression
Ces
requêtes dynamiques doivent désormais être déclenchées depuis les formulaires respectifs, au clic sur le bouton. Souvenez-vous, ces formulaires sont utilisés dans les systèmes de navigation imbriqués et pas indépendamment. C'est la raison pour laquelle nous avons construit ces syntaxes complexes, afin d'atteindre les contrôles. Ce sont donc des
actions de macro qui doivent être générées sur évènement. Mais avant cela, nous proposons de consulter les
tables Clients et
Produits. L'objectif est de repérer les enregistrements à supprimer. Ainsi, à l'issue de l'opération, en constatant leur absence, nous pourrons confirmer que les formulaires sont fonctionnels.
- Dans le volet de navigation, double cliquer sur la table Clients pour l'ouvrir,
- Puis, atteindre la fin des enregistrements à l'aide de l'ascenseur vertical,
Nous choisirons de réaliser un test de suppression sur l'avant dernier client, reconnu par l'identifiant 46.
- Fermer la table Clients et ouvrir la table Produits,
En ligne 222, il existe un article que nous avions inséré à titre de test, dans l'exercice précédent pour aboutir les
formulaires imbriqués de création.
Sa référence est
BZXH123TT.
- Fermer la table Produits,
- Dans le volet de navigation, cliquer droit sur le formulaire F_suppr_client,
- Dans le menu contextuel, choisir Mode création,
- Sur le formulaire en conception, sélectionner le bouton Supprimer,
- Activer ensuite l'onglet Evènement de sa feuille de propriétés,
- Cliquer alors sur le petit bouton placé à droite de son évènement Au clic,
Une boîte de dialogue apparaît. Elle propose plusieurs méthodes pour enclencher des actions.
- Sélectionner Générateur de macro et cliquer sur le bouton Ok,
Nous basculons ainsi dans l'
éditeur de macro Access. Une
liste déroulante se propose pour choisir et définir les
actions à déclencher. Mais avant cela, nous devons disposer de toutes les options disponibles. Comme nous l'avons expliqué dans l'exercice précédent, l'exécution d'une
requête action déclenche des alertes système. Pour les neutraliser, nous devons paramétrer l'
action Avertissements en entête de la liste des tâches. Mais cette dernière n'est pas proposée par défaut. Nous devons activer son affichage.
- Dans le ruban Création, cliquer sur le bouton Afficher toutes les actions,
- Au centre de l'éditeur, déployer la liste déroulante,
- Choisir l'action Avertissements et conserver son attribut réglé sur Non,
- 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 requête R_Suppr_client,
- Dans la zone Mode de données, choisir Lecture seule,
Notre
macro est terminée. Et comme vous le constatez, nous ne testons pas si l'utilisateur a bien défini un identifiant. Nous pourrions le faire grâce à une
instruction conditionnelle Si. Mais ce n'est pas nécessaire. Si aucun identifiant n'est stipulé, la requête échoue car son critère ne trouve aucune correspondance. Et comme nous avons neutralisé les alertes, aucun message disgracieux n'apparaîtra.
Pour apporter confirmation à l'utilisateur, il peut néanmoins être intéressant de déclencher un message de confirmation à l'issue du traitement. Pour cela, il suffit d'ajouter et de paramétrer l'
action ZoneMessage.
Avant de tester le bon fonctionnement de cette macro, nous devons paramétrer le bouton destiné Ã
fermer le formulaire. Certes, il ne sera utile que lorsque ce dernier sera utilisé indépendamment. Dans le contexte des onglets, il suffit de basculer sur un autre outil. Mais dans le contexte de l'apprentissage des macros, ces manipulations sont intéressantes.
- Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
- De retour sur le formulaire, sélectionner le bouton Fermer Formulaire,
- Dans sa feuille de propriétés, cliquer sur le bouton de son événement Au clic,
- Dans la boîte de dialogue qui suit, choisir Générateur de macro et valider par Ok,
- Dans l'éditeur de macro, choisir l'action FermerFenêtre,
- Régler son attribut Type d'objet sur Formulaire,
- Régler son attribut Nom d'objet sur F_suppr_client,
- Définir son attribut Enregistrer sur Oui pour éviter les alertes de confirmation,
Désormais, il est temps de tester le bon fonctionnement de ce premier formulaire de suppression.
- Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
- De retour sur le formulaire, cliquer sur l'icône de la disquette dans la barre d'accès rapide,
Il est en effet nécessaire de l'enregistrer à son tour pour mettre à jour les liaisons avec les macros.
- Fermer le formulaire en cliquant sur la croix de son onglet,
- Puis, exécuter le formulaire _F_navig_principal,
- Cliquer sur son dernier onglet Outils actions,
- Taper le mot de passe administrateur abc123,
- Accéder au formulaire de suppression par l'onglet Supprimer un client,
- Avec la liste déroulante, choisir l'identifiant 46,
Comme vous le remarquez, toutes les informations attachées sont importées à titre de confirmation avant de procéder. Il s'agit bien du client Emile Feuille. C'est la
fonction Access RechDom actualisée par l'
action de macro AfficherTousEnreg qui produit ce résultat.
- Cliquer alors sur le bouton Supprimer,
Le message de confirmation surgit. Il semble attester que le processus s'est correctement déroulé.
- Valider ce message puis ouvrir la table Clients,
- Ensuite, atteindre la fin de ses enregistrements,
Comme vous le remarquez, le client Emile Feuille d'identifiant 46 a parfaitement été éliminé. Nous avons donc réussi à générer une expression de correspondance entre une
requête suppression et les
contrôles d'un formulaire imbriqués dans une
navigation à deux niveaux. En effet, nous l'avions démontré, il est beaucoup plus aisé de produire un
formulaire de suppression indépendant.
Au fil des exercices, nous finalisons le développement des outils. Notre application de gestion devient peu à peu fonctionnelle.
A titre de mise en pratique, vous devez désormais rendre fonctionnelle la suppression d'article depuis le
formulaire F_suppr_produit, dans le cadre d'une exploitation par navigation au sein du
formulaire _F_navig_principal.
Tout d'abord, vous devez engager l'action permettant de fermer le formulaire, au clic sur le deuxième bouton.
Ensuite, vous devez empiler les actions permettant de déclencher la requête suppression, au clic sur le premier bouton.
Vous ne devez pas oublier d'enregistrer le formulaire à l'issue des modifications. Après un test depuis le formulaire de navigation sur la référence
BZXH123TT, vous pourrez constater que son enregistrement est effectivement supprimé de la table source.