formateur informatique

Contrôler les stocks avant d'ajouter à la facture

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Contrôler les stocks avant d'ajouter à la facture
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 :


Contrôler les stocks

Dans cette cinquième et avant-dernière étape de la construction de l'application de facturation automatisée en VBA Word, nous souhaitons nous assurer que les quantités en stocks sont suffisantes, avant d'autoriser l'ajout d'articles à la facture. Mais ce n'est pas tout, une fois l'article accepté et ajouté, sa référence et sa quantité achetées doivent être insérées dans la table prévue à cet effet dans la base de données Access. C'est ainsi que nous préparerons le terrain pour la sixième et dernière étape. Son objectif sera de mettre à jour les stocks dans la table d'origine, grâce à ces informations temporaires.

Document Word et base Access à télécharger
Pour poursuivre ces travaux, nous devons tout d'abord récupérer l'application de facturation au dernier indice de développement. Après décompression et comme nous en avons l'habitude désormais, nous retrouvons le document Word, la base de données Access et le sous dossier pour archiver les factures.
  • Double cliquer sur le document pour l'ouvrir dans Word,
  • Cliquer sur les boutons des bandeaux de sécurité pour libérer les ressources,
  • Puis, cliquer sur la croix du formulaire qui apparaît pour le Fermer,
  • Ensuite, réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word,
Supprimer les enregistrements de la table temporaire
Nous l'avons évoqué, si les stocks sont suffisants, l'achat de l'article doit être accepté. En conséquence, ses informations doivent être insérées en table temporaire en vue de la mise à jour des stocks lors de la validation de la facture. Donc, à chaque nouvelle facturation, cette table temporaire doit tout d'abord être vidée des anciennes données émanant d'une précédente facture. Et souvenez-vous, nous l'avions découverte à l'occasion du premier volet, cette table temporaire se nomme tempProduits.
  • Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Facturation,
  • Puis, double cliquer sur un emplacement vide du formulaire en conception,
Nous basculons ainsi dans la feuille de code entre les bornes de la procédure UserForm_Activate. Son code se déclenche au chargement du formulaire. Et comme vous pouvez le voir, des objets de base de données (enr et base) existent déjà. Nous les avions programmés à l'occasion du premier volet pour questionner la base de données Access et remplir la liste déroulante des références articles. Souvenez-vous de même que leur implémentation a été rendue possible grâce à l'ajout au projet d'une référence à Access.

Bref, nous allons pouvoir les exploiter, en tous cas l'un d'entre eux, pour exécuter une requête Suppression sur la table temporaire.
  • Sous la boucle Do, ajouter les deux instructions VBA suivantes :
...
Do
Ref.AddItem enr.Fields("produit_ref").Value
enr.MoveNext
Loop Until enr.EOF

requete = "DELETE * From tempProduits"
base.Execute requete


enr.Close
base.Close
Set enr = Nothing
Set base = Nothing
...


Ainsi, nous réexploitons notre objet de base de données, juste avant qu'il ne soit fermé (base.Close). Nous avions déclaré la variable requete par anticipation. Nous lui affectons une syntaxe bien particulière. Elle consiste à supprimer (DELETE) tous les enregistrements (*) de tous les champs dans (From) la table tempProduits. Et c'est simplement la méthode Execute de l'objet de base de données qui permet de déclencher cette requête Suppression dont la syntaxe lui est passée en paramètre.

Vérifier la quantité en stock
Maintenant et pour poursuivre, nous devons confronter la quantité demandée pour un article à sa quantité disponible en stock. C'est seulement lorsque la première est inférieure à la seconde que la commande de la référence peut être ajoutée à la facture. Et pour réaliser cette vérification, rien n'est plus simple. En effet, grâce à nos développements précédents, cette quantité est déjà rapatriée sur le formulaire dans le champ nommé Stock. Le champ de la quantité commandée est quant à lui nommé Qte.
  • Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Facturation,
  • Sur le formulaire en conception, double cliquer sur le bouton Ajouter,
