Générer la disponibilité du matériel de location

Générer la disponibilité du matériel de location.

Niveau requis : confirmé.

Commentez cet article : 12 commentaires Donner une note à l'article (5)

Article lu   fois.

L'auteur

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 prochaines locations.

II. Contexte

Dans un magasin de location de matériels, les articles sont loués sur une certaine période, mais les employés ont besoin de connaître, avant d'attribuer à un client un nombre d'unités d'un type de matériel, sa disponibilité durant cette phase.

Image non disponible
Location de matériels

Les périodes de location sont simplement délimitées par des dates de début et de fin.

III. Description du principe

L'objectif est d'afficher dans un formulaire le nombre d'unités disponibles par matériel et par période.

Pour ce faire, 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 article les périodes successives et leur quantité.

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_ArticlesOccupes_Jour de la quantité de matériels loués pour chacun des jours.
  • Retranchement dans la requête R_ArticlesDispos_Jour des quantités de matériels loués au nombre d'unités en stock au départ.
  • Enregistrement dans la table T_PeriodeQte, pour chaque article, des quantités de matériels disponibles par période.
  • Enfin, affichage du résultat dans le sous-formulaire.

L'affichage se fait suivant une période définie par une date de début et de fin.

IV. Rendu final du formulaire affichant la disponibilité du matériel

Voici le rendu du formulaire qui présente, pour un article précis et sur une certaine période, le nombre d'unités disponibles par phases successives.

Image non disponible
Aperçu du formulaire de disponibilité

On constate que le programme permet de visualiser, pour l'article choisi, la quantité disponible par période.

Voici les objets nécessaires pour aboutir à ce résultat.

V. Les tables

V-A. Les tables du départ

V-A-1. T_Article

Cette table sauvegarde les articles identifiant le matériel.

Nom du champ

Type de données

Description

IDArticle

Entier long

Identifiant de l'article

RefArticle

Texte

Référence de l'article

Description

Texte

Description du matériel

PrixHT

Monétaire

Prix hors taxe du matériel

V-A-2. T_Location

Elle enregistre les périodes de location du matériel.

Nom du champ

Type de données

Description

IDLocation

Entier long

Numéro d'ordre de la location

IDClient

Entier long

Numéro d'ordre du client

Debut_Loc

Date/Heure

Début de la location

Fin_Loc

Date/Heure

Fin de la location

V-A-3. T_DetailLocation

Elle enregistre le détail de la location du matériel.

Nom du champ

Type de données

Description

IDDetailLocation

Entier long

Numéro d'ordre du détail de la location

IDLocation

Entier long

Numéro d'ordre de la location

IDArticle

Entier long

Identifiant de l'article loué

Qte

Entier long

Quantité de l'article loué

V-B. Les tables peuplées au moment de la génération des disponibilités

Pour sauvegarder les jours du calendrier et le matériel loué, nous aurons besoin de quelques tables :

V-B-1. T_Calendrier

Elle contient la liste des jours compris dans la période choisie.

Nom du champ

Type de données

Description

IDCalendrier

Entier long

Indice du jour du calendrier

DateCalendrier

Texte

Date du jour compris dans le calendrier

V-B-2. T_PeriodeQte

Elle enregistre les quantités de matériels 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

Indice de l'article

Debut

Date/Heure

Début de la période

Fin

Date/Heure

Fin de la période

Qte

Entier long

Quantité de l'article

VI. Les requêtes

Afin de pouvoir afficher pour chaque période le matériel disponible, on a besoin de réaliser quelques requêtes.

VI-A. R_Location

Cette requête joint simplement les tables T_Location, T_DetailLocation et T_Article :

Image non disponible
Aperçu de la requête affichant le détail des locations

VI-B. R_ArticlesOccupes_Jour

Cette requête réalise le produit cartésien entre la table T_Calendrier et la requête R_Location, pour afficher les quantités de matériels occupés par jour.

Image non disponible
Aperçu de la requête affichant le détail des matériels occupés

On constate que la requête comprend, dans la partie encerclée, un champ calculé que nous allons détailler.

Le champ calculé affichant la quantité de matériel loué
Sélectionnez

Qte: -[R_Location].[Qte]*([DateCalendrier] Entre [Debut_Loc] Et [Fin_Loc])

