Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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,
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,
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.