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▲
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 N° " & 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▲
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▲
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.



















