Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Facturer les clients
Dans l'
exercice Access précédent, nous avons réussi à construire la
commande d'un client. Chaque article acheté se greffe à la suite des autres dans le
sous-formulaire. Désormais, nous devons valider cette commande. Tout le détail des achats est inséré dans une table temporaire, grâce à une
requête Ajout, exécutée par
action de macro, au
clic sur le bouton.
La
table Commandes doit recevoir la synthèse. Il s'agit du montant total et de la date de la commande. De fait, un nouveau numéro de commande est automatiquement attribué, grâce à la
clé primaire auto-incrémentée. Ce numéro doit être réceptionné pour créer toutes les lignes dépendantes dans la table liée
Detail_commandes. Elle doit recevoir l'information détaillée sur chaque article acheté.
Base de données source
Avant de poursuivre les travaux, nous devons commencer par réceptionner l'application au dernier indice.
La décompression offre le fichier de la
base de données accompagné d'un fichier texte. Celui-ci renferme la syntaxe de correspondance nécessaire pour atteindre les
contrôles du formulaire. Souvenez-vous, ce dernier est inscrit dans une
navigation à onglets. De fait, il est considéré comme un sous formulaire et non comme le formulaire parent.
- Double cliquer sur la base de données pour l'ouvrir dans Access,
- Saisir le mot de passe d'accès : abc, puis valider,
- Cliquer sur le bouton Activer le contenu du bandeau de sécurité,
- Saisir de nouveau le mot de passe : abc, du fait de la régénération,
Le
formulaire de navigation principal se propose par défaut. Il regroupe tous les outils de gestion de cette application. Ils sont accessibles par les onglets respectifs.
- Cliquer sur l'onglet Facturation pour afficher son formulaire,
- A l'aide de la première liste déroulante, choisir un identifiant client,
Toutes les informations attachées sont instantanément rapatriées dans les contrôles prévus à cet effet.
- Avec la seconde liste déroulante, choisir un code article,
Tout le détail du produit désigné est aussitôt importé et affiché.
- Saisir une quantité achetée et cliquer sur le bouton Ajouter,
Le détail de l'article est immédiatement inscrit dans le
sous-formulaire. La commande est en cours de construction. C'est une
requête avec un
champ calculé qui sert de source de données. C'est la raison pour laquelle nous profitons du résultat de synthèse en bout de ligne. Il s'agit du total hors taxes pour l'article, selon la quantité achetée.
- Avec la seconde liste déroulante, choisir un nouvel article,
- Saisir une autre quantité et cliquer sur le bouton Ajouter,
Ce deuxième produit s'ajoute à la commande en dessous du précédent. Vous notez la présence de l'information de synthèse, au-dessus du sous formulaire, à droite de la quantité achetée. Elle se met à jour à chaque achat et renseigne sur le total hors taxes de la commande en cours. Ce résultat est précieux pour archiver les données.
Désormais, c'est un clic sur le
bouton Valider qui doit enclencher les actions permettant d'archiver la
facture du client.
- En haut du volet de navigation, double cliquer sur la table Commandes pour l'afficher,
Elle est vide à ce stade. Nous n'avons pas encore facturé de client. L'information sur le montant total doit être enregistrée, dans le
champ Com_montant. Pour établir la liaison avec la table Clients, le numéro du client doit être rappelé dans le
champ Com_client. Il est connu, il s'agit de l'identifiant choisi depuis le formulaire à l'aide de la première liste déroulante. La date s'inscrit automatiquement et le numéro de la commande s'auto-incrémente.
- Dans le volet de navigation, double cliquer sur la table Detail_commandes,
Naturellement, elle est vide elle aussi. Cette
table offre tout le détail des articles achetés, pour le numéro de commande à rappeler, issu de la
table Commandes. Dans les
exercices sur les tables, nous avions fractionné l'information et relié ces tables entre elles, grâce aux
clés primaires et étrangères.
Nous devons y inscrire la référence de l'article ainsi que la quantité achetée, pour tous les produits de la commande. Ils sont tous enregistrés dans la
table Com_temp, qui par le biais de sa
requête, restitue les données dans le
sous formulaire. Mais cette inscription doit se faire avec le numéro de commande (Det_com) fraîchement créé dans la
table parente Commandes. Nous allons donc devoir être en mesure de le récupérer à la volée.
Créer la commande
Nous sommes en phase d'entraînement et de développement. Nous proposons de procéder par étapes. Dans un premier temps, nous souhaitons créer la synthèse de la commande dans la
table Commandes. Nous verrons ensuite comment récupérer son numéro pour créer le détail attaché à la commande. Cela signifie que nous serons obligés de supprimer manuellement nos essais, tant que le processus complet d'insertion n'est pas bouclé.
Premièrement, une
requête Ajout est nécessaire. Elle doit réceptionner dynamiquement deux informations sur le formulaire : L'identifiant du client à facturer et le montant total de la commande. Les noms des contrôles respectifs sont
Id et
Montant. C'est par ces noms d'objets que nous pouvons établir la liaison. Mais souvenez-vous, le formulaire est encapsulé dans une
navigation à onglets. Pour les atteindre, nous devons descendre la hiérarchie des objets les encapsulant. Donc, la syntaxe du fichier texte, situé à la racine du dossier de décompression, est nécessaire.
- Fermer les deux tables ainsi que le formulaire de navigation,
- 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, cliquer sur le bouton Fermer pour n'ajouter aucune table,
- Dans le ruban Créer de l'éditeur de requête, cliquer sur le bouton Ajout,
- Dans la boîte de dialogue qui apparaît, désigner la table Commandes,
Nous spécifions ainsi la table à enrichir d'un nouvel enregistrement, celui de la nouvelle commande.
- Cliquer sur le bouton Ok pour confirmer ce réglage,
La ligne
Ajouter à apparaît dans la grille de requête. Elle atteste que nous avons bien transformé la requête en
requête insertion. Nous devons l'exploiter pour définir les champs de réception de la
table Commandes.
- Dans la zone Ajouter à de la première colonne, définir le champ Com_client,
- Dans la deuxième colonne, définir le champ Com_montant,
Désormais, nous devons bâtir les expressions de correspondance associées. Ces syntaxes doivent être composées dans la
zone Champ pour chacun d'eux.
- A la racine du dossier de décompression, ouvrir le fichier texte,
- Sélectionner toute la syntaxe (CTRL + A) et la copier (CTRL + C),
- Puis, revenir dans l'éditeur de requête Access,
- Cliquer droit dans la zone Champ de la première colonne,
- Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
- Y coller (CTRL + V) la syntaxe précédemment copiée,
- La compléter avec le nom du champ correspondant entre crochets, soit : [Id],
- Valider l'expression de correspondance en cliquant sur le bouton Ok du générateur,
La première syntaxe que nous avons bâtie, est donc la suivante :
Formulaires![_F_navig_principal]![SousFormulaireNavigation].[Formulaire]![Id]
Nous devons maintenant établir la correspondance pour le deuxième champ.
- Cliquer droit dans la zone Champ de la deuxième colonne,
- Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
- Coller (CTRL + V) la syntaxe précédemment copiée,
- Puis, la compléter avec le nom du champ correspondant entre crochets, soit : [Montant],
- Valider l'expression en cliquant sur le bouton Ok du générateur,
La synaxe complète pour cette seconde liaison dynamique est donc la suivante :
Formulaires![_F_navig_principal]![SousFormulaireNavigation].[Formulaire]![Montant]
- Enregistrer la requête (CTRL + S) sous le nom : R_Ajout_Com,
- Puis, la fermer 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,
- Dans la vue en conception, cliquer sur le bouton Valider pour le sélectionner,
- Activer ensuite l'onglet Evènement de sa feuille de propriétés,
- Cliquer alors sur le petit bouton placé à l'extrémité droite de son évènement Au clic,
- Dans la boîte de dialogue qui suit, choisir Générateur de macro et valider par Ok,
Nous basculons donc dans l'
éditeur de macro Access. Une liste déroulante se propose pour définir les actions à enclencher au clic sur ce bouton. Mais comme vous le savez, l'une d'entre elles n'est pas disponible par défaut. Elle consiste à neutraliser les alertes système déclenchées par l'exécution des
requêtes action. Pour l'obtenir, nous devons actionner un bouton du
ruban Création.
- Dans le ruban Création, cliquer sur le bouton Afficher toutes les actions,
- Ensuite, dérouler la liste des actions dans l'éditeur,
- Choisir l'action Avertissements et conserver son attribut Avertissements actifs sur Non,
- Déployer alors la liste déroulante du dessous,
- Puis, choisir l'action OuvrirRequête,
- Dans la zone Nom de la requête, choisir R_Ajout_Com,
- Puis, régler l'attribut Mode Données sur Lecture seule,
Comme vous le savez, la macro est loin d'être terminée. Des outils sont manquants. Mais nous souhaitons réaliser le premier test.
- Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
- De retour sur le formulaire, cliquer sur la disquette dans la barre d'accès rapide,
Vous pouvez aussi réaliser le
raccourci clavier CTRL + S. Il est essentiel de mettre à jour la liaison opérée entre le bouton et la macro.
- Fermer le formulaire F_Commandes,
- Puis, double cliquer sur le formulaire _F_navig_principal pour l'ouvrir,
- Cliquer sur son onglet Facturation pour dresser la première commande,
- Choisir un identifiant client avec la première liste déroulante,
- Puis, ajouter quelques articles à la commande,
- Enfin, cliquer sur le bouton Valider pour la créer,
- Dans le volet de navigation, double cliquer sur la table Commandes pour l'ouvrir,
La
table était vide jusqu'alors. Et comme vous le remarquez, une nouvelle ligne a été créée. Elle rappelle bien l'identifiant sélectionné depuis le
formulaire et le montant total consolidé de la commande. Un numéro lui a été attribué. C'est lui que nous devons désormais récupérer pour créer le détail de la commande et le lier.
Cette commande est orpheline. Nous ne pouvons pas la conserver.
- Cliquer droit sur son étiquette de ligne,
- Puis, choisir Supprimer l'enregistrement dans le menu contextuel,
- Valider le message d'avertissement et fermer la table,
Récupérer le dernier numéro de commande
L'idée consiste à créer une
requête de mise à jour capable de réceptionner le dernier numéro de commande. Pour cela, elle doit exploiter la
fonction MaxDom. Elle retourne la valeur numérique la plus grande d'un champ spécifié en premier paramètre, d'une table désignée en second paramètre. Cette valeur doit être insérée dans le
champ produit_numC pour tous les
enregistrements de la
table Com_Temp. Ainsi, chaque ligne du détail de la commande sera associée à un numéro. Il s'agira enfin de l'exploiter pour archiver le détail dans la table dépendante.
- Fermer le formulaire de navigation principal,
- En haut de la fenêtre Access, cliquer sur l'onglet Créer,
- Cliquer alors sur le bouton Création de requête,
- Dans la boîte de dialogue qui suit, sélectionner la table Com_Temp,
- Dans le ruban Créer de l'éditeur de requête, cliquer sur le bouton Mise à jour,
Ainsi, nous transformons la requête en requête action de mise à jour des enregistrements existants. A ce titre, la ligne
Mise à jour vient se greffer dans la grille de requête. La seule colonne qui doit être adaptée suite à la création de la commande, est celle du
champ produit_numC.
- Dans la zone Champ de la première colonne, sélectionner le champ champ produit_numC,
- Ensuite, cliquer droit dans sa zone Mise à jour,
- Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
- Débuter la syntaxe en tapant le nom de la fonction suivi d'une parenthèse, soit : MaxDom(,
- Ouvrir les guillemets ('),
- Dans la liste de gauche, déployer l'arborescence jusqu'à sélectionner la table Commandes,
- Dans la liste du centre, double cliquer sur le champ Com_num,
- Fermer les guillemets et taper un point-virgule pour passer dans le second argument,
- Ouvrir les guillemets et saisir le nom de la table entre crochets : [Commandes],
- Fermer les guillemets et finir l'expression en fermant la parenthèse de la fonction MaxDom,
Comme nous ne posons aucun critère, cette mise à jour est censée s'opérer pour tous les enregistrements de la
table Com_Temp.
- Valider l'expression en cliquant sur le bouton Ok du générateur,
MaxDom('[Commandes]![Com_num]';'[Commandes]')
- Enregistrer la requête (CTRL + S) sous le nom : R_Maj_NumC,
- Puis, la fermer en cliquant sur la croix de son onglet,
Il s'agit maintenant de l'exécuter au clic sur le
bouton Valider, à la suite des précédentes actions.
- Ouvrir le formulaire F_Commandes en mode création,
- Sélectionner le bouton Valider,
- Puis, cliquer sur le petit bouton de son événement Au clic dans la feuille de propriétés,
Nous sommes de retour dans l'éditeur de macro pour compléter les actions associées au bouton de validation.
- Déployer la liste déroulante située sous la dernière action,
- Choisir l'action OuvrirRequête,
- Dans la zone Nom de la requête, choisir R_Maj_NumC,
- Puis, régler l'attribut Mode Données sur Lecture seule,
- Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
- De retour sur le formulaire, cliquer sur la disquette de la barre d'accès rapide,
- Fermer alors le formulaire en cliquant sur la croix de son onglet,
- Exécuter le formulaire _F_navig_principal,
- Cliquer sur son onglet Facturation pour atteindre le formulaire des commandes,
- Choisir un identifiant client à l'aide de la première liste déroulante,
- Puis, ajouter quelques articles,
Les précédents sont toujours présents pour l'instant. Tant que la commande n'est pas complètement validée, nous n'avons aucune raison de vider cette table temporaire.
- Enfin, cliquer sur le bouton Valider,
Si vous ouvrez la
table Commandes, vous constatez la présence de l'enregistrement en bonne et due forme comme précédemment.
Si vous ouvrez la
table Com_Temp, vous remarquez que toutes les lignes sont désormais associées au numéro de commande précédemment créé.
- Supprimer l'enregistrement de la table Commandes,
- Puis, fermer les tables et le formulaire de navigation,
Nous disposons désormais de toutes les informations pour valider la facture.
Archiver la facture client
Deux
requêtes sont encore nécessaires. La première doit insérer dans la
table Detail_commandes, toutes les informations de la
table Com_Temp. Et pour sa mise en oeuvre, nous proposons d'exploiter le
langage Sql que nous avions découvert à l'occasion d'exercices. Il s'agit d'imbriquer une
requête sélection (SELECT) dans une
requête ajout (INSERT INTO). Sans
clause Where, tous les enregistrements seront considérés, un peu comme le ferait une
boucle de programmation en VBA. La seconde doit purger la
table Com_Temp, une fois la facture validée. Ainsi, une nouvelle facture vierge pourra être construite. Nous devons donc créer une
requête suppression.
- En haut de la fenêtre Access, cliquer sur l'onglet Créer,
- Dans son ruban, cliquer sur le bouton Création de requête,
- Dans la boîte de dialogue qui suit, cliquer sur le bouton Fermer pour n'ajouter aucune table,
- Tout à fait à gauche du ruban Créer, cliquer sur le bouton SQL,
Nous basculons ainsi dans la vue de l'éditeur SQL.
- A la place du début de syntaxe proposé, saisir l'expression suivante :
INSERT INTO Detail_commandes(Det_com,Det_ref,Det_qte) SELECT produit_numC,produit_ref,qte_achat FROM Com_Temp;
Nous exploitons donc les mots clés
INSERT INTO pour initier une
requête Ajout. Selon la construction imposée, l'énumération des champs à renseigner doit suivre. Nous les listons entre parenthèses, séparés les uns des autres par une virgule. Ensuite, nous définissons les valeurs à y inscrire. Nous remplaçons l'habituelle
clause VALUES par une requête sélection. Dans le même ordre, elle désigne les champs correspondants de la
table Com_Temp. Une fois encore, comme aucune
clause WHERE n'est définie, tous les enregistrements seront passés en revue et insérés.
- Enregistrer cette requête sous le nom : R_Ajout_Detail,
- Puis, la fermer en cliquant sur la croix de son onglet,
- Cliquer de nouveau sur l'onglet Créer en haut de la fenêtre Access,
- Dans le ruban, cliquer sur le bouton Création de requête,
- Dans la boîte de dialogue qui suit, sélectionner la table Com_Temp,
- Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer,
- Dans le ruban Créer, cliquer sur le bouton Suppression pour transformer la requête,
En l'absence de précision supplémentaire et notamment de critère, soit de
clause WHERE, tous les enregistrements sont susceptibles d'être supprimés.
- Enregistrer la requête sous le nom : R_Suppr_Com,
- Puis, la fermer en cliquant sur la croix de son onglet,
- Revenir sur le formulaire F_Commandes en mode conception,
- Sélectionner le bouton Valider,
- Cliquer sur le bouton de son événement Au clic, dans la feuille de propriétés,
- Dans l'éditeur de macro, ajouter l'action OuvrirRequête,
- Dans la zone Nom de la requête, choisir R_Ajout_Detail,
- Régler l'attribut Mode Données sur Lecture seule,
- Ajouter de nouveau l'action OuvrirRequête,
- Dans la zone Nom de la requête, choisir R_Suppr_Com,
- Régler son attribut Mode Données sur Lecture seule,
- Ajouter l'action AfficherTousEnreg pour actualiser les enregistrements,
- Ajouter enfin l'action ZoneMessage,
- Dans l'attribut Message, saisir le texte : La facture a été validée avec succès,
- Régler son attribut Bip sur Non,
- Puis, saisir le titre suivant : Succès,
Il ne nous reste plus qu'à tester. Mais avant cela, toutes les modifications doivent être enregistrées.
- Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
- De retour sur le formulaire, cliquer sur la disquette de la barre d'accès rapide,
- Puis, fermer le formulaire en cliquant sur la croix de son onglet,
- Exécuter alors le formulaire _F_navig_principal,
- Cliquer sur son onglet Facturation pour accéder aux commandes,
- Choisir un identifiant client,
- Ajouter quelques articles,
- Enfin, cliquer sur le bouton Valider,
Comme vous le constatez, le message de confirmation de la macro surgit aussitôt.
Le
sous formulaire apparaît complètement vierge, attestant que la
table Com_Temp a bien été vidée à l'issue du traitement.
- Valider la boîte de dialogue de confirmation,
- Double cliquer sur la table Commandes pour afficher son contenu,
- Cliquer sur le symbole plus (+) Ã gauche de l'enregistrement,
Cette action a pour effet de déployer l'affichage afin d'accéder à ses dépendances. Et comme vous pouvez le voir, tout le
détail de la commande a parfaitement été inséré, rattaché à la commande par le numéro précédemment attribué. Ce numéro, vous pouvez le visualiser en ouvrant la
table Detail_commandes.
Bref, nous sommes parvenus à gérer la
facturation des clients, sans l'intervention du code VBA, par interactions entre les différents
objets Access. Nous avons exploité les
tables, les
formulaires, les
requêtes de différentes natures et les
macros sur événement.