Gérer une plateforme de stockage avec Access

Claude Leloup

Reste à faire, citer les techniques :

- récup d'Excel au démarrage

- CMUP

- choix d'une valeur selon l'un ou l'autre critère

- formulaires pères/fils

- dorsale/frontale

- zone de liste dérivée

- Titre : Gérer une plateforme de stockage avec Access

- Auteur : Claude Leloup

- Parution : 7 décembre 2016

- Mise à jour : 8 décembre 2016

- Licence : 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 ® 2016 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'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Le contexte

- II. Cahier des charges

- III. Le modèle de données

- IV. Récupération des données du système en place

- IV-A. On lie temporairement cette feuille Excel à la dorsale

- IV-B. Peupler la table tFamilles

- IV-C. Peupler la table tArticles

- IV-D. Créer des enregistrements dans la table tEntrees pour enregistrer le stock de départ

- V. Les données à ce stade

- VI. À l'ouverture de la frontale

- VII. Encoder une entrée

- VII-A. Présentation du formulaire

- VII-B. Explication du code

- VIII. Encoder une demande d'approvisionnement (D.A.)

- VIII-A. Présentation du formulaire

- VIII-B. Explication du code

- IX. Téléchargement

I - Le contexte

Décrire la situation actuelle.

- CMUP => respect de l'ordre chronologique pour les entrées sorties.

II - Cahier des charges

Reste à faire

III - Le modèle de données

IV - Récupération des données du système en place

On peut récupérer de l'organisation en place cette feuille Excel :

IV-A - On lie temporairement cette feuille Excel à la dorsale

IV-B - Peupler la table tFamilles

IV-C - Peupler la table tArticles

IV-D - Créer des enregistrements dans la table tEntrees pour enregistrer le stock de départ

V - Les données à ce stade

En attendant de connaître le moyen de récupérer les centres de coûts par magasin, les tables tMagasins et tCentresCouts ont été complétées manuellement :

Ces opérations concernent uniquement la reprise.
Quand on a récupéré les données de l'ancien système, on peut donc supprimer les requêtes et le lien vers tDepart.

VI - À l'ouverture de la frontale

Un menu permet d'accéder aux différentes fonctionnalités.

VII - Encoder une entrée

VII-A - Présentation du formulaire

Le programme vérifie que la date n'est pas antérieure à la dernière entrée et qu'elle est postérieure à la dernière sortie (CMUP oblige !).
Si cette règle est enfreinte, ce message apparaît :

Le choix de l'article peut s'opérer soit en désignant son code, soit en désignant son nom. Quand le choix est opéré selon un critère, l'autre critère s'affiche automatiquement.

Le stock actuel avant cette entrée.

Le clic provoque l'ajout dans la table tEntrees après calcul du nouveau CMUP :

Quantité

CMUP

Stock précédent

15

4.00

Sorti depuis

1

Stock avant cette entrée

14

4.00

Nouveau CMUP :

VII-B - Explication du code

1. Option Compare Database

2. Option Explicit

3. Public Sub VerifDate()

4. Dim dDerEntree As Date

5. Dim dDerSortie As Date

6. 'la date doit être postérieure (ou égale) à la dernière entrée et postérieure à la date de dernière sortie

