Gérer une plateforme de stockage avec Access

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

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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

Image non disponible

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 :

Image non disponible

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

Image non disponible

Image non disponible

Image non disponible

IV-B. Peupler la table tFamilles

Image non disponible

IV-C. Peupler la table tArticles

Image non disponible

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

Image non disponible

V. Les données à ce stade

Image non disponible

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 :

Image non disponible

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

Image non disponible

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

VII. Encoder une entrée

VII-A. Présentation du formulaire

Image non disponible

Image non disponible 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 :

Image non disponible

Image non disponible 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.

Image non disponible Le stock actuel avant cette entrée.

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

Image non disponible
  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

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
Option Compare Database
Option Explicit
Public Sub VerifDate()
  Dim dDerEntree As Date
  Dim dDerSortie As Date
  'la date doit être postérieure (ou égale) à la dernière entrée et postérieure à la date de dernière sortie
  dDerEntree = Nz(DMax("EntreeDate", "tEntrees", "tArticlesFK=" & Me.cboArticle), #1/1/1900#)
  dDerSortie = Nz(DMax("SortieDate", "rSorties", "tArticlesFK=" & Me.cboArticle), #1/1/1900#)
  If Me.txtDate < dDerEntree Or Me.txtDate <= dDerSortie Then
      MsgBox "La date doit être postérieure (ou égale) à la dernière entrée : " & dDerEntree _
            & " et postérieure à la dernière sortie de cet article : " & dDerSortie & " !", vbCritical
      Me.txtDate = Null
  End If
End Sub

Private Sub btEnregistrer_Click()
  Dim AvantDernDate As Date
  Dim AvantDernStock As Single
  Dim AvantDernCMUP As Single
  Dim SortiesPeriode As Single
  Dim StockFinal As Single
  Dim dCMUP As Double
  Dim oQry As QueryDef
  Dim oCtl As Control
  
  On Error GoTo GestionErreurs
  'Est-ce complet ?
  If IsNull(Me.txtDate) Or IsNull(Me.cboArticle) Or Me.txtQuantite <= 0 Or Me.txtPrix <= 0 Then
      MsgBox "Au moins un des champs obligatoires n'est pas correctement rempli !", vbCritical
      Exit Sub
  End If
  
  'Déterminer les éléments pour le calcul du CMUP
  
  'AvantDernDate : date de l'entrée précédente
  AvantDernDate = Nz(DLookup("EntreeDate", "rAvantDernEntree"), Me.txtDate)
  If AvantDernDate = Me.txtDate Then
      dCMUP = Me.txtPrix
      GoTo MajtEntrees
  End If
   
  'AvantDernStock : stock après l'entrée précédente
  AvantDernStock = StockADate(Me.cboArticle, Format(AvantDernDate, "mm/dd/yy"))

  'AvantDernCMUP : CMUP après l'entrée précédente
  AvantDernCMUP = DLookup("CMUP", "rAvantDernEntree")

  'SortiesPeriode : sorties depuis entrée précédente
  SortiesPeriode = SortiesADate(Me.cboArticle, Format(Date, "mm/dd/yyyy")) - SortiesADate(Me.cboArticle, Format(AvantDernDate, "mm/dd/yy"))
  
  'Stock final : stock après cette dernière entrée
  StockFinal = StockADate(Me.cboArticle, Format(Date, "mm/dd/yyyy")) + Me.txtQuantite

  '  Calcul CMUP
  dCMUP = (AvantDernStock - SortiesPeriode) * AvantDernCMUP + Me.txtQuantite * Me.txtPrix
  dCMUP = dCMUP / StockFinal
  
MajtEntrees:
  Set oQry = CurrentDb.QueryDefs("rMajtEntrees")
  oQry.Parameters("Article") = Me.cboArticle
  oQry.Parameters("DateEntree") = Me.txtDate
  oQry.Parameters("Quantite") = Me.txtQuantite
  oQry.Parameters("PrixUnitaire") = Me.txtPrix
  oQry.Parameters("Commande") = Me.txtNumCommande
  oQry.Parameters("CMUP") = dCMUP
  oQry.Execute
  Set oQry = Nothing
  'Remettre à zéro
  For Each oCtl In Me.Controls
    oCtl = Null
  Next oCtl
GestionErreurs:
  Select Case Err.Number
    Case 0 ' pas d'erreur
    Case 438 'étiquette
      Resume Next
    Case Else
      MsgBox "Erreur dans btEnregistrer_Click  " & Err.Number & " " & Err.Description
  End Select
End Sub

Private Sub CboArticle_AfterUpdate()
  Me.cboCodeArticles = cboArticle
  Call VerifDate
  'Afficher le stock actuel de cet article
  Me.txtStock = StockADate(Me.cboArticle, Format(Date, "mm/dd/yyyy"))
End Sub

Private Sub cboCodeArticles_AfterUpdate()
  Me.cboArticle = Me.cboCodeArticles
  Call VerifDate
  'Afficher le stock actuel de cet article
  Me.txtStock = StockADate(Me.cboArticle, Format(Date, "mm/dd/yyyy"))
End Sub

Private Sub txtDate_AfterUpdate()
  If Not IsNull(Me.txtDate) And Me.cboArticle Then Call VerifDate
End Sub


Private Sub txtQuantite_AfterUpdate()
  If IsNull(Me.cboArticle) = True Or IsNull(Me.txtDate) = True Then
    Me.txtQuantite = Null
    MsgBox "Vous devez d'abord saisir une date et un article", vbCritical
  End If
End Sub

Commentaires

Reste à faire

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

VIII-A. Présentation du formulaire

Image non disponible

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

Image non disponible 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 :

Image non disponible

Image non disponible 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.

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

Image non disponible 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 :

Image non disponible

Image non disponible 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 :

Image non disponible

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

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

Image non disponible

VIII-B. Explication du code

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Option Compare Database
Option Explicit

Private Sub Form_Current()

  'Ajuster taille
  Call AmenagerTailleSF(Me, Me.CTNRsfSorties)
  'Ajuster le contenu de la zone de liste des centres de coûts
  Call chkLivraisonMagasin_AfterUpdate
    Me.cboCentre.RowSource = Me.cboCentre.RowSource
    Me.cboCodeCentre.RowSource = Me.cboCodeCentre.RowSource

End Sub

Private Sub btMagasinier_Click()
  DoCmd.OpenReport "ePrepaCommande", acViewPreview
End Sub

Private Sub cboCodeMagasin_AfterUpdate()
  Me.cboCentre.RowSource = Me.cboCentre.RowSource
  Me.cboCodeCentre.RowSource = Me.cboCodeCentre.RowSource
End Sub

Private Sub cboDA_AfterUpdate()
  Me.txtNumDA.SetFocus
  DoCmd.FindRecord Me.cboDA
  Me.cboDA = Null
End Sub

Private Sub cboMagasin_AfterUpdate()
  Me.cboCentre.RowSource = Me.cboCentre.RowSource
  Me.cboCodeCentre.RowSource = Me.cboCodeCentre.RowSource
End Sub

Private Sub chkLivraisonMagasin_AfterUpdate()
  If Me.chkLivraisonMagasin = True Then
      Me.etqLivraisonAutre.Visible = False
      Me.txtLivraisonAutre.Visible = False
      Me.txtLivraisonAutre = Null
    Else
      Me.etqLivraisonAutre.Visible = True
      Me.txtLivraisonAutre.Visible = True
  End If
End Sub

Commentaires

Reste à faire

IX. Téléchargement

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

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

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.