formateur informatique

Valider la facture du client avec Access

Accueil  >  Bureautique  >  Access  >  Access Avancé  >  Valider la facture du client avec 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 :


Insertion d'une table à une autre

Dans cette formation Access, nous apportons la solution pour valider la facture d'un client, sans utiliser le code VBA. L'astuce va consister à exécuter une requête Action insérant tous les enregistrements d'une table temporaire dans la table archivant les commandes.

Formulaire Access pour valider la commande et archiver la facture du client

Dans la formation précédente, grâce à une requête Ajout exécutée par une action de macro, nous étions parvenus à construire la commande du client sur le formulaire.

Source et présentation de la problématique
Nous devons commencer par récupérer ces travaux. Cette base de données est constituée d'un certain nombre d'objets comme l'indique le volet sur la gauche de l'écran. Dans la formation précédente, nous avons exploité les tables Clients, Produits et Com_Temp. Cette dernière reçoit tous les articles achetés par le client. Comme nous les disions, ces enregistrements sont ajoutés tour à tour, au clic sur un bouton du formulaire, exécutant une requête Ajout.

Table Access synthétisant les commandes du client

Désormais, pour valider la facture d'un client, nous allons devoir exploiter les tables Commandes et Detail_commandes. La première synthétise chaque commande avec sa date et son montant total. Bien sûr, elle rappelle le numéro du client pour établir la relation avec la table Clients.

Table Access du détail des commandes passées par les clients

La seconde offre le détail de chacune de ces commandes. La liaison est établie grâce au numéro de commande de la table précédente (com_det). Ainsi, pour un même numéro de commande, sont énumérées les références et quantités des produits achetés.

Pour valider la facture, l'enjeu va donc consister à ajouter les éléments de synthèse dans la première table et le détail dans la seconde. L'une des problématiques consistera à récupérer le numéro de commande auto-incrémenté, pour établir la liaison entre les deux tables.

Le formulaire est donc l'interface graphique à partir de laquelle nous devons gérer les commandes des clients.
  • Dans le volet de gauche, double cliquer sur le formulaire Cli_Com pour l'exécuter,
  • Avec la première liste déroulante, choisir un numéro de client,
Comme vous le remarquez, les informations dépendantes sur le nom et le prénom sont instantanément extraites, dans les zones de saisie dédiées.
  • Avec la seconde liste déroulante, choisir une référence produit,
Là aussi, les données dépendantes sur la désignation et le prix sont rapatriées dans les zones de texte situées sur la même ligne. Comme ces informations sont issues d'une autre table, la table Produits, nous avions mis en avant une astuce tout à fait intéressante pour établir la relation. La solution avait consisté à exploiter la fonction Access RechDom.
  • Saisir un nombre entier dans la zone Qté achetée et cliquer sur le bouton Ajouter,
Comme vous le constatez, toutes les informations de l'article s'inscrivent dans le sous formulaire. C'est ainsi, au fur et à mesure des achats, que nous construisons la commande du client.
  • Sélectionner une nouvelle référence,
  • Puis, taper une autre quantité et cliquer sur le bouton Ajouter,
Le détail associé s'insère automatiquement dans la commande, en dessous du précédent. La requête exécutée, ajoute chaque enregistrement dans la table Com_Temp. Et c'est un champ calculé de la requête Com_Req qui livre le total hors taxes par article. C'est donc elle qui est utilisée comme source du sous formulaire.

Formulaire Access pour construire les factures des clients

Certes à ce stade, il n'existe pas de garde-fou pour vérifier que la quantité saisie est bien un nombre entier. De même, aucun contrôle n'est réalisé par rapport aux stocks. Mais ce n'est pas la vocation de ces formations, d'autant que nous avions apporté ces solutions dans d'autres cas pratiques.

