I. Introduction▲
Dans une gestion de stock classique, on souhaite généralement déterminer, pour chaque article, sa quantité disponible en fonction des mouvements (entrées/sorties) effectués précédemment sur ce stock. Dans notre cas, nous souhaitons connaître les quantités de matériels disponibles dans le futur, en fonction des locations déjà planifiées.
L'objectif est d'expliquer comment créer un formulaire permettant d'afficher le nombre d'unités disponibles par matériel et par période.
Pour ce faire, après avoir donné un aperçu du résultat souhaité et avoir décrit la procédure de génération des disponibilités du matériel, on détaillera la structure des différents objets de l'application exemple, dans l'ordre de leur création :
- tables nécessaires ;
- requêtes ;
- formulaires ;
- module M_GenererDispo.
II. Rendu final du formulaire▲
Le formulaire affichant les disponibilités du matériel :
Il permet de visualiser, pour le matériel et la période choisis, les quantités successives disponibles.
Nous décrivons par la suite la procédure de génération des disponibilités du matériel, et les objets nécessaires pour aboutir à ce résultat.
III. Procédure de génération des disponibilités du matériel▲
On enregistre dans une table les jours compris dans la période choisie, puis on évalue la quantité de matériels loués pour chacun des jours. On retranche ensuite ces quantités de matériels au nombre d'unités en stock au départ pour obtenir le nombre d'unités disponibles par jour.
Enfin, on sauvegarde, pour chaque matériel et chaque période, ses quantités disponibles.
Résumé des différentes étapes
- Enregistrement dans la table T_Calendrier des jours compris dans la période choisie ;
- Évaluation dans la requête R_MaterielLoueJour de la quantité de matériels loués pour chacun des jours ;
- Retranchement dans la requête R_MaterielDispoJour des quantités de matériels loués au nombre d'unités en stock au départ ;
- Enregistrement dans la table T_PeriodeDispo, pour chaque matériel, de ses quantités disponibles par période ;
- Enfin, affichage du résultat dans le sous-formulaire.
L'affichage des disponibilités dépend de la période choisie sur le formulaire principal.
IV. Tables▲
IV-A. Tables de la base▲
IV-A-1. T_Materiel▲
Cette table permet de sauvegarder les données relatives au matériel.
Nom du champ |
Type de données |
Description |
---|---|---|
IDMateriel |
Entier long |
Identifiant du matériel |
RefMateriel |
Texte |
Référence du matériel |
DesignationMateriel |
Texte |
Désignation du matériel |
QteStock |
Entier long |
Quantité en stock |
… |
… |
… |
On conserve uniquement les champs utilisés dans notre exemple.
IV-A-2. T_Location▲
Elle sert à sauvegarder les informations sur la location du matériel.
Nom du champ |
Type de données |
Description |
---|---|---|
IDLocation |
Entier long |
Identifiant de la location |
IDClient |
Entier long |
Identifiant du client |
dtDebutLoc |
Date/Heure |
Début de la location |
dtFinLoc |
Date/Heure |
Fin de la location |
IV-A-3. T_DetailLocation▲
Elle permet d'enregistrer le détail de la location du matériel.
Nom du champ |
Type de données |
Description |
---|---|---|
IDDetailLocation |
Entier long |
Identifiant du détail de la location |
IDLocation |
Entier long |
Identifiant de la location |
IDMateriel |
Entier long |
Identifiant du matériel loué |
QteMateriel |
Entier long |
Quantité louée |
… |
… |
… |
Si vous ne disposez que d'un seul article par référence, alors vous pouvez mettre 1 comme valeur par défaut pour le champ QteMateriel. Dans ce cas la quantité disponible par article ne peut prendre que les valeurs 0 ou 1.
IV-B. Tables temporaires▲
Pour sauvegarder les dates des jours du calendrier et les disponibilités du matériel, nous aurons besoin de quelques tables.
IV-B-1. T_Calendrier▲
Elle contient la dates comprises dans la période choisie sur le formulaire.
Nom du champ |
Type de données |
Description |
---|---|---|
dtCalendrier |
Date/heure |
Date comprise dans la période choisie |
On va utiliser une procédure VBA pour alimenter dynamiquement cette table.
IV-B-2. T_PeriodeDispo▲
Elle sert à enregistrer les quantités de matériels disponibles par période.
Nom du champ |
Type de données |
Description |
---|---|---|
IDPeriode |
Entier long |
Numéro d'ordre de la période |
IDArticle |
Entier long |
Identifiant de l'article |
dtDebutPeriode |
Date/Heure |
Date de début de la période |
dtFinPeriode |
Date/Heure |
Date de fin de la période |
QteDispo |
Entier long |
Quantité de matériel disponible pour la période |
Là encore, on va utiliser une procédure pour alimenter dynamiquement cette table.
V. Requêtes▲
Afin de pouvoir afficher pour chaque période le matériel disponible, on a besoin de réaliser quelques requêtes.
V-A. R_DetailLocation▲
Cette requête relie les tables T_Location, T_DetailLocation et T_Materiel, en sélectionnant les locations enregistrées dans la période choisie sur le formulaire.
V-B. R_MaterielLoueJour▲
Cette requête réalise le produit cartésien entre la table T_Calendrier et la requête R_DetailLocation, pour afficher les quantités de matériels loués par jour.
On constate que la requête comprend, dans la partie encadrée, un champ calculé que nous allons détailler.
QteLouee
:
-
[R_DetailLocation].
[QteLouee]*(
[dtCalendrier] Entre [dtDebutLoc] Et [dtFinLoc])
Cette formule renvoie la quantité louée à la date du calendrier, si cette date est comprise dans la période de location (entre [dtDebutLoc] et [dtFinLoc]), sinon elle renvoie zéro.
Champs concernés :
- [R_DetailLocation].[QteLouee] : champ affichant la quantité de matériel loué sur cette période ;
- [dtCalendrier] : champ affichant la date du jour du calendrier ;
- [dtDebutLoc] : champ indiquant la date de début de la location ;
- [dtFinLoc] : champ indiquant la date de la fin de la location.
V-C. R_MaterielDispoJour▲
Cette requête « regroupement » basée sur la requête précédente affiche les quantités de matériels disponibles par matériel et par jour.
On constate que la requête comprend dans la partie expression un champ calculé que nous allons détailler.
V-C-1. Expression donnant le nombre d'unités disponibles▲
Nous avons utilisé dans la requête les fonctions de regroupement Premier et Somme :
QteDispo
:
Premier
(
[QteStock])-
Somme
(
[QteLouee])
Pour obtenir la quantité disponible à une date donnée, on retranche la somme des quantités louées pour ce jour à la quantité en stock au départ.
Champs concernés :
- [QteStock] : champ indiquant la quantité de l'article en stock au départ ;
- [QteLouee] : champ indiquant la quantité de matériel loué.
V-D. R_MaterielDispoPeriode▲
Cette requête reliant les tables T_PeriodeDispo et T_Materiel affiche les quantités de matériels disponibles par période.
On constate que la requête comprend dans la partie encadrée des champs calculés que nous allons détailler plus loin.
V-D-1. Expression donnant le nombre d'unités disponibles▲
QteDispo
:
Nz
(
[Qte];[QteStock])
Champs concernés :
- [QteStock] : champ indiquant la quantité de l'article en stock au départ ;
- [QteLouee] : champ indiquant la quantité de matériel loué.
La fonction Nz renvoie la valeur du champ [QteStock] si le champ [QteLouee] contient une valeur nulle.
V-D-2. Champ calculé indiquant la date de début de la période▲
dtDebutPeriode
:
Nz
(
T_PeriodeDispo.
[dtDebutPeriode];[txtDateMini])
Champs concernés :
- T_PeriodeDispo.[dtDebutPeriode] : champ indiquant la date de début de la période ;
- [txtDateMini] : paramètre affichant la date de début de la recherche.
La fonction Nz renvoie la valeur du paramètre [txtDateMini] si le champ date dtDebutLoc contient une valeur nulle.
V-D-3. Champ calculé indiquant la date de fin de la période▲
dtFinPeriode
:
Nz
(
T_PeriodeDispo.
[dtFinPeriode];[txtDateMaxi])
Champs concernés :
- T_PeriodeDispo.[dtFinPeriode] : champ indiquant la fin de la période ;
- [txtDateMaxi] : paramètre donnant la date de fin de la recherche.
La fonction Nz renvoie la valeur du paramètre [txtDateMaxi] si le champ date T_PeriodeDispo.[dtFinPeriode] contient une valeur nulle.
VI. Formulaires▲
VI-A. Sous-formulaire SF_DispoMateriel▲
Il est lié à la requête R_MaterielDispoPeriode et ces contrôles sont donc liés aux champs de cette requête.
VI-B. Formulaire F_DispoMateriel▲
Nous allons décrire la structure et le code du formulaire principal qui affiche la disponibilité du matériel par période.
En plus du sous-formulaire, il comporte donc plusieurs contrôles.
VI-B-1. Les contrôles paramètres▲
Sur la partie haute du formulaire se trouvent les contrôles paramètres pour la recherche des disponibilités :
- [txtDateMini] : zone de texte indiquant le début de la période de recherche ;
- [txtDateMaxi] : zone de texte affichant la fin de la période ;
- [cmbMateriel] : zone de liste déroulante pour choisir le matériel concerné.
VI-B-2. Bouton de commande cmdActualiser▲
Il permet de générer les disponibilités en fonction de la période choisie, et de mettre à jour le sous-formulaire :
Private
Sub
CmdActualiser_Click
(
)
' génère les dates comprises dans la période choisie
MajPeriodesDispos CDate
(
Me.txtDateMini
), CDate
(
Me.txtDateMaxi
)
Me.SF_Disponibilites.Requery
' actualise le sous-formulaire
End
Sub
VI-B-3. Procédure sur ouverture du formulaire▲
Elle permet de générer les périodes de disponibilités sur les quinze prochains jours, puis de mettre à jour le sous-formulaire :
Private
Sub
Form_Open
(
Cancel As
Integer
)
' génère les dates comprises dans la période choisie
MajPeriodesDispos CDate
(
Me.txtDateMini
), CDate
(
Me.txtDateMaxi
)
Me.SF_Disponibilites.Requery
' actualise le sous-formulaire
End
Sub
VII. Module M_GenererDispo▲
VII-A. Procédure MajCalendrier▲
Pour mettre à jour la source de données du sous-formulaire, on a besoin d'écrire une procédure qui ajoute dans la table T_Calendrier les dates comprises dans la période choisie sur le formulaire :
Private
Sub
MajCalendrier
(
dtDebut As
Date
, dtFin As
Date
)
' Met à jour le calendrier en fonction des dates de début et de fin passées en argument
Dim
db As
DAO.Database
Dim
rs As
DAO.Recordset
Dim
dt As
Date
' référence à la base courante
Set
db =
CurrentDb
' Suppression des données contenues dans la table T_Calendrier
db.Execute
"delete * from T_Calendrier;"
, dbFailOnError
'Ouverture du recordset basé sur la table T_Calendrier
Set
rs =
db.OpenRecordset
(
"T_Calendrier"
)
dt =
dtDebut ' date de début de la période de génération des dates
'Parcours de la période définie par les paramètres de début et de fin passés en argument
Do
While
dt <=
dtFin
rs.AddNew
' ajout de la date dans la table T_Calendrier
rs!dtCalendrier =
dt
rs.Update
dt =
dt +
1
' prochain jour
Loop
' Libération des variables objet
rs.Close
Set
rs =
Nothing
Set
db =
Nothing
End
Sub
VII-B. Procédure MajPeriodesDispos▲
Elle permet d'ajouter dans la table T_PeriodeDispo les périodes successives de disponibilité pour chaque article :
VIII. Adaptation à un cas plus simple▲
Si vous souhaitez gérer les locations à l'unité, comme pour louer des chambres d'hôtel, il suffit de mettre comme valeur par défaut 1 pour la quantité en stock et la quantité louée de matériel. Dans ce cas, si le matériel est disponible pour une période donnée, la colonne quantité indiquera 1, sinon elle affichera 0.
IX. Téléchargement▲
La base exemplegenerer-materiel-dispo.zip est au format Access accdb.
Elle a été réalisée en collaboration avec grpoirier.
Pour faciliter les tests et assurer sa portabilité, la base exemple n'utilise pas de composants externes à Access (ActiveX ou autres).
X. Remerciements▲
Un grand merci à toute l'équipe de Dvp et plus particulièrement à :
Pour m'avoir fourni l'idée de départ :
. grpoirier
Pour ses remarques et conseils avisés :
. claudeleloup
Pour leur relecture :
. milkoseck
. claudeleloup