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.