Cette formule renvoie la quantité louée à la date donnée par le calendrier ([DateCalendrier] ), si cette date est comprise dans la période de location (entre [Debut_Loc] et [Fin_Loc]), sinon renvoie zéro.

Les champs concernés :

  • [R_Location].[Qte] : champ donnant la quantité de matériel loué sur cette période ;
  • [DateCalendrier] : champ donnant la date du jour du calendrier ;
  • [Debut_Loc] : champ indiquant le début de la location ;
  • [Fin_Loc] : champ indiquant la fin de la location.

VI-C. R_ArticlesDispos_Jour

Cette requête « regroupement » basée sur la requête précédente affiche les quantités de matériels disponibles :

Image non disponible
Aperçu de la requête finale

On constate que la requête comprend dans la partie encerclée un champ calculé que nous allons détailler.

VI-C-1. L'expression donnant le nombre d'unités disponibles

Nous avons utilisé dans la requête les fonctions de regroupement Premier et Somme :

La formule donnant la quantité de matériel disponible
Sélectionnez

QteDispo: Premier([QteStock])-Somme([Qte])

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.

Les champs concernés :

  • [QteStock] : champ indiquant la quantité de l'article en stock au départ ;
  • [Qte] : champ indiquant la quantité du matériel occupé.

VI-D. R_ArticlesDispos_Periode

Cette requête reliant les tables T_PeriodeQte et T_Article affiche les quantités de matériels disponibles par période:

Image non disponible
Aperçu de la requête finale

On constate que la requête comprend dans la partie encerclée des champs calculés que nous détaillerons plus loin.

VII. Le formulaire des disponibilités

Nous allons décrire le formulaire qui affiche la disponibilité du matériel sur les différentes périodes prises en compte.

Image non disponible
Aperçu du formulaire des disponibilités

On constate que le programme permet de visualiser, pour l'article choisi, la quantité disponible par période.

VII-A. Les contrôles paramètres du sous-formulaire

Sur la partie haute du formulaire se trouvent les contrôles paramétrant la recherche de disponibilité :

  • [DateMini] : zone de texte au format date indiquant le début de la période de recherche ;
  • [DateMaxi] : zone de texte donnant la fin de la période ;
  • [IDArticle] : zone de liste déroulante pour choisir l'article concerné.

VII-A-1. Mise à jour du calendrier et des périodes

Pour mettre à jour les données sources du sous-formulaire, on a besoin d'écrire une procédure qui ajoute dans la table T_Calendrier les bonnes dates et qui crée ensuite les périodes correspondantes :

Code pour enregistrer les dates successives dans le calendrier
Sélectionnez

Public Sub MajCalendrier(debut As Date, fin As Date)
' Met à jour le calendrier en fonction des dates de début et de fin.
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim dt As Date

' Suppression des données contenues dans la table T_Calendrier.
DoCmd.SetWarnings False
DoCmd.RunSQL "delete * from T_Calendrier;"
DoCmd.SetWarnings True

'Ouverture de la table T_Calendrier.
Set db = CurrentDb
Set rs = db.OpenRecordset("T_Calendrier")

dt = debut

'Parcours de la période définie par les paramètres debut et fin passés en argument.
Do While dt <= fin

   rs.AddNew ' ajout du jour dans la table T_Calendrier.
   rs!DateCalendrier = dt
   rs.Update

   dt = dt + 1 ' prochain jour.

Loop

' Mise à jour des périodes successives avec la quantité correspondante.
MajPeriodes debut, fin

rs.Close
Set rs = Nothing

db.Close
Set db = Nothing

End Sub

Gros plan sur la procédure de mise à jour des périodes successives.

Code pour enregistrer les périodes et leur quantité
Sélectionnez

Public Sub MajPeriodes(debut As Date, fin As Date)
' Enregistre les périodes et leur quantité en fonction des arguments debut et fin.
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim dt1 As Date, dt2 As Date
Dim idA As Long, qte As Long

Set db = CurrentDb

' Ouverture de la requête R_ArticlesDispos_Jour et de la table T_PeriodeQte 

Set rs1 = db.OpenRecordset("R_ArticlesDispos_Jour")
Set rs2 = db.OpenRecordset("T_PeriodeQte")