Ainsi, nous retournons dans la feuille de code, mais cette fois entre les bornes de la procédure événementielle Valider_Click. Notre test doit intervenir après un premier test existant. Il s'agit de celui que nous avons monté à l'occasion du développement précédent pour vérifier que toutes les zones de saisie étaient bien renseignées. C'est seulement à cette condition que le processus d'ajout peut être entrepris. Mais désormais, nous allons lui additionner une seconde sécurité.
  • Dans l'instruction conditionnelle de la variable booléenne, créer l'instruction suivante :
...
Next Zone

If test = True Then
If (CInt(Qte.Value) <= CInt(Stock.Value))Then
If (laLigne > 2) Then
'Sélectionner avant d'insérer en-dessous
ActiveDocument.Tables(1).Cell(laLigne - 1, 5).Select
Selection.InsertRowsBelow 1
End If

total = total + Prix.Value * Qte.Value
...


Nous exploitons la fonction VBA CInt pour forcer la conversion des contenus des zones de texte en valeurs entières. Lorsqu'un calcul est entrepris sur ces valeurs comme une multiplication, le VBA comprend et réalise cette conversion naturellement. Ici, nous devons nous en charger. Donc, nous autorisons la suite du traitement si et seulement si la quantité demandée est inférieure ou égale à la quantité en stock.

Cette nouvelle instruction conditionnelle doit maintenant être bornée. Et comme elle est encapsulée dans un premier test, cette borne de fin doit intervenir avant le else du premier If. C'est ainsi que l'ajout d'un article à la facture ne pourra se faire que selon deux conditions. Le formulaire doit être complètement rempli et la quantité en stock doit être suffisante.
  • Avant le Else du premier If, ajouter la branche de fin comme suit :
...
laLigne = laLigne + 1
Qte.Value = 1
Else
MsgBox "La quantité en stock n'est pas suffisante pour ce produit."
End If

Else
MsgBox "Tous les renseignements ne sont pas complétés"
End If
End Sub
...


Comme nous l'avons fait précédemment, nous affichons une indication à l'utilisateur dans une boîte de dialogue grâce à la fonction MsgBox.

Mémoriser les quantités achetées
Nous n'en avons pas fini avec les améliorations à apporter à cette procédure Valider_Click. Nous l'avons évoqué, si l'article est accepté, sa quantité commandée doit être inscrite en table temporaire, accompagnée de sa référence bien sûr. C'est ainsi que la mise à jour des stocks pourra opérer la correspondance. Et pour cela, dans la branche de l'instruction conditionnelle que nous venons de bâtir, nous proposons d'appeler une procédure qui se chargera de réaliser l'insertion. Cette procédure n'existe pas encore. Nous la créerons a posteriori.
  • Juste après le bloc With, ajouter l'appel suivant :
...
.Cell(laLigne + 4, 5).Range.Text = total * 1.2
End With

memoriser Ref.Value, Qte.Value

laLigne = laLigne + 1
Qte.Value = 1
Else
MsgBox "La quantité en stock n'est pas suffisante pour ce produit."
End If
Else
...


Le bloc With est en effet celui qui procède à l'inscription des informations de l'article ajouté à la facture. Nous appelons donc la fonction memoriser. C'est avec ce nom que nous devrons la créer. Et nous lui passons l'information sur la référence et la quantité achetée en arguments. Elle a en effet besoin de connaître les informations à insérer dans la table. Nous devrons donc signer la procédure memoriser avec ces deux paramètres en attente.
  • Sous la procédure Valider_Click, créer maintenant la procédure memoriser comme suit :
Sub memoriser(Ref As String, nb As Byte)

End Sub


Comme prévu, nous la signons donc avec les deux variables attendues en paramètres, respectivement pour la référence de l'article et sa quantité achetée.