Créer la commande du client
Désormais, au clic sur le bouton Valider, la facture du client ainsi construite doit être archivée dans les tables Commandes et Detail_commandes. Nous proposons d'apporter les solutions par étapes en réalisant l'implémentation de la table Commandes dans un premier temps. Les informations requises sont sommaires. Le numéro de commande (num_com) se crée automatiquement. Nous devons inscrire le numéro du client (cli_com), la date de facturation (date_com) et le montant de la commande (montant_com). Le champ de la date est paramétré pour inscrire la date du jour par défaut. Le numéro de client est rappelé par la première liste déroulante du formulaire. Seule l'indication sur le montant total de la commande est manquante. Elle consiste à sommer toutes les valeurs du champ THT de la requête Com_Req. Et comme cette information est utile, nous proposons de l'afficher sur le formulaire.
  • Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans la liste, choisir Mode création,
Nous basculons ainsi en conception du formulaire.
  • Déplacer les boutons Ajouter et Valider sur la droite du formulaire,
  • Sélectionner la zone de saisie de la quantité avec son étiquette,
  • Les copier (CTRL + C) puis les coller (CTRL + V),
  • Les positionner à droite sur la même horizontale,
  • Modifier le texte de l'étiquette dupliquée par : Montant total,
  • Sélectionner la zone de saisie dupliquée,
  • Activer l'onglet Toutes de sa feuille de propriétés,
  • Dans la zone Nom, saisir : Tot_Com et valider par Entrée,
Un nom d'objet explicite est toujours important. C'est par ce nom que nous piloterons le contrôle lorsqu'il s'agira d'insérer les données dans la table Commandes.
  • Activer l'onglet Données de sa feuille de propriétés,
  • Dans sa propriété Source contrôle, saisir l'expression suivante :
=RechDom('Sum(THT)';'Com_Req')

Il s'agit de la fonction Access que nous avons présentée lors du premier de ces trois volets. Elle permet d'extraire une valeur de champ à passer en premier paramètre, issue d'un enregistrement de la table passée en second paramètre (Com_Req). Le troisième argument est facultatif. Il permet de poser le critère pour isoler l'enregistrement en question. Cette condition n'est pas nécessaire ici puisque nous réalisons une opération de synthèse sur le champ THT, grâce à la fonction Access Sum ou Somme en français. Il en résulte forcément un unique enregistrement.
  • Activer l'onglet Format de sa feuille de propriétés,
  • Régler sa propriété Format sur Monétaire et Décimales sur 2,
  • Enregistrer les modifications (CTRL + S) et exécuter le formulaire (F5),
Calculer et afficher le montant total de la commande issue du sous formulaire grâce aux fonctions Sum et RechDom

Nous récupérons les traces de notre ancienne commande de test. Et instantanément, vous remarquez la présence du précieux résultat de synthèse sur le total de la commande en cours de construction. Si vous ajoutez un nouvel article, vous remarquez que son montant est comptabilisé puisque le total de la commande s'actualise automatiquement.
  • Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans la liste, choisir Mode création,
Avant de nous soucier de la requête Ajout, sur notre lancée, nous allons créer un autre contrôle précieux. Chaque nouvelle commande est identifiée par un numéro de commande auto-incrémenté qu'il nous faut réceptionner. C'est lui que nous devrons inscrire dans la table Detail_commandes pour établir le lien. L'astuce consiste à extraire le plus grand numéro sur ce champ. Et à l'instar de la fonction RechDom, Access propose la fonction MaxDom. Son utilisation est similaire. Elle requiert le nom du champ en premier paramètre, et le nom de la table en second.
  • Ajouter une zone de texte sur le formulaire, par exemple au-dessus des boutons,
  • Activer l'onglet Toutes de sa feuille de propriétés,
  • Dans la zone Nom, saisir : Num_Com et valider par Entrée,
  • Activer l'onglet Données de sa feuille de propriétés,
  • Dans sa propriété Source contrôle, saisir l'expression suivante :
=MaxDom('num_com';'Commandes')
  • Enregistrer les modifications et exécuter le formulaire,
Récupérer et afficher dernier numéro de commande incrémenté grâce à la fonction Access MaxDom

L'identifiant de la dernière commande archivée est parfaitement restitué. Vous pouvez constater sa cohérence en consultant la table Commandes en mode feuille de données. Nous devrons nous assurer qu'il s'actualise à chaque création de nouvelle commande.

