gestion de stock

13
Une gestion des stocks avec Access Par Claude Leloup Date de publication : 15 novembre 2013 Dernière mise à jour : 8 octobre 2015 Ceci comme point de départ pour amorcer la discussion lors de demandes d'aide sur le forum Access de DVP.

Upload: ahouba

Post on 10-Apr-2016

97 views

Category:

Documents


2 download

DESCRIPTION

Gestion de Stock d'article

TRANSCRIPT

Une gestion des stocks avec Access

Par Claude Leloup

Date de publication : 15 novembre 2013

Dernière mise à jour : 8 octobre 2015

Ceci comme point de départ pour amorcer la discussion lors de demandes d'aide sur leforum Access de DVP.

Une gestion des stocks avec Access par Claude Leloup

- 2 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

I - L'idée de départ...................................................................................................................................................... 3II - Avantage d'une telle approche : la simplicité........................................................................................................ 3III - Contexte................................................................................................................................................................ 5IV - Alimenter la table des entrées............................................................................................................................. 6V - Alimenter la table des sorties..............................................................................................................................11VI - Et la suite ?.........................................................................................................................................................13VII - Télécharger........................................................................................................................................................ 13

Une gestion des stocks avec Access par Claude Leloup

- 3 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

I - L'idée de départ

Trois tables :

- une pour référencer les articles : tArticles ;

- une pour comptabiliser les entrées en stock : tEntrees ;

- une pour comptabiliser les sorties : tSorties.

Si, lors de la mise en place, un stock existe déjà, il est comptabilisé comme une entrée.

La colonne « CMUP » (Coût Moyen Unitaire Pondéré) est ajoutée pour les besoins de l'exemplequi va suivre.

On pourrait reprocher la colonne « CMUP » dans la table tSorties : elle est redondante puisquecette notion est déjà incluse dans tEntrees.Le souci de faciliter les calculs de prix de revient (en aval) justifie ce choix.

II - Avantage d'une telle approche : la simplicité

Le stock à un moment donné s'obtient :

Somme des entrées - somme des sortiesà cette date

Voici le contenu du module mFonctions :

Option Compare DatabaseOption Explicit Public Function EntreesADate(Article As Long, DateAng As Date) As Single EntreesADate = Nz(DSum("EntreeQuant", "tEntrees", _ "EntreeDate<=#" & DateAng & "# and tArticlesFK=" & Article), 0)End FunctionPublic Function SortiesADate(Article As Long, DateAng As Date) As Single SortiesADate = Nz(DSum("sortieQuant", "tSorties", _ "SortieDate<=#" & DateAng & "# and tArticlesFK=" & Article), 0)End Function Public Function StockADate(Article As Long, DateAng As Date) As Single

Une gestion des stocks avec Access par Claude Leloup

- 4 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

StockADate = EntreesADate(Article, DateAng) - SortiesADate(Article, DateAng)End Function

La fonction Nz() renverra zéro si aucun enregistrement pour cet article.

Pour vous documenter sur la fonction Dsum(), voyez le tutoriel de Philippe JOCHMANS : Les Fonctions deDomaine dans Access.

Pour tester ces fonctions, rendez-vous dans la base de données qui nous sert d'exemple, nous avons :

et ouvrez la fenêtre d'exécution (<CRTL + G>) et saisissez :

