Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Editer la facture Client
Dans cet
exercice Access, nous proposons de finaliser l'
application consistant à facturer les clients. D'un côté, nous disposons d'un
formulaire pour construire les
commandes et les archiver. De l'autre côté, nous disposons d'un
état synthétisant les
commandes passées par les
clients. Nous devons établir la jonction précise entre les deux. A validation d'une
commande depuis le
formulaire, la
facture du client doit pouvoir être éditée par le biais de cet
état. Comme nous avons réglé de judicieux sauts de section, chaque commande est restituée sur une page indépendante. L'enjeu consiste donc à déclencher l'aperçu depuis le
formulaire, en pointant sur la bonne page.
Source et présentation de la problématique
Pour aboutir ces travaux, il convient premièrement de réceptionner l'application au dernier indice de développement.
La décompression fournit le fichier de la
base de données associé à un fichier texte. Il renferme une expression de correspondance. Cette dernière sert à atteindre les contrôles des formulaires encapsulés dans des
formulaires de navigation. Elle permet donc de produire des
critères dynamiques, notamment pour les
requêtes prélevant l'information issue de ces formulaires.
- Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access,
- Dans la boîte de dialogue qui s'impose, saisir le mot de passe d'accès : abc,
- Puis, cliquer sur le bouton Activer le contenu du bandeau de sécurité,
- Du fait de la régénération, valider de nouveau ce même mot de passe,
Le
formulaire de navigation se charge automatiquement, grâce à une
macro Access.
- Cliquer sur son onglet Facturation pour accéder au formulaire de commandes,
Comme vous le savez, c'est le
bouton Ajouter qui permet d'empiler les articles achetés. Pour cela, il faut bien sûr avoir défini un client et un article. C'est le rôle des deux listes déroulantes. Le
bouton Valider permet d'archiver la commande dans les tables liées. Désormais, à l'issue de ce traitement, il doit être proposé à l'utilisateur d'éditer la facture du client venant de passer commande.
Etat et clause Where
Deux solutions s'offrent à nous. Et nous proposons de commencer par la plus simple. Une
action de macro peut commander l'affichage d'un
état sur une page précise. C'est ce que l'on appelle une
clause Where. Littéralement, il s'agit d'un critère. Ce critère doit permettre de pointer sur le numéro de commande fraîchement créé. Comme l'état est bâti sur une requête intégrant ce numéro, il restitue automatiquement cette commande, au milieu des autres.
Néanmoins, sachez que pour mettre en place cette solution, les travaux que nous avons réalisés précédemment, ne sont pas anodins. En l'absence de
sauts de section judicieusement placés, les commandes sont mélangées et aucune ne possède d'adresse spécifique à atteindre. C'est pourquoi nous livrerons une autre solution dans un deuxième temps. Il ne vous restera plus qu'à choisir celle qui vous convient le mieux.
- Fermer le formulaire de navigation en cliquant sur la croix de son onglet,
- Dans le volet de navigation, cliquer sur la catégorie Formulaires, pour la déployer,
- Cliquer droit sur le formulaire F_Commandes,
- Dans le menu contextuel, choisir Mode création,
Il s'agit de l'outil que nous venons de commenter, accessible par le biais de l'
onglet Facturation, sur le
formulaire de navigation. Pour poursuivre son développement, nous y accédons donc indépendamment, en mode création.
- Cliquer sur le bouton Valider pour le sélectionner,
- Puis, activer l'onglet Evénement de sa feuille de propriétés,
- Cliquer alors sur le petit bouton à l'extrémité droite de son événement Au clic,
Nous basculons ainsi directement dans l'
éditeur de macro Access. En effet, de nombreuses actions lui sont déjà associées. Nous les avons implémentées au fil des
exercices sur les formulaires.
L'
édition de la facture doit être validée par l'utilisateur. L'action est donc conditionnelle. Nous devons lui adresser un message qu'il confirmera ou infirmera. En récoltant le choix cliqué, nous saurons quelle action engager.
- Tout en bas des actions, cliquer sur la liste déroulante pour la déployer,
- Dans la liste, choisir l'instruction Si,
Le bloc de l'instruction s'affiche en dessous des autres actions. La zone
Expression conditionnelle porte bien son nom. Elle doit recevoir le critère à valider. Il s'agit de la réponse à la question. Pour poser une question, nous devons déclencher une
boîte de dialogue.
Access offre une fonction dédiée.
- A droite de la zone Expression conditionnelle, cliquer sur l'icône de la baguette magique,
Nous affichons ainsi le générateur d'expression.
- Dans la liste de gauche du générateur, déployer l'élément Fonctions jusqu'à sélectionner la catégorie Fonctions intégrées,
- Dans la liste du centre, choisir la catégorie Messages,
- Dans la liste de droite, double cliquer sur la fonction BoîteMsg,
Nous avons déjà exploité cette fonction à plusieurs reprises. Elle permet d'adresser un message à l'utilisateur («prompt») par le biais d'une boîte de dialogue. Cette dernière peut offrir deux boutons (Oui et Non) en guise de réponse. Pour cela, il faut lui passer la valeur numérique 4 en deuxième argument («boutons»). Et comme il s'agit d'une fonction, elle retourne le choix cliqué, sous forme de valeur numérique. 6 correspond à Oui. 7 correspond à Non. Nous devons donc vérifier l'égalité en guise de critère.
- Remplacer l'argument «prompt» par le message suivant entre guillemets :
Souhaitez-vous éditer la facture du client ?
- Remplacer l'argument «boutons» par le chiffre 4,
- Remplacer l'argument «title» par le titre suivant entre guillemets :
Edition de la facture
- Supprimer les arguments restants sans omettre les points virgule de séparation,
- Après la parenthèse fermante, taper l'égalité suivante : =6,
L'expression du critère est terminée et la syntaxe complète est la suivante :
BoîteMsg('Souhaitez-vous éditer la facture du client ?'; 4; 'Edition de la facture')=6
Si le choix retourné vaut 6, l'utilisateur confirme l'édition de la facture. Dans ce cas, nous devons enclencher l'ouverture de l'
état avec la
clause Where.
- Valider l'expression en cliquant sur le bouton Ok du générateur,
- Déployer la liste déroulante située sous l'expression conditionnelle,
- Choisir l'action OuvrirEtat,
- Dans la zone Nom de l'état, choisir E_Clients_Commandes,
- Dans la zone Affichage, choisir Aperçu avant impression,
Il nous reste à définir la
condition Where. Il s'agit du point le plus important pour établir la correspondance exacte. L'
état doit être affiché précisément sur le numéro de commande qui vient d'être créé. Et souvenez-vous, tel que nous avons conçu les
tables, ce numéro est une
clé primaire auto-incrémentée. Cette commande est donc associée à la valeur numérique la plus grande, au moment de la demande.
Il existe une
fonction Access dédiée pour extraire ce type d'information. Elle se nomme
MaxDom et nous l'avons déjà exploitée. Sa syntaxe est la suivante :
=MaxDom('[Nom_du_champ]'; '[Nom_de_la_table]'; 'Critère')
Elle requiert donc trois arguments, sachant que le troisième est facultatif. Le premier est le
nom du champ à partir duquel nous souhaitons extraire la valeur la plus grande. Le deuxième paramètre est le
nom de la table hébergeant ce
champ. Le critère en troisième paramètre est à ignorer dans notre cas. Nous souhaitons extraire le numéro le plus grand, sans concession.
- Dans la zone Condition Where, saisir la syntaxe de correspondance suivante :
[Com_num]=MaxDom('[Com_num]'; '[Commandes]')
Nous établissons ainsi la relation entre le
champ Com_num de l'
état et sa valeur la plus grande, issue de la
table Commandes. Il doit en résulter l'affichage de l'état sur cette commande précise, identifiée par ce numéro prélevé. Aucune
branche Sinon n'est nécessaire dans cette instruction conditionnelle. Si l'utilisateur clique sur Non, la suite est implicite, aucune autre action n'est engagée.
Il est temps de tester le bon fonctionnement de cette
action de macro.
- Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
- De retour sur le formulaire en conception, cliquer sur la disquette dans la barre d'accès rapide,
En effet, il est nécessaire de l'enregistrer à son tour pour mettre à jour la liaison avec la macro modifiée. Comme vous le savez, ce formulaire n'est pas destiné à être utilisé indépendamment dans cette application.
- Fermer le formulaire F_Commandes en cliquant sur la croix de son onglet,
- Dans le volet de navigation, double cliquer sur le formulaire _F_navig_principal,
- Cliquer ensuite sur son onglet Facturation pour atteindre le formulaire des commandes,
- Choisir un identifiant client avec la première liste déroulante,
- Puis, ajouter des articles à la facture avec la seconde liste déroulante, la zone Qté achetée et le bouton Ajouter,
- Enfin, cliquer sur le bouton Valider pour archiver la commande,
- Valider la première alerte confirmant le succès du traitement,
Dans l'enchaînement, la
fonction Access BoîteMsg fait son oeuvre. Une boîte de dialogue s'affiche en effet. Elle porte la question personnalisée et offre bien deux boutons en guise de réponse.
- Cliquer sur le bouton Oui pour confirmer l'édition de la facture,
L'affichage bascule aussitôt sur l'
état en mode
Aperçu avant impression. Et comme vous pouvez le voir, il s'agit bien de la synthèse de la commande que nous venons de construire. Bref, nous avons parfaitement réussi à faire interagir les
objets Access pour automatiser la
création des commandes et produire la
facture du client dans l'enchaînement. Petite prouesse non négligeable, cette application complète et professionnelle a intégralement été conçue sans l'intervention du
code VBA Access.
Requête dynamique
Nous proposons donc d'aborder la seconde méthode toute aussi efficace. Mais surtout, elle offre l'avantage de négliger certains réglages précis, comme les
sauts de section sur l'
état. L'
état E_Clients_Commandes est construit sur la
requête R_Clients_Commandes. Cette dernière réunit toutes les informations de tables liées pour produire la synthèse de toutes les commandes archivées. C'est pourquoi en l'état, il est nécessaire d'engager une
condition Where et des sauts de section pour pointer sur la commande souhaitée.
L'idée est de définir un
critère en amont, sur le
champ Com_num de cette
requête. Il consiste à récupérer le numéro de commande le plus grand, au moment de la demande. De cette manière, les commandes étant filtrées par la requête, l'état étant bâti sur cette dernière, ne restituera que la commande concernée.
- Fermer l'état ainsi que le formulaire de navigation,
- Dans le volet de navigation, cliquer droit sur la requête R_Clients_Commandes,
- Dans le menu contextuel, choisir Mode création,
Nous basculons ainsi dans l'
éditeur de requête Access. A ce titre, nous retrouvons les nombreux champs que nous avions intégrés pour construire cette
requête de synthèse.
- Dans la zone Critères du champ Com_num, inscrire l'expression suivante :
MaxDom('[Com_num]'; '[Commandes]')
Nous exploitons donc strictement la même
fonction MaxDom afin de filtrer la sélection sur la commande dont le numéro est le plus grand. En d'autres termes, il s'agit de la dernière et donc elle correspond à la
facture à éditer au clic sur le
bouton du formulaire.
- Enregistrer les modifications (CTRL + S),
Nous devons désormais adapter l'
action de macro. La
condition Where n'est plus nécessaire en effet. Elle est réglée en amont dans cette
requête. Mais tout d'abord, nous proposons de constater l'impact indépendamment.
- Fermer la requête en cliquant sur la croix de son onglet,
- Dans le volet de navigation, double cliquer sur l'état E_Clients_Commandes,
Comme vous pouvez le voir, le rendu offert est bien celui de la dernière commande que nous avons validée. Par défaut, un état se cale sur la première.
- Fermer l'état en cliquant sur la croix de son onglet,
- Dans le volet de navigation, cliquer droit sur le formulaire F_Commandes,
- Dans le menu contextuel, choisir Mode création,
- Cliquer sur le bouton Valider pour le sélectionner,
- Dans sa feuille de propriétés, cliquer alors sur le bouton de son événement Au clic,
- Dans l'éditeur de macro, effacer la condition Where de l'action OuvrirEtat,
Nous commandons donc une ouverture simple de l'état, dont le filtre est conditionné désormais par la requête.
- Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
- De retour sur le formulaire, l'enregistrer à son tour avec la disquette de la barre d'accès rapide,
- Puis, fermer le formulaire en cliquant sur la croix de son onglet,
- Dans le volet de navigation, double cliquer sur le formulaire _F_navig_principal,
- Activer ensuite son onglet Facturation pour accéder aux commandes,
- Désigner un client avec la première liste déroulante,
- Puis, construire une commande comme précédemment,
- Ensuite, cliquer sur le bouton Valider et confirmer l'alerte de succès,
- Enfin, cliquer sur le bouton Oui de la boîte de dialogue pour éditer la facture,
C'est bien le même
état que précédemment qui est déclenché, sans
condition Where qui plus est. Mais comme vous le remarquez, son affichage s'est bien calé sur le dernier client, grâce au
critère de la requête. Il s'agit d'une autre méthode pour atteindre le même résultat, celui de l'
édition de la facture client.
Remarque : Au début de cet exercice, nous avons constaté la présence d'un fichier texte après décompression de la source. Il offre la syntaxe de correspondance pour bâtir des critères permettant d'atteindre les contrôles des formulaires encapsulés. Nous ne l'avons pas utilisé ici. Nous l'avons simplement fourni dans la mesure où une troisième méthode existe, certes moins souple. Elle consiste à bâtir la condition en récupérant les informations issues du formulaire, au moment de la demande.