Il est temps de construire la requête permettant d'ajouter les informations de synthèse dans la table Commandes. Comme nous le disions, il s'agit du numéro de client choisi dans la première liste déroulante et du montant total calculé par la fonction RechDom, dans le contrôle Tot_Com.
  • 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, cliquer sur le bouton Ajout,
  • Dans la zone Ajouter à de la boîte de dialogue qui suit, choisir la table Commandes,
  • Puis, cliquer sur le bouton Ok pour valider,
Créer une requête Ajout pour insérer les nouvelles commandes depuis le formulaire Access

Nous venons de transformer la requête sélection en requête action. Et à ce titre, dans la grille de requête, vous notez l'apparition d'une zone nommée Ajouter à.
  • Dans la première colonne, choisir le champ cli_com,
  • Dans la seconde, choisir le champ montant_com,
Définir les champs de table dans lesquels les données de la requête Ajout doivent être insérés

Pour réaliser l'insertion dynamique, nous devons bâtir les expressions de correspondances dans les zones Champ respectives.
  • 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,
  • Dans la liste de gauche, déployer l'arborescence des formulaires jusqu'à sélectionner le formulaire Cli_Com,
  • Dans la liste centrale, double cliquer sur le contrôle ref_cli pour établir la correspondance,
  • Puis, valider par Ok,
L'expression apparaît désormais dans la zone Champ pour le champ cli_com de réception :

Formulaires![Cli_Com]![ref_cli]

Elle indique explicitement que la valeur choisie dans la liste déroulante du formulaire doit être insérée dans le champ cli_com de la table Commandes.
  • Cliquer droit dans la zone Champ de la deuxième colonne,
  • Dans le menu contextuel, choisir Créer,
  • Dans la liste de gauche, déployer l'arborescence des formulaires jusqu'à sélectionner le formulaire Cli_Com,
  • Dans la liste centrale, double cliquer sur le contrôle Tot_Com pour établir la relation,
Expression dynamique de correspondance avec les contrôles du formulaire pour requête Access Ajout

L'expression ainsi construite indique que la valeur calculée dans le champ Tot_Com sera ajoutée dans le champ montant_com de la table Commandes.
  • Valider cette expression en cliquant sur le bouton Ok,
  • De retour sur l'éditeur de requête, réaliser le raccourci CTRL + S pour l'enregistrer,
  • La nommer Com_valide et cliquer sur Ok,
  • Puis, cliquer sur la croix de son onglet pour la fermer,
  • Revenir sur le formulaire en mode conception,
Nous devons désormais exécuter cette requête. Nous devons donc déclencher l'exécution d'une macro au clic sur le bouton Valider. Cette macro doit appeler la requête Com_Valide. Mais comme il s'agit d'une requête Ajout, des alertes système se déclenchent automatiquement. Pour les neutraliser, nous devons programmer une action spécifique en amont.
  • Cliquer sur le bouton Valider pour le sélectionner,
  • Activer l'onglet Evènement de sa feuille de propriétés,
  • Cliquer sur le petit bouton à l'extrémité 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 ainsi dans l'éditeur de macro Access. Il permet d'empiler les actions les unes en-dessous des autres grâce à la liste déroulante de choix.
  • Dans le ruban Création, cliquer sur le bouton Afficher toutes les actions,
Dès lors, nous avons accès aux commandes spécifiques dont celle permettant de neutraliser les alertes.
  • Dans la liste déroulante au centre de l'écran choisir l'action Avertissements,
  • Conserver son attribut Avertissements actifs sur non,
  • Dans la liste déroulante du dessous, choisir l'action OuvrirRequête,
  • Dans la zone Nom de la requête, choisir la requête Ajout Com_Valide,
  • Puis, régler le mode de données sur Lecture seule,
Action de macro Access pour déclencher exécution requête Ajout de la commande du client

Cette macro Access devra être complétée. Souvenez-vous, il s'agira d'implémenter la table Detail_commandes sur le numéro de la commande créé par la requête Ajout. Il est temps de réaliser un premier test.
  • Dans le ruban Création, 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,
