Date de rupture sous Access ou VBA

salut, j'ai un probleme pour calculer/afficher les dates de rupture pour des commandes de produits. Voici un exemple des données de ma table:
RéférenceProduit Stock QtéCommandes DateCdes
REF1 1000 40 15/01/05
REF1 1000 500 16/01/05
REF1 1000 490 17/01/05
REF1 1000 20 19/01/05

Voilà, le produit REF1 a un stock de 1000 (meme s'il est affiché plusieurs fois, il n'y a qu'un stock de 1000!!!), on a 4 commandes avec des Qté différentes et à différentes dates. Donc je voudrais récupérer la date de rupture c'est-à-dire la date à laquelle mes commandes dépassent le stock : ici 40+500+490 > 1000 donc je voudrais récupérer la date 17/01/05. Comment on peut faire sous access (requête, table ????) ou VBA. Aidez-moi svp...

9 réponses

  1. Salut,

    je pense que sous VBA c'est plus facile:

    il faut faire une requete pour avoir tout tes REF1 order by daterupture

    initialiser SommeQtéCommande à QtéCommande

    puisbouclé dessus tant que Stock>SommeQtéCommande (ou plus d'enregistrement)

    passer au suivant
    ajouter QtéCommande à SommeQtéCommande
    revenir dans la boucle

    en sortant de la boucle la date de rupture est la daterupture de l'element courant
    1. Modérateur
      Salut,

      il faut utiliser du vba pour parcourir une requête temporaire (celle qui renvoir les résultats par produit, dont tu donnes l'exemple), additionner les commandes et lorsqu'elles sont supérieures au stock, renvoyer la date...

      Si tu me donnes un peu plus de détail (on affiche où la date ? la requête renvoie-t'elle plusieurs produits ?...), je peux te faire une ébauche de code...
      1. J'ai une table "Commandes" comme ceci:
        Référence Stock Qté Date
        REF1 1000 40 05/07/05
        REF1 1000 500 06/07/05
        REF1 1000 490 08/07/05
        REF1 1000 20 10/07/05
        REF2 500 300 04/07/05
        REF2 500 250 05/07/05

        (le stock est unique pour une REF!! même si je le réaffiche)

        Je voudrais obtenir une (autre) table comme ceci :
        Référence Stock Qté DateRupture
        REF1 1000 1050 08/07/05
        REF2 500 550 05/07/05

        (je fais la somme des Qté commandées et j'affiche seulement la date de rupture)
        Tu pourrais me dire comment faire en VBA ? Parce que je ne maitrise pas trop ce langage.
        1. Modérateur
          Quand est-ce que tu veux calculer tes dates ?
          Tu vas en faire quoi de ta table résultat ?

          Je te prépare un peu de code...
          1. les dates sont calculés tout le temps (en fait à chaque lancement de mon application). J'ai un code VBA qui fait tourner l'appli, qui lance les formulaires, les états, initialisation...La table avec toutes les commandes et dates peut changer toutes les heures, il faut donc une fonction qui calcule les dates de ruptures qui s'exécute à chaque lancement de l'application. Concernant la table résultat, je veux juste l'afficher avec un état mais ça je sais faire, il me faut juste la table résultat avec les bonnes dates, mises à jour si la table des commandes changent.
            J'espère que je suis assez clair dans mon explication, sinon je peux te détailler davantage.
          2. les dates sont calculés tout le temps (en fait à chaque lancement de mon application). J'ai un code VBA qui fait tourner l'appli, qui lance les formulaires, les états, initialisation...La table avec toutes les commandes et dates peut changer toutes les heures, il faut donc une fonction qui calcule les dates de ruptures qui s'exécute à chaque lancement de l'application. Concernant la table résultat, je veux juste l'afficher avec un état mais ça je sais faire, il me faut juste la table résultat avec les bonnes dates, mises à jour si la table des commandes changent.
            J'espère que je suis assez clair dans mon explication, sinon je peux te détailler davantage.
        2. Modérateur
          Tu crées une table nommé "Tab-sortie" avec tous les champs suivants :

          - 1 champ de clé, numéroauto
          - 1 champ REF, texte
          - 1 champ Stock, numérique
          - 1 champ Qté, numérique
          - 1 champ DateRup, date

          Tu recopies le code suivant dans l'évènement "sur clic" d'un bouton de commande, et hop, y'a plus qu'a appuyer (mais la table tab-sortie ne se vide jamais, à toi de la gérer) :
          Dim Rs As Recordset
          Dim Rs1 As Recordset
          Dim AncRef As String
          Dim Ref As String
          Dim Qté As Integer
          Dim Stock As Integer
          Dim Datee As Date
          Dim SumCde As Integer
          Dim DateRup As Date
          Dim BooFirst As Boolean
          AncRef = ""
          SumCde = 0
          BooFirst = True
          Set Rs = CurrentDb.OpenRecordset("select [Référence],Stock,Qté,Date from Commandes order by 1,4")
          Set Rs1 = CurrentDb.OpenRecordset("Tab-sortie", dbOpenTable, dbAppendOnly)
          While Not Rs.EOF
              With Rs
                  Ref = !référence
                  Stock = !Stock
                  Qté = !Qté
                  Datee = !Date
                  If BooFirst = True Then
                      BooFirst = False
                      AncRef = Ref
                  End If
                  If AncRef <> Ref Then
                      With Rs1
                          .AddNew
                          !référence = Ref
                          !Stock = Stock
                          !Qté = SumCde
                          !DateRup = DateRup
                          .Update
                      End With
                      AncRef = Ref
                      SumCde = 0
                  End If
                  SumCde = SumCde + Qté
                  If SumCde > Stock Then
                      DateRup = Datee
                  End If
              End With
          Rs.MoveNext
          Wend
          With Rs1
              .AddNew
              !référence = Ref
              !Stock = Stock
              !Qté = SumCde
              !DateRup = Datee
              .Update
          End With
          Rs.Close
          Rs1.Close
          Set Rs = Nothing
          Set Rs1 = Nothing


          Si tu as des soucis, je revois cela demain...
          1. Merci Blux, je vais essayer ça et je te réponds demain !
          2. Salut, Blux, ton code ne me donne pas les bon résultats:
            il y a des dates bizarre comme 30/12/1899, les sommes de quantité ne sont pas bonnes, il manque des fois des résultats.
            Je voudrais aussi ne rien afficher pour la date s'il n'y a pas de rupture de stock.

            Dans la table de sortie, je voudrais afficher :
            - la référence
            - le stock
            - la somme des quantités commandés globale de cette référence(et non la somme des quantités commandés à partir duquel il y a rupture)
            - la date de rupture ,sinon ne rien afficher si pas de rupture

            Voici le code que j'ai légèrement modifié: en effet j'ouvre ma table (requête) "PB_CDC_DateRupture" qui contient toutes les commandes et leurs dates. Voici les champs de cette table : "Référence","Quantité","Quantitée Cumulée", "Date". (Quantité = Stock et Quantité Cumulée = Quantité de la commande.)

            Function DateRupture()

            Dim Rs As Recordset
            Dim Rs1 As Recordset
            Dim AncRef As String
            Dim REF As String
            Dim Qté As Long 'Integer
            Dim Stock As Long 'Integer
            Dim Datee As Date
            Dim SumCde As Long 'Integer
            Dim DateRup As Date
            Dim BooFirst As Boolean
            AncRef = ""
            SumCde = 0
            BooFirst = True
            Set Rs = CurrentDb.OpenRecordset("PB_CDC_DateRupture")
            'Set Rs = CurrentDb.OpenRecordset("select [Référence],Stock,Qté,Date from Commandes order by 1,4")
            Set Rs1 = CurrentDb.OpenRecordset("TabRup")
            While Not Rs.EOF
            With Rs
            REF = !Référence
            Stock = !Quantité '!Stock
            Qté = Nz(![Quantité Cumulée], 0) '!Qté
            Datee = Nz(!Date, 0)
            If BooFirst = True Then
            BooFirst = False
            AncRef = REF
            End If
            If AncRef <> REF Then
            With Rs1
            .AddNew
            !Référence = REF
            !Stock = Stock
            !Qté = SumCde
            !DateRup = DateRup
            .Update
            End With
            AncRef = REF
            SumCde = 0
            End If
            SumCde = SumCde + Qté
            If SumCde > Stock Then
            DateRup = Datee
            Else
            DateRup = 0
            End If
            End With
            Rs.MoveNext
            Wend
            With Rs1
            .AddNew
            !Référence = REF
            !Stock = Stock
            !Qté = SumCde
            !DateRup = Datee
            .Update
            End With
            Rs.Close
            Rs1.Close
            Set Rs = Nothing
            Set Rs1 = Nothing

            End Function
          3. Modérateur
            Le truc le plus important, c'est de veiller à ce que les données en entrée soient triées par produit et date, sinon ça met le b...

            Or, quand tu ouvres ton recordset rs, tu ne mets que le nom de la table, sans indiquer après un .movefirst.

            Le système te renvoiera donc les données selon l'index primaire de ladite table, pas forcément en commençant au premier enregistrement, et pour toi sûrement des erreurs imprévues car les enregistrements ne sont pas en séquence...

            Ouvre ton recordset rs avec un select (avec order by) basé sur ta table PB_CDC_DateRupture, et redis-m'en des nouvelles...
          4. @bluxCa ne marche toujours pas.

            Voila un extrait de ma table initiale (trié par ref et date) "PB_CDC_DateRupture":
            Référence Quantité Quantité Cumulée Date
            00036501 733
            00044011 0 12 21/07/2005
            00044011 0 20 22/07/2005
            00044011 0 40 26/07/2005
            00044011 0 50 26/07/2005
            00044011 0 60 03/08/2005
            00044051 20
            00045011 0 25 26/07/2005
            00045031 55 50 19/07/2005
            00045031 55 200 20/07/2005
            00045051 45
            00045071 15 5 20/07/2005
            (case vide = pas de commande, Quantité = Stock et Quantité Cumulée = Qté Commandée)

            Voilà un extrait de ma table résultat "TabRup":
            Référence Stock Qté DateRup
            00044011 0 0 30/12/1899
            00044051 20 182 03/08/2005
            00045011 0 0 30/12/1899
            00045031 55 25 26/07/2005
            00045051 45 250 20/07/2005
            00045071 15 0 30/12/1899
            00045091 10 5 30/12/1899
            00045121 5 0 30/12/1899
            00045191 10 0 30/12/1899
            00045961 14 0 30/12/1899
            00046011 0 50 26/07/2005
            00046031 0 15 26/07/2005
            00046051 265 0 30/12/1899
            00046071 70 0 30/12/1899

            Dans le code j'ai juste remplacé
            "Set Rs = CurrentDb.OpenRecordset("PB_CDC_DateRupture")
            par
            "Set Rs = CurrentDb.OpenRecordset("select Référence,Quantité,[Quantité Cumulée],Date From PB_CDC_DateRupture Order By

            Référence,Date")"

            Je voudrais obtenir le résultat suivant :
            Référence Quantité Quantité Cumulée Date
            00036501 733
            00044011 0 182 21/07/2005
            00044051 20
            00045011 0 25 26/07/2005
            00045031 55 250 20/07/2005
            00045051 45
            00045071 15 5

            Quand il n'y a pas de rupture, on affiche pas de date mais on continue d'afficher la ref, le stock et la somme des quantités
            commandés.
        3. Modérateur
          Une petite erreur dans mon code :

          With Rs1
          .AddNew
          !Référence = REF
          !Stock = Stock
          !Qté = SumCde
          !DateRup = DateRup
          .Update
          End With

          Mettre

          !Référence = AncRef

          Par contre, je ne comprends pas comment tu peux avoir des "vides" dans les quantités, il devrait y avoir des zéros...

          Pour le reste, je vais voir...
          1. Les cases vides sont une contrainte qu'on me donne, sinon pour faire les calculs sur les cases vides je les transforme en 0 avec la fonction Nz(champ,valeur si vide).
            Par exemple :
            !Qté = Nz(Quantité,0)

            Je voudrais te poser une question aussi, concernant les dates. J'affiche juste les dates qd il y a rupture (avec le code
            SumCde > SumCde +Qté
            DateRup = Datee )

            Comment faire si je ne veux pas afficher de date lorsqu'il n'y a pas rupture :
            DateRup = 0 ou "" ou NULL .....

            Si tu travailles sur le code, tu pourrais me l'envoyer une fois "complet", merci. N'hésite pas à me demander d'autre précision si t'en as besoin. En fait ce n'est qu'un petit bout de mon application access/vba et je peux pas avancer si je n'arrive pas à récupérer ces dates de rupture.
          2. Blux, pour simplifier la tache, je n'ai pas besoin de récupérer la somme des quantités commandées. On affiche donc juste:
            la référence, le stock, et la date éventuelle de rupture. Je ne sais pas si ça va diminuer le problème...
          3. Modérateur
            Ayais !
            Dim Rs As Recordset
            Dim Rs1 As Recordset
            Dim Ref As String
            Dim AncRef As String
            Dim Qté As Integer
            Dim Stock As Integer
            Dim AncStock As Integer
            Dim Datee As Date
            Dim SumCde As Integer
            Dim DateRup As Date
            Dim BooFirst As Boolean
            Dim BooDate As Boolean
            AncRef = ""
            SumCde = 0
            AncStock = 0
            BooFirst = True
            BooDate = False
            DateRup = #1/1/1900#
            Set Rs = CurrentDb.OpenRecordset("select [Référence],Stock,Qté,Date from Commandes order by 1,4")
            Set Rs1 = CurrentDb.OpenRecordset("Tab-sortie", dbOpenTable, dbAppendOnly)
            While Not Rs.EOF
                With Rs
                    Ref = !référence
                    Stock = Val(Nz(!Stock, 0))
                    Qté = Val(Nz(!Qté, 0))
                    Datee = Nz(!Date, #1/1/1900#)
                    If BooFirst = True Then
                        BooFirst = False
                        AncRef = Ref
                    End If
                    If AncRef <> Ref Then
                        With Rs1
                            .AddNew
                            !référence = AncRef
                            !Stock = AncStock
                            If SumCde = 0 Then
                                !Qté = ""
                            Else
                                !Qté = SumCde
                            End If
                            If DateRup = "01/01/1900" Then
                                !DateRup = Null
                            Else
                                !DateRup = DateRup
                            End If
                            .Update
                            BooDate = False
                            DateRup = #1/1/1900#
                            SumCde = 0
                        End With
                        AncRef = Ref
                        SumCde = 0
                    End If
                    SumCde = SumCde + Qté
                    AncStock = Stock
                    If SumCde > Stock And BooDate = False Then
                        DateRup = Datee
                        BooDate = True
                    End If
                End With
            Rs.MoveNext
            Wend
            With Rs1
                .AddNew
                !référence = AncRef
                !Stock = AncStock
                If Qté = 0 Then
                    !Qté = ""
                Else
                    !Qté = SumCde
                End If
                If DateRup = "01/01/1900" Then
                    !DateRup = Null
                Else
                    !DateRup = DateRup
                End If
                .Update
            End With
            Rs.Close
            Rs1.Close
            Set Rs = Nothing
            Set Rs1 = Nothing

            Les contraintes :

            Les champs 'stock, qté' de la table 'commandes' sont de type texte avec 'chaine vide autorisée' à 'oui'

            Les champs 'stock, qté, daterup' de la table 'tab-sortie' sont de type texte avec 'chaine vide autorisée' à 'oui'

            Et ça marche bien, c'était rigolo à faire... mais j'ai pas optimisé...
        4. ça ne me donne pas les bonnes dates, j'ai juste la dernière date et non la date de ruptutre
          1. C'est bon Blux, ça semble marcher. Je te remercie. Je fais tourner mon appli pendant qq temps pour tester;