Date de rupture sous Access ou VBA

donlefou Messages postés 44 Statut Membre -  
donlefou Messages postés 44 Statut Membre -
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. nico7382 Messages postés 287 Statut Membre 50
     
    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
    0
  2. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    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...
    0
  3. donlefou Messages postés 44 Statut Membre
     
    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.
    0
  4. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    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...
    0
    1. donlefou Messages postés 44 Statut Membre
       
      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.
      0
    2. donlefou Messages postés 44 Statut Membre
       
      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.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    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...
    0
    1. donlefou Messages postés 44 Statut Membre
       
      Merci Blux, je vais essayer ça et je te réponds demain !
      0
    2. donlefou Messages postés 44 Statut Membre
       
      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
      0
    3. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      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...
      0
      1. donlefou Messages postés 44 Statut Membre > blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Ca 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.
        0
  7. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    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...
    0
    1. donlefou Messages postés 44 Statut Membre
       
      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.
      0
    2. donlefou Messages postés 44 Statut Membre
       
      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...
      0
    3. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      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é...
      0
  8. donlefou Messages postés 44 Statut Membre
     
    ça ne me donne pas les bonnes dates, j'ai juste la dernière date et non la date de ruptutre
    0
  9. donlefou Messages postés 44 Statut Membre
     
    Merci Blux, je vais tester et je te repondrais
    0
  10. donlefou Messages postés 44 Statut Membre
     
    C'est bon Blux, ça semble marcher. Je te remercie. Je fais tourner mon appli pendant qq temps pour tester;
    0