Si la table Commandes est ouverte, vous devez la fermer. La requête doit en effet y accéder en mode exclusif.
  • Enfoncer la touche F5 du clavier pour exécuter le formulaire,
  • Cliquer sur le bouton Valider pour ajouter la précédente commande,
A priori, rien ne se produit. En effet, nous avons coupé les messages d'alerte. Mais l'insertion a bien eu lieu.
  • Ouvrir la table Commandes en mode feuille de données,
Nouvelle commande ajoutée dans table par marco exécutée depuis le formulaire déclenchant requête Access Ajout

La nouvelle commande a bien été créée. Nous y retrouvons le numéro du client choisi ainsi que le total calculé. Le numéro attribué a été incrémenté. Mais il n'a pas été réceptionné sur le formulaire. Nous devons ajouter une action permettant d'actualiser les données.

Ajouter tous les enregistrements d'une table
Nous devons désormais ajouter toutes les références achetées avec leur quantité dans la table Detail_commandes. A l'instar d'une boucle VBA, nous allons exploiter une technique de syntaxe Sql pour parcourir tous les enregistrements à insérer. Il s'agit d'imbriquer une requête SQL SELECT dans une requête Ajout INSERT INTO. Nous pourrions même en imbriquer une seconde afin de réceptionner en même temps le numéro de commande créé. Mais la CLAUSE UNION fonctionne mal avec Access. C'est la raison pour laquelle nous avons pris soin de créer le contrôle Num_Com sur le formulaire, afin de récupérer cette valeur. Nous allons donc procéder en deux temps.
  • 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 Fermer pour ne sélectionner aucune table,
  • Dans la section Résultats du ruban Créer, cliquer sur la flèche du bouton Affichage,
  • Dans la liste, choisir Mode SQL,
Nous basculons ainsi dans l'éditeur SQL pour construire la syntaxe de la requête Ajout multi-enregistrements.
  • Saisir la syntaxe SQL suivante :
INSERT INTO Detail_commandes (ref_det,qute_det) SELECT produit_ref,qte_achat FROM Com_Temp;

Nous insérons (INSERT INTO) dans les champs ref_det et qute_det de la table Detail_commandes, tous les enregistrements (SELECT produit_ref,qte_achat) de la table Com_Temp (FROM Com_Temp).
  • Enregistrer cette requête (CTRL + S) sous le nom Det_Valide,
  • Puis, cliquer sur la croix de son onglet pour fermer l'éditeur SQL,
  • Revenir sur le formulaire en mode conception,
  • Sélectionner le bouton Valider,
  • Puis, 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 pour ajouter de nouvelles actions à la suite. Comme nous le disions précédemment, nous devons commencer par actualiser les données après l'exécution de la première requête Ajout. L'objectif est de réceptionner le nouveau numéro de commande dans le contrôle prévu à cet effet. Ensuite, nous devons exécuter la seconde requête Ajout, celle dont nous avons bâti la syntaxe SQL.
  • Avec la liste déroulante, ajouter l'action AfficherTousEnreg,
  • Puis, ajouter l'action OuvrirRequête,
  • Dans la zone Nom de la requête, choisir la requête Ajout Det_Valide,
  • Régler le mode de données sur Lecture seule,
Macro Access pour exécuter la requête SQL ajoutant tout le détail de la commande du client dans la table liée

Des actions sont encore à prévoir. Mais il est temps de tester le fonctionnement à ce stade.
  • Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
  • De retour sur le formulaire, l'enregistrer à son tour,
  • Puis, l'exécuter à l'aide de la touche F5 du clavier,
  • Ajouter un nouvel article à la commande en cours afin de faire varier son total,
  • Puis, cliquer sur le bouton Valider,
En ouvrant la table Commandes, vous constatez comme précédemment que l'insertion s'est parfaitement déroulée.

Si vous ouvrez la table Detail_commandes, vous notez la présence de tous les articles avec leur quantité. En revanche et comme nous le disions, une information fondamentale est manquante. Il s'agit du numéro de commande de la table parent Commandes. C'est lui qui permet d'établir le lien pour restituer toutes les informations d'une commande passée par un client.
  • Sélectionner ces enregistrements par les étiquettes de ligne,
  • Puis, enfoncer la touche Suppr du clavier pour les éliminer,
  • Valider le message de confirmation et fermer la table,