C'est une nouvelle requête action que nous devons désormais entreprendre mais cette fois d'ajout. Pour l'exécuter, au même titre que la requête suppression précédente, nous avons besoin d'une variable pour mémoriser la syntaxe Sql, d'un objet de base de données et d'une variable pour stocker le chemin d'accès à la base de données.
  • Dans les bornes de la procédure memoriser, ajouter les déclarations et affectations suivantes :
...
Dim cheminBd As String: Dim requete As String
Dim base As Database

cheminBd = ThisDocument.Path & "\articles.accdb"
Set base = DBEngine.OpenDatabase(cheminBd)
...


Nous l'avons évoqué à plusieurs reprises à l'occasion des volets précédents, c'est la propriété Path de l'objet ThisDocument qui renseigne sur le chemin d'accès au projet local. Nous lui concaténons le nom de la base de données, sans oublier l'antislash (\) en préfixe pour bien entrer dans le dossier. Dès lors nous instancions la classe permettant d'hériter des propriétés et méthodes pour piloter les objets de base de données. Et pour cela, nous exploitons la méthode OpenDatabase de l'objet DBEngine en lui passant le chemin de la Bdd en paramètre. C'est ainsi que l'objet base peut désormais piloter la base de données articles.accdb par le code VBA.

Nous allons donc exploiter cet objet de base de données pour exécuter la requête Ajout. Mais avant cela, faut-il encore construire la syntaxe de la requête Sql.
  • A la suite du code de la procédure, ajouter les deux instructions VBA suivantes :
...
requete = "Insert Into TempProduits (produit_ref, produit_stock) VALUES ('" & Ref & "'," & nb & ")"
base.Execute requete
...


Nous entreprenons donc une classique requête Insert Into sur la table TempProduits. Dans les premières parenthèses, nous énumérons les champs à renseigner. Dans les secondes, après l'instruction VALUES, nous renseignons les valeurs à y inscrire. Mais comme il s'agit de variables, nous devons les concaténer (&). Et comme la première, celle de la référence, est un texte, nous devons l'encadrer de côtes, d'où l'alternance très importante à respecter de simples et de doubles côtes. Ensuite et comme précédemment, nous appliquons la méthode Execute sur la base de données, avec la requête Sql en paramètre. Nous devrions donc constater l'insertion automatique des données de l'article acheté, à chaque référence insérée au clic sur le bouton Ajouter du formulaire.

Comme toujours et pour coder proprement, nous devons fermer cet objet de base de données puis le détruire, pour libérer la mémoire de l'ordinateur.
  • A la suite du code de la procédure, ajouter les deux dernières instructions suivantes :
...
base.Close
Set base = Nothing
...


Il est temps de réaliser quelques essais.
  • Enregistrer les modifications (CTRL + S) et exécuter l'application (F5),
  • Avec le formulaire qui surgit, ajouter quelques références à la facture,
  • Puis, à la racine du dossier de décompression, double cliquer sur la base articles.accdb,
  • Dans le volet de navigation, double cliquer alors sur la table TempProduits pour l'ouvrir,
Ajouter les articles commandés dans une table Access temporaire en VBA Word

Nous accédons ainsi à la vue en mode feuille de données de la table. Et comme vous pouvez l'apprécier, toutes les références que nous avons ajoutées à la facture sont effectivement accompagnées de leurs quantités respectives.
  • Fermer la table en cliquant sur la croix de son onglet,
  • Revenir sur Word et fermer le formulaire en cliquant sur la croix de sa fenêtre,
  • Exécuter de nouveau l'application en enfonçant la touche F5 du clavier,
  • Puis, rouvrir la table Access,
Vider la table Access temporaire en VBA Word pour créer une nouvelle facture

La sécurité est bel et bien en place puisqu'à chaque nouvelle facturation entreprise, la table temporaire est initialement vidée pour procéder à une potentielle nouvelle mise à jour des stocks.

 
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