? EntreesADate(961,#10/04/2013#)

et enfoncez <ENTER>, vous obtiendrez ceci :

soit 12 + 25.

De même :

Une gestion des stocks avec Access par Claude Leloup

- 5 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

III - Contexte

Pour la suite, nous partons de l'hypothèse que l'entreprise veut valoriser les sorties au CMUP pour le calcul du prixde revient de sa fabrication.

La valorisation des sorties de marchandise au CMUP impose que :

- les entrées de marchandise sont comptabilisées à leur coût réel ;

- les sorties se font au coût unitaire moyen pondéré de la quantité totale du stock disponible.

Voici un exemple pour illustrer la méthode :

Dans un tel contexte, il est impératif que les comptabilisations se fassent dans un ordrechronologique rigoureux : quand un CMUP a été calculé après une entrée, il n'est plus possiblede comptabiliser des sorties antérieures à cette date.

Une gestion des stocks avec Access par Claude Leloup

- 6 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

IV - Alimenter la table des entrées

• L'utilisateur choisit un article dans la liste déroulante.• S'affiche alors l'historique des entrées dans l'ordre chronologique décroissant (en fait le sous-formulaire

sfEntreesDetail)

1. rivate Sub CboArticle_AfterUpdate()2. 'Afficher l'historique3. Me.CTNRsfEntreesDetail.Form.Requery4. 'Rendre visibles les contrôles pour l'encodage d'une nouvelle entrée5. Me.txtDate.Visible = True6. Me.txtQuant.Visible = True7. Me.txtPU.Visible = True8. Me.txtDate = Null9. Me.txtQuant = Null10. Me.txtPU = Null11. 'Afficher le stock actuel de cet article12. Me.txtStock = StockADate(Me.CboArticle, Format(Date, "mm/dd/yyyy"))13. 'Se positionner sur la date à encoder14. DoCmd.GoToControl "txtDate"15. End Sub

Une gestion des stocks avec Access par Claude Leloup

- 7 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

Remarquez la syntaxe à la ligne 12

Me.txtStock = StockADate(Me.CboArticle, Format(Date, "mm/dd/yyyy"))

Dans une version Access francophone la fonction Date() renvoie la date d'ajourd'hui sous laforme jj/mm/aaaa.

Or quand on traite une date en VBA, il faut que celle-ci soit sous la forme anglo-saxone (mm/dd/yyyy), d'où ce reformatage nécessaire.

• Introduction de la date de la nouvelle entrée. Pour respecter la méthode CMUP, cette date doit être :

- postérieure à celle de la dernière entrée ;

- postérieure à celle de la dernière sortie ;

- et au plus, égale à aujourd'hui.

Private Sub txtDate_AfterUpdate() 'la date doit être postérieure à la dernière entrée et à la date de dernière sortie If Me.txtDate <= DMax("EntreeDate", "tEntrees", "tArticlesFK=" & Me.CboArticle) Then MsgBox "La date doit postérieure à la dernière entrée de cet article" txtDate = Null Exit Sub Else If Me.txtDate <= DMax("SortieDate", "tSorties", "tArticlesFK=" & Me.CboArticle) Then MsgBox "La date doit postérieure à la dernière sortie de cet article" txtDate = Null Exit Sub Else DoCmd.GoToControl "txtQuant" End If End IfEnd Sub

et

Une gestion des stocks avec Access par Claude Leloup

- 8 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

• L'utilisateur complète la quantité et le prix unitaire et clique sur

1. Private Sub btEnregistrer_Click()2. Dim AvantDernDate As Date3. Dim AvantDernStock As Single4. Dim AvantDernCMUP As Single5. Dim SortiesPeriode As Single6. Dim StockFinal As Single7. Dim dCMUP As Double8. Dim sSql As String9. 10. 'Est-ce complet ?11. If IsNull(Me.txtDate) Or Nz(Me.txtQuant, 0) = 0 Or Nz(Me.txtPU, 0) = 0 Then12. MsgBox "Un des champs obligatoires n'est pas rempli", vbCritical13. Exit Sub14. End If15. 16. 'Déterminer les éléments pour le calcul du CMUP17. 18. 'AvantDernDate : date de l'entrée précédente19. AvantDernDate = Nz(DLookup("EntreeDate", "rAvantDernEntree"), Me.txtDate)20. If AvantDernDate = Me.txtDate Then21. dCMUP = Me.txtPU22. GoTo MajtEntrees23. End If24. 25. 'AvantDernStock : stock après l'entrée précédente26. AvantDernStock = StockADate(Me.CboArticle, Format(AvantDernDate, "mm/dd/yy"))27. 28. 'AvantDernCMUP : CMUP après l'entrée précédente29. AvantDernCMUP = DLookup("CMUP", "rAvantDernEntree")30. 31. 'SortiesPeriode : sorties depuis entrée précédente32. SortiesPeriode = SortiesADate(Me.CboArticle, Format(Date, "mm/dd/yyyy")) - SortiesADate(Me.CboArticle, Format(AvantDernDate, "mm/dd/yy"))33.

Une gestion des stocks avec Access par Claude Leloup

- 9 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

34. 'Stock final : stock après cette dernière entrée35. StockFinal = StockADate(Me.CboArticle, Format(Date, "mm/dd/yyyy")) + Me.txtQuant36. 37. ' Calcul CMUP38. dCMUP = (AvantDernStock - SortiesPeriode) * AvantDernCMUP + Me.txtQuant * Me.txtPU39. dCMUP = dCMUP / StockFinal40. 41. 42. 43. 44. MajtEntrees:45. sSql = "INSERT INTO tEntrees ( EntreeDate, EntreeQuant, EntreePU, tArticlesFK, CMUP ) " _46. & "SELECT #" & Format(Me.txtDate, "mm/dd/yy") & "# AS Expr1," _47. & Me.txtQuant & " AS Expr2, " _48. & Me.txtPU & " AS Expr3, " _49. & Me.CboArticle & " As Expr4, " _50. & Replace(dCMUP, ",", ".") & " as Expr5;"51. DoCmd.SetWarnings False52. DoCmd.RunSQL sSql53. DoCmd.SetWarnings True54. 55. 'Remettre à zéro56. Me.txtDate = Null: Me.txtQuant = Null: Me.txtPU = Null57. Me.CTNRsfEntreesDetail.Requery58. Me.txtStock = StockADate(Me.CboArticle, Format(Date, "mm/dd/yyyy"))59. End Sub

Lignes Commentaire2=>8 Définition des variables.11=>13 On vérifie la présence d'une date, d'une quantité et d'un prix

unitaire non nuls.Sinon, message d'alerte et blocage.

16=>35 On recueille les données nécessaires au calcul du CMUP.20 On traite le cas particulier de la 1re entrée pour cet article.26 Remarquez la mise de la date au format anglo-saxon.29 Pour trouver le CMPU précédent, on utilise la requête

rAvantDernEntree

Une gestion des stocks avec Access par Claude Leloup

- 10 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

38-39 Calcul proprement dit du CMUP45-53 On construit une requête « Ajout » pour insérer la nouvelle

entrée dans tEntrees.Remarquez à la ligne 50 le reformatage (un point commesymbole décimal au lieu de la virgule).

56-58 Mise en place pour l'entrée suivante éventuelle.Stock et historique sont mis à jour.Même remarque que plus haut, pour le format de la ligne 58Me.txtStock = StockADate(Me.CboArticle, Format(Date, "mm/dd/yyyy"))

Une gestion des stocks avec Access par Claude Leloup

- 11 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

V - Alimenter la table des sorties

• L'utilisateur choisit un article dans la liste déroulante.• S'affiche alors l'historique des sorties dans l'ordre chronologique décroissant (en fait le sous-formulaire

sfSortiesDetail)

1. Private Sub CboArticle_AfterUpdate()2. 'Afficher l'historique3. Me.CTNRsfSortiesDetail.Form.Requery4. 'Rendre visibles les contrôles pour l'encodage d'une nouvelle sortie5. Me.txtDate.Visible = True6. Me.txtQuant.Visible = True7. Me.txtImputation.Visible = True8. Me.txtDate = Null9. Me.txtQuant = Null10. Me.txtImputation = Null11. DoCmd.GoToControl "txtDate"12. 'Afficher le stock actuel de cet article13. Me.txtStock = StockADate(Me.CboArticle, Format(Date, "mm/dd/yyyy"))14. 'Afficher le CMUP actuel et la dernière entrée de cet article15. Me.txtDernEntree = DLookup("EntreeDate", "rDernEntree")16. Me.txtCMUP = DLookup("CMUP", "rDernEntree")17. End Sub

• Introduction de la date de la nouvelle sortie. Pour respecter la méthode CMUP, cette date doit être :

- postérieure à celle de la dernière entrée ;

Une gestion des stocks avec Access par Claude Leloup

- 12 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

- postérieure à celle de la dernière sortie ;

- et au plus, égale à aujourd'hui.

Private Sub txtDate_AfterUpdate() 'la date doit être postérieure ou au moins égale à la dernière entrée If Me.txtDate < Me.txtDernEntree Then MsgBox "La date doit égale ou postérieure à la dernière entrée de cet article" txtDate = Null Else DoCmd.GoToControl "txtQuant" End IfEnd Sub

et

• L'utilisateur complète la quantité et clique sur

1. Private Sub btEnregistrer_Click()2. Dim sSql As String3. 'Est-ce complet ?4. If IsNull(Me.txtDate) Or Nz(Me.txtQuant, 0) = 0 Or Nz(Me.txtImputation, 0) = 0 Then5. MsgBox "Un des champs obligatoires n'est pas rempli", vbCritical6. Exit Sub7. End If8. 'Maj tSorties9. sSql = "INSERT INTO tSorties ( SortieDate, SortieQuant, SortieImputation, CMUP, tArticlesFK ) " _10. & "SELECT #" & Format(Me.txtDate, "mm/dd/yy") & "# AS Expr1, " _11. & Me.txtQuant & " AS Expr2, " _12. & """" & Me.txtImputation & """ AS Expr3, " _13. & Replace(Me.txtCMUP, ",", ".") & " AS Expr4, " _14. & Me.CboArticle & " As Expr5;"15. 16. DoCmd.SetWarnings False17. DoCmd.RunSQL sSql18. DoCmd.SetWarnings True19. 'Réinitialiser pour une nouvelle sortie éventuelle20. Me.CTNRsfSortiesDetail.Requery

Une gestion des stocks avec Access par Claude Leloup

- 13 -Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de

présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Claude Leloup. Aucune reproduction,même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisationexpresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

http://claudeleloup.developpez.com/tutoriels/access/gestion-de-stock/

21. Me.txtDate = Null: Me.txtQuant = Null: Me.txtImputation = Null22. Me.txtStock = StockADate(Me.CboArticle, Format(Date, "mm/dd/yyyy"))23. End Sub

Lignes Commentaire4=>5 On vérifie la présence d'une date, d'une quantité et d'une

imputation non nulles.Sinon, message d'alerte et blocage.

9=>18 On construit une requête « Ajout » pour insérer la nouvelle sortiedans tSorties.Remarquez à la ligne 13 le reformatage (un point commesymbole décimal au lieu de la virgule).

22 Même remarque que plus haut, pour le format Me.txtStock =StockADate(Me.CboArticle, Format(Date, "mm/dd/yyyy"))

VI - Et la suite ?

Voilà pour l'aspect valorisation de l'inventaire au CMUP, reste à développer les différentes fonctionnalités que l'onjuge utiles dans le cadre d'une application :

contrôle des inventaires ;

calcul des prix de revient de la fabrication ;

statistiques d'achat et de vente...

VII - Télécharger

La base de données qui m'a servi à tester est ici.