Insertion de tous les enregistrements correspondants mais absence du numéro de la clé étrangère

La requête que nous devons désormais exécuter est une requête de mise à jour (UPDATE). Dans l'enchaînement de la requête Ajout, elle doit remplacer tous les zéros du champ Com_det, par la valeur mémorisée dans le contrôle Num_Com du formulaire. A ce titre, grâce à l'action AfficherTousEnreg, vous constatez qu'il s'est parfaitement actualisé.
  • En haut de la fenêtre Access, cliquer sur l'onglet Créer,
  • Dans la section Requêtes du ruban, cliquer sur le bouton Création de requête,
  • Dans la boîte de dialogue qui suit, choisir la table Detail_commandes,
  • Ajouter le champ Com_det à la grille de requête,
  • Dans le ruban Créer, cliquer sur le bouton Mise à jour,
De fait, la ligne Mise à jour apparaît dans la grille de requête. Cette actualisation doit intervenir pour remplacer toutes les valeurs définies à zéro dans le champ Com_det.
  • Dans la zone Critères, taper le chiffre 0,
Et cette mise à jour doit insérer le numéro de commande inscrit dans le champ Num_Com du formulaire. Nous allons donc de nouveau exploiter le générateur d'expression pour établir la correspondance.
  • Réaliser un clic droit dans la zone Mise à jour,
  • Dans la liste de gauche du générateur d'expression, sélectionner le formulaire Cli_Com,
  • Dans la liste centrale, double cliquer sur le contrôle Num_Com,
Nous bâtissons ainsi l'expression de correspondance pour la mise à jour des données sur la table Detail_commandes :

Formulaires![Cli_Com]![Num_Com]
  • Cliquer sur le bouton Ok pour valider l'expression,
  • Enregistrer la requête sous le nom Det_Maj,
Nous aurions aussi pu la créer directement par l'éditeur SQL. Si vous l'affichez, il donne la syntaxe de la requête ainsi construite :

UPDATE Detail_commandes SET Detail_commandes.com_det =[Formulaires]![Cli_Com]![Num_Com] WHERE (((Detail_commandes.com_det)=0));

Vous pouvez noter la présence de la clause WHERE pour respecter le critère posé.

Requête Access pour mettre à jour dynamiquement le numéro de commande dans la table liée

Nous devons désormais exécuter cette requête dans l'enchaînement des actions de la macro.
  • Cliquer sur la croix de son onglet pour fermer la requête,
  • Revenir sur le formulaire en mode conception,
  • Sélectionner le bouton Valider,
  • Cliquer sur le bouton de son évènement Au clic pour rejoindre l'éditeur de macro,
  • Ajouter l'action OuvrirRequête,
  • Dans la zone Nom de la requête, choisir la requête Update Det_Maj,
  • Régler le mode de données sur Lecture seule,
  • Dans le ruban, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
  • De retour sur le formulaire, l'enregistrer à son tour puis l'exécuter,
  • Ajouter un article à la commande puis cliquer sur le bouton Valider,
Aucune alerte n'intervient. Le dernier numéro de commande s'actualise sur le formulaire.

Insertion dans table liée de tout le détail de la commande du client par action de macro depuis formulaire Access

Si vous ouvrez la table Detail_commandes, vous constatez que tous les enregistrements ont parfaitement été insérés. Et cette fois, grâce à la requête de mise à jour, ils sont liés au numéro de commande de la table parente Commandes.

Pour parfaire l'application, il conviendrait d'exécuter une dernière requête à la suite des actions. Une fois la facture validée, il convient en effet de vider la table Com_Temp. Il s'agit d'une requête Suppression à la syntaxe SQL fort simple :

DELETE * FROM Com_Temp;

Quoiqu'il en soit, l'objectif de cette formation est atteint. Il consistait à démontrer qu'il était possible d'insérer tous les enregistrements d'une table dans une autre, par requêtes Sql, afin de contourner le code VBA.

 
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