7. dDerEntree = Nz(DMax("EntreeDate", "tEntrees", "tArticlesFK=" & Me.cboArticle), #1/1/1900#)

8. dDerSortie = Nz(DMax("SortieDate", "rSorties", "tArticlesFK=" & Me.cboArticle), #1/1/1900#)

9. If Me.txtDate < dDerEntree Or Me.txtDate <= dDerSortie Then

10. MsgBox "La date doit être postérieure (ou égale) à la dernière entrée : " & dDerEntree _

11. & " et postérieure à la dernière sortie de cet article : " & dDerSortie & " !", vbCritical

12. Me.txtDate = Null

13. End If

14. End Sub

16. Private Sub btEnregistrer_Click()

17. Dim AvantDernDate As Date

18. Dim AvantDernStock As Single

19. Dim AvantDernCMUP As Single

20. Dim SortiesPeriode As Single

21. Dim StockFinal As Single

22. Dim dCMUP As Double

23. Dim oQry As QueryDef

24. Dim oCtl As Control

26. On Error GoTo GestionErreurs

27. 'Est-ce complet ?

28. If IsNull(Me.txtDate) Or IsNull(Me.cboArticle) Or Me.txtQuantite <= 0 Or Me.txtPrix <= 0 Then

29. MsgBox "Au moins un des champs obligatoires n'est pas correctement rempli !", vbCritical

30. Exit Sub

31. End If

33. 'Déterminer les éléments pour le calcul du CMUP

35. 'AvantDernDate : date de l'entrée précédente

36. AvantDernDate = Nz(DLookup("EntreeDate", "rAvantDernEntree"), Me.txtDate)

37. If AvantDernDate = Me.txtDate Then

38. dCMUP = Me.txtPrix

39. GoTo MajtEntrees

40. End If

42. 'AvantDernStock : stock après l'entrée précédente

43. AvantDernStock = StockADate(Me.cboArticle, Format(AvantDernDate, "mm/dd/yy"))

45. 'AvantDernCMUP : CMUP après l'entrée précédente

46. AvantDernCMUP = DLookup("CMUP", "rAvantDernEntree")

48. 'SortiesPeriode : sorties depuis entrée précédente

49. SortiesPeriode = SortiesADate(Me.cboArticle, Format(Date, "mm/dd/yyyy")) - SortiesADate(Me.cboArticle, Format(AvantDernDate, "mm/dd/yy"))

51. 'Stock final : stock après cette dernière entrée

52. StockFinal = StockADate(Me.cboArticle, Format(Date, "mm/dd/yyyy")) + Me.txtQuantite

54. '  Calcul CMUP

55. dCMUP = (AvantDernStock - SortiesPeriode) * AvantDernCMUP + Me.txtQuantite * Me.txtPrix

56. dCMUP = dCMUP / StockFinal

58. MajtEntrees:

59. Set oQry = CurrentDb.QueryDefs("rMajtEntrees")

60. oQry.Parameters("Article") = Me.cboArticle

61. oQry.Parameters("DateEntree") = Me.txtDate

62. oQry.Parameters("Quantite") = Me.txtQuantite

63. oQry.Parameters("PrixUnitaire") = Me.txtPrix

64. oQry.Parameters("Commande") = Me.txtNumCommande

65. oQry.Parameters("CMUP") = dCMUP

66. oQry.Execute

67. Set oQry = Nothing

68. 'Remettre à zéro

69. For Each oCtl In Me.Controls

70. oCtl = Null

71. Next oCtl

72. GestionErreurs:

73. Select Case Err.Number

74. Case 0 ' pas d'erreur

75. Case 438 'étiquette

76. Resume Next

77. Case Else

78. MsgBox "Erreur dans btEnregistrer_Click N° " & Err.Number & " " & Err.Description

79. End Select

80. End Sub

82. Private Sub CboArticle_AfterUpdate()

83. Me.cboCodeArticles = cboArticle

84. Call VerifDate

85. 'Afficher le stock actuel de cet article

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

87. End Sub

89. Private Sub cboCodeArticles_AfterUpdate()

90. Me.cboArticle = Me.cboCodeArticles

91. Call VerifDate

92. 'Afficher le stock actuel de cet article

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

94. End Sub

96. Private Sub txtDate_AfterUpdate()

97. If Not IsNull(Me.txtDate) And Me.cboArticle Then Call VerifDate

98. End Sub

101. Private Sub txtQuantite_AfterUpdate()

102. If IsNull(Me.cboArticle) = True Or IsNull(Me.txtDate) = True Then

103. Me.txtQuantite = Null

104. MsgBox "Vous devez d'abord saisir une date et un article", vbCritical

105. End If

106. End Sub

Commentaires

Reste à faire

VIII - Encoder une demande d'approvisionnement (D.A.)

VIII-A - Présentation du formulaire

Les enregistrements apparaissent dans l'ordre de leur création. La liste dérourante permet de se positionner sur une D.A. particulière.

L'encodage doit respecter l'ordre chronologique (CMUP oblige !) : pour un article, la date de sortie doit être au moins égale ou postérieure à la date de la précédente entrée. En cas de non-respect, ce message :

Le choix du magasin peut s'opérer soit en désignant son code, soit en désignant son nom. Quand le choix est opéré selon un critère, l'autre critère s'affiche automatiquement.

Le choix opéré va automatiquement limiter les possibilités offertes pour les centres de coûts.

Même principe, on peut choisir selon le code ou le nom.

Cocher la case pour que la livraison se fasse à l'adresse du magasin.
Si la case n'est pas cochée, un champ apparaît pour encoder une autre adresse de livraison :

Un sous-formulaire fils pour encoder le détail des articles concernés choisis selon le code ou le nom.

Si le stock actuel s'avère insuffisant, ce message :

La taille de ce sous-formulaire s'adapte automatiquement en fonction du nombre d'enregistrements.

Un clic sur ce bouton pour imprimer la feuille de préparation de commande pour le magasinier :

VIII-B - Explication du code

1. Option Compare Database

2. Option Explicit

4. Private Sub Form_Current()

6. 'Ajuster taille

7. Call AmenagerTailleSF(Me, Me.CTNRsfSorties)

8. 'Ajuster le contenu de la zone de liste des centres de coûts

9. Call chkLivraisonMagasin_AfterUpdate

10. Me.cboCentre.RowSource = Me.cboCentre.RowSource

11. Me.cboCodeCentre.RowSource = Me.cboCodeCentre.RowSource

13. End Sub

15. Private Sub btMagasinier_Click()

16. DoCmd.OpenReport "ePrepaCommande", acViewPreview

17. End Sub

19. Private Sub cboCodeMagasin_AfterUpdate()

20. Me.cboCentre.RowSource = Me.cboCentre.RowSource

21. Me.cboCodeCentre.RowSource = Me.cboCodeCentre.RowSource

22. End Sub

24. Private Sub cboDA_AfterUpdate()

25. Me.txtNumDA.SetFocus

26. DoCmd.FindRecord Me.cboDA

27. Me.cboDA = Null

28. End Sub

30. Private Sub cboMagasin_AfterUpdate()

31. Me.cboCentre.RowSource = Me.cboCentre.RowSource

32. Me.cboCodeCentre.RowSource = Me.cboCodeCentre.RowSource

33. End Sub

35. Private Sub chkLivraisonMagasin_AfterUpdate()

36. If Me.chkLivraisonMagasin = True Then

37. Me.etqLivraisonAutre.Visible = False

38. Me.txtLivraisonAutre.Visible = False

39. Me.txtLivraisonAutre = Null

40. Else

41. Me.etqLivraisonAutre.Visible = True

42. Me.txtLivraisonAutre.Visible = True

43. End If

44. End Sub

Commentaires

Reste à faire

IX - Téléchargement

Les dorsale et frontale de démonstration se trouvent  ici.