Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Actualiser les stocks après commandes
Ce dernier
exercice Access sur la facturation client doit permettre de développer une fonctionnalité importante et manquante. Après chaque
commande , il est naturellement nécessaire d'actualiser les
quantités en stock des articles achetés. Ce mécanisme n'est pas une mince affaire. Il doit intervenir à validation de la facture et doit se substituer au
code VBA . Il s'agit de passer en revue toutes les quantités des articles achetés, pour réaliser la mise à jour des produits correspondants dans la table d'origine.
Source et présentation de la problématique
Les outils développés au cours des exercices précédents doivent tout d'abord être réceptionnés.
La décompression offre le fichier de la
base de données . Celui-ci est accompagné d'un fichier texte. Et ce dernier archive la syntaxe de correspondance nécessaire dans les expressions, pour atteindre les contrôles des sous formulaires de navigation. Nous l'exploiterons donc.
Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access ,
Dans la boîte de dialogue qui se déclenche, taper le mot de passe : abc ,
Cliquer alors sur le bouton Activer le contenu du bandeau de sécurité,
Du fait de la régénération, saisir de nouveau le mot de passe et valider,
Tel que nous avons configuré cette application, le formulaire principal de navigation se charge à l'ouverture. Il regroupe tous les outils de gestion, accessibles par des onglets respectifs.
Cliquer sur le quatrième onglet intitulé Facturation ,
Nous accédons ainsi auformulaire permettant de construire les commandes des clients.
Le principe consiste à désigner un client avec la première liste déroulante, choisir des articles avec la seconde, renseigner les quantités achetées et cliquer sur le
bouton Ajouter . C'est ainsi que la commande s'implémente au fur et à mesure, du détail des produits achetés, dans le
sous-formulaire . A l'issue, l'utilisateur clique sur le
bouton Valider . Et c'est à ce moment que la validation de la facture du client intervient.
Tout ce mécanisme a été testé et approuvé. Mais à ce stade, malgré les stocks renseignés, ceux-ci ne sont pas mis à jour, suite aux achats.
Le principe pourrait consister à actualiser le stock de l'article acheté à chaque clic sur le
bouton Ajouter . Il suffirait d'enclencher une
requête mise à jour prélevant la référence du produit à actualiser. Cette idée est simple à mettre en place, mais elle est dangereuse. Tant que la commande n'est pas validée, rien n'empêche qu'elle soit abandonnée. Dans ce cas, si les stocks ont été mis à jour en amont, ils deviennent faussés.
Mémoriser les quantités achetées
Cette actualisation doit donc intervenir au moment du clic sur le
bouton Valider . De fait, nous devons être en mesure d'archiver temporairement toutes les quantités et références respectives. C'est la raison pour laquelle une nouvelle table a été ajoutée. Elle se nomme
Stock_Temp .
Elle attend deux informations : La référence et la quantité pour chaque article en cours de commande. A validation, c'est donc globalement qu'ils doivent être traités. Nous devons être en mesure de bâtir une fameuse requête, capable de
mettre à jour les stocks dans la
table Produits en fonction des informations de tous les enregistrements stockés dans la
table Stock_Temp .
Mais avant cela, nous devons bâtir une
requête Ajout . A chaque clic sur le
bouton Ajouter , elle doit insérer dans la
table Stock_Temp , la référence et la quantité de l'article acheté.
Fermer les tables et formulaires ouverts,
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 suit, désigner la table Stock_Temp avec la liste déroulante,
Puis, cliquer sur le bouton Ok pour valider ces réglages,
Nous venons de transformer une requête classique en requête insertion. Et à ce titre, vous notez l'apparition de la ligne
Ajouter à dans la grille de requête.
Sur cette ligne, Ajouter les champs Stock_ref et Stock_qte dans les deux premières colonnes,
Une liste déroulante propose ces champs. Ils sont issus de la table désignée et donc, ils sont reconnus.
Dans le
champ Stock_ref , nous devons ajouter la référence de l'article désigné depuis le formulaire, par le biais de la seconde liste déroulante. Cette liste se nomme
Reference . C'est par ce nom d'objet que nous allons pouvoir bâtir l'expression de correspondance. Dans le
champ Stock_qte , nous devons inscrire la nouvelle valeur du stock, après achat. Le stock en cours est renseigné sur le formulaire dans le contrôle nommé
Stock . La quantité achetée est inscrite dans le contrôle nommé
Qte . Nous devons faire la différence entre les deux valeurs qu'ils contiennent.
Pour bâtir les expressions de correspondance, nous avons besoin de prélever la syntaxe archivée.
A la racine du dossier de décompression, double cliquer sur le fichier texte,
Sélectionner toute la syntaxe par le raccourci clavier CTRL + A par exemple,
La copier (CTRL + C) et 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 ,
Coller (CTRL + V) la syntaxe précédemment copiée,
Puis, la compléter avec le nom du champ correspondant entre crochets : [Reference] ,
La syntaxe complète est donc la suivante :
Formulaires![_F_navig_principal] ![SousFormulaireNavigation].[Formulaire]![Reference]
Comme elle est inscrite pour le
champ Stock_ref , elle sert à y inscrire la référence article prélevée depuis le formulaire.
Valider cette expression en cliquant sur le bouton Ok du générateur,
Puis, cliquer droit dans la zone Champ de la deuxième colonne,
Choisir Créer pour déclencher de nouveau le générateur d'expression ,
Coller (CTRL + V) l'expression de correspondance,
La compléter avec le nom du contrôle pour le stock, soit : [Stock] ,
Taper le symbole moins (-) du pavé numérique pour enclencher la soustraction,
Coller de nouveau l'expression de correspondance,
Et la compléter avec le nom du contrôle pour la quantité achetée, soit : [Qte] ,
La syntaxe complète est donc la suivante :
Formulaires![_F_navig_principal] ![SousFormulaireNavigation].[Formulaire]![Stock] - Formulaires![_F_navig_principal] ![SousFormulaireNavigation].[Formulaire]![Qte]
Comme elle est inscrite pour le
champ Stock_qte , elle doit y insérer la nouvelle quantité restante, après achat, pour l'article référencé en première colonne.
Valider l'expression en cliquant sur le bouton Ok du générateur,
Puis, enregistrer la requête (CTRL + S) sous le nom : R_NV_Stocks ,
Ensuite, cliquer sur la croix de son onglet pour la fermer,
Nous devons désormais déclencher son exécution à chaque fois qu'un article est commandé. L'évènement associé est donc le clic sur le
bouton Ajouter du
formulaire .
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 du formulaire, sélectionner le bouton Ajouter ,
Activer alors l'onglet Evènement de sa feuille de propriétés ,
Puis, cliquer sur le petit bouton à l'extrémité droite de son évènement Au clic ,
Du fait de la présence d'actions déjà associées, nous basculons directement dans l'
éditeur de macro .
Tout en bas de ces actions, déployer la liste déroulante,
Choisir l'action OuvrirRequête ,
Dans la zone Nom de la requête , sélectionner R_NV_Stocks ,
Puis, régler son attribut Mode données sur Lecture seule ,
En déclenchant l'exécution de cette
requête Ajout à chaque clic sur le bouton, nous sommes censés archiver les nouvelles quantités à mettre à jour dans les stocks. Mais cette action n'est pas correctement placée dans la chronologie. Elle doit intervenir dans la
branche Alors de l'
instruction conditionnelle du dessus.
Cliquer et glisser son bloc au-dessus de l'action AfficherTousEnreg ,
L'adaptation de la macro est terminée. Il convient désormais de la tester.
Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer ,
De retour sur le formulaire, l'enregistrer par le raccourci clavier CTRL + S par exemple,
Fermer ensuite ce formulaire qui n'est pas destiné à être exploité seul,
Dans le volet de navigation, double cliquer sur le formulaire _F_navig_principal ,
Activer son onglet Facturation pour atteindre son formulaire,
Choisir une référence Client avec la première liste déroulante,
Puis, ajouter des articles à la commande en spécifiant la référence par la seconde liste déroulante, en indiquant la quantité et en cliquant sur le bouton Ajouter,
A l'issue de cette simulation, double cliquer sur la table Stock_Temp ,
Comme vous pouvez le voir, tous les articles commandés sont référencés avec leur nouveau stock respectif à mettre à jour.
L'étape intermédiaire est donc aboutie avec succès.
Mettre à jour une table selon une autre table
Tout le défi consiste donc désormais à réussir l'actualisation dans la
table finale Produits , de tous les produits en attente. Avec le
code VBA Access , il s'agit d'une formalité. Il suffit d'engager une boucle de programmation parcourant l'ensemble des articles concernés. Mais justement ici, l'idée du
code VBA est exclue. Nous devons engager une
requête Mise à jour capable d'actualiser tous les produits, selon les références stockées dans la table temporaire. Et c'est une fois encore le
langage SQL qui offre la solution. Nous l'avions mis à contribution pour
valider la facture en insérant tous les nouveaux enregistrements de la commande.
Fermer la table et le formulaire ouverts,
Cliquer sur l'onglet Créer en haut de la fenêtre Access ,
Dans la section Requêtes, 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 ,
Dans l'éditeur SQL, remplacer le fragment de syntaxe par la suivante :
UPDATE Produits AS p SET p.produit_stock = DLookUp("[Stock_qte]","[Stock_Temp]","[Stock_ref]='" & p.produit_ref & "'");
Pour une requête de mise à jour, nous débutons naturellement l'expression par le mot clé
Update . Celui-ci est nécessairement suivi du nom de la table à actualiser, soit
Produits . Notez l'emploi de la
clause As pour lui attribuer un nom. Cette table est désormais reconnue par la lettre p. Cette technique permet de contourner toute ambiguïté. En effet, le critère est posé sur une autre table à partir de laquelle il s'agit de pointer sur ses champs. Le
mot clé SET permet alors d'initier la clause de mise à jour. Et celle-ci est soumise à condition. Tous les articles ne doivent pas être actualisés. Seuls sont concernés les références archivées dans la table temporaire avec leur quantité respective. Le champ de réception concerné est
produit_stock . Et pour indiquer sa nouvelle valeur, nous exploitons la
fonction Access DLookUp . En français, son équivalent est
RechDom . Et nous connaissons bien cette fonction désormais. En
SQL , elle doit être exprimée en anglais. En premier paramètre, nous lui indiquons le champ de la valeur à prélever. En second paramètre, nous désignons sa table. Et bien sûr, une condition est nécessaire en troisième argument pour faire correspondre les références. Et ce critère est construit par concaténation afin d'établir l'égalité avec l'information dynamique du
champ produit_ref . Notez la présence des simples côtes dans les guillemets pour bien l'encadrer.
Enregistrer cette requête sous le nom R_Maj_Stocks_Produits ,
Dans le ruban Créer, cliquer sur la flèche du bouton Affichage ,
Dans la liste, choisir Mode création ,
Nous basculons ainsi dans l'
éditeur de requête Access . Et à ce titre, il est intéressant de constater que nous aurions pu la bâtir manuellement, pour contourner le
langage Sql .
Comme vous pouvez le voir, il s'agit bien d'une
requête Mise à jour . C'est bien le
champ produit_stock qui est désigné pour être actualisé. Et cette actualisation sous contrainte s'effectue donc grâce à la
fonction RechDom . Grâce à elle, bien que tous les enregistrements de la table de destination soient passés en revue, seuls ceux pour lesquels les références concordent seront actualisés.
Une dernière requête triviale est nécessaire. A chaque fois qu'une facture est validée, nous prenons soin de vider la
table Com_Temp . C'est une requête suppression déclenchée par action de macro qui s'en charge. Désormais, nous devons faire de même pour vider la
table Stock_Temp .
Cliquer sur la croix de l'onglet pour fermer la requête en cours,
Cliquer ensuite sur l'onglet Créer en haut de la fenêtre Access ,
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 Stock_Temp ,
Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer ,
Dans le ruban Créer, cliquer sur le bouton Suppression ,
En l'absence de contraintes, tous les enregistrements sont concernés par cette suppression. Il est donc nullement nécessaire de désigner un quelconque champ. D'ailleurs, si vous consultez la
syntaxe SQL attachée :
DELETE * FROM Stock_Temp , vous constatez que la
requête est déjà prête à procéder.
Enregistrer cette requête sous le nom : R_Suppr_Stocks ,
Puis, cliquer sur la croix de son onglet pour la fermer,
Dans le volet de navigation, cliquer droit sur le formulaire F_Commandes ,
Dans le menu contextuel, choisir de l'ouvrir en mode création ,
Dans la vue en conception, sélectionner le bouton Valider ,
Activer alors l'onglet Evènement de sa feuille de propriétés ,
Puis, cliquer sur le petit bouton associé à son événement Au clic ,
Nous sommes de retour dans l'
éditeur de macro Access pour compléter les actions enclenchées jusqu'alors.
Tout en bas des actions, déployer la liste déroulante,
Choisir l'action OuvrirRequête ,
Puis, désigner la requête R_Maj_Stocks_Produits en lecture seule,
Déployer la liste déroulante du dessous et choisir l'action OuvrirRequête ,
Puis, désigner la requête R_Suppr_Stocks en lecture seule,
Ensuite, dans la chronologie, les remonter au-dessus de l'action AfficherTousEnreg ,
Désormais, notre application de facturation est aboutie. Il est néanmoins nécessaire de la tester.
Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer ,
De retour sur le formulaire, l'enregistrer à son tour (CTRL + S),
Puis, le fermer en cliquant sur la croix de son onglet,
Exécuter ensuite le formulaire _F_navig_principal ,
Puis, activer son onglet Facturation ,
Choisir un identifiant client et construire une commande,
Puis, cliquer sur le bouton Valider pour l'archiver,
Ensuite, si vous affichez le contenu de la
table Produits , vous remarquez l'actualisation précise des stocks pour les références commandées. Si vous ouvrez les tables temporaires, vous constatez qu'elles sont parfaitement vidées. Une autre facturation peut donc démarrer.
Nous l'avons déjà évoqué, un petit défaut subsiste. Vous l'avez sans doute remarqué en construisant une nouvelle commande, les traces de l'ancienne persistent. Lorsque nous avons effectué des manipulations, nous ne les avons pas abouties. Il est donc nécessaire de déclencher les requêtes de suppression à la fermeture du formulaire voire même à son ouverture, pour une double sécurité.