DoCmd.SetWarnings False
DoCmd.RunSQL "delete * from T_PeriodeQte;"
DoCmd.SetWarnings True

Do Until rs1.EOF
  idA = rs1!IDArticle
  dt1 = rs1!jour: dt2 = rs1!jour
  qte = Nz(rs1!QteDispo, 0)
  
   Do While (rs1!IDArticle = idA) And (dt2 = rs1!jour) And (qte = Nz(rs1!QteDispo, 0))
      dt2 = dt2 + 1
      rs1.MoveNext
      If rs1.EOF Then Exit Do
   Loop
   
   If dt1 < dt2 Then
      rs2.AddNew
      rs2!IDArticle = idA
      rs2!debut = dt1
      rs2!fin = (dt2 - 1)
      rs2!qte = qte
      rs2.Update
    Else
      rs1.MoveNext
    End If
   
Loop

rs1.Close
Set rs1 = Nothing

rs2.Close
Set rs2 = Nothing

db.Close
Set db = Nothing

End Sub

VII-B. Le sous-formulaire pour afficher la disponibilité des articles

Sur la plus grande partie du formulaire se trouve le sous-formulaire qui affiche la disponibilité du matériel.

VII-B-1. Retour sur la requête R_ArticlesDispos_Periode

Cette requête reliant les tables T_PeriodeQte et T_Article affiche les quantités de matériels disponibles par période :

Image non disponible
Aperçu de la requête finale

On constate que la requête comprend dans la partie encerclée des champs calculés que nous allons détailler.

VII-B-1-a. L'expression donnant le nombre d'unités disponibles

La formule donnant la quantité de matériel disponible
Sélectionnez

QteDispo: Nz([Qte];[QteStock])

Les champs concernés :

  • [QteStock] : champ indiquant la quantité de l'article en stock au départ ;
  • [Qte] : champ indiquant la quantité de matériel occupé.

La fonction Nz renvoie la valeur du champ [QteStock] si le champ [Qte] contient une valeur nulle.

VII-B-1-b. Champ calculé indiquant le début de la période

La formule donnant le début de la période
Sélectionnez

Debut: Nz([Debut];[DateMini])

Les champs concernés :

  • [Debut] : champ indiquant le début de la période ;
  • [DateMini] : paramètre donnant la date de début de recherche.

La fonction Nz renvoie la valeur du paramètre [DateMini] si le champ date Debut contient une valeur nulle.

VII-B-1-c. Champ calculé indiquant la fin de la période

La formule donnant le début de la période
Sélectionnez

Debut: Nz([Fin];[DateMaxi])

Les champs concernés :

  • [Fin] : champ indiquant la fin de la période ;
  • [DateMaxi] : paramètre donnant la date de fin de recherche.

La fonction Nz renvoie la valeur du paramètre [DateMaxi] si le champ date Fin contient une valeur nulle.

VII-B-2. Requête source du sous-formulaire

Code SQL du sous-formulaire
Sélectionnez

SELECT T_PeriodeQte.IDArticle, T_Article.IDArticle, T_Article.RefArticle, T_Article.Description, Nz([Qte],[QteStock]) AS QteDispo, CDate(Nz([T_PeriodeQte.Debut],[DateMini])) AS Debut, CDate(Nz([T_PeriodeQte.Fin],[DateMaxi])) AS Fin
FROM T_Article INNER JOIN T_PeriodeQte ON T_Article.IDArticle = T_PeriodeQte.IDArticle
WHERE (((T_PeriodeQte.IDArticle) Like Nz([Forms]![F_Disponibilites]![IDArticle],"*")))
ORDER BY T_PeriodeQte.IDArticle, CDate(Nz([T_PeriodeQte.Debut],[DateMini])), CDate(Nz([T_PeriodeQte.Fin],[DateMaxi]));

VIII. Téléchargement

La base exemple a été réalisée en collaboration avec grpoirier.

Pour faciliter les tests et assurer sa portabilité, la base exemple n'utilisera pas de composants externes à Access (ActiveX ou autres).

La base exemplegerer_materiel_dispo est au format Access 2000.

IX. 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

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

  

Copyright © 2015 Denis Hulo. 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. Droits de diffusion permanents accordés à Developpez LLC.