Date de rupture sous Access ou VBA

Fermé
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007 - 18 juil. 2005 à 10:13
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007 - 20 juil. 2005 à 15:47
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

nico7382 Messages postés 279 Date d'inscription lundi 6 juin 2005 Statut Membre Dernière intervention 22 décembre 2010 50
18 juil. 2005 à 10:38
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
blux Messages postés 26490 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 novembre 2024 3 315
18 juil. 2005 à 10:42
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
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
18 juil. 2005 à 15:09
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
blux Messages postés 26490 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 novembre 2024 3 315
18 juil. 2005 à 15:21
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
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
18 juil. 2005 à 15:45
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
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
18 juil. 2005 à 16:05
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blux Messages postés 26490 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 novembre 2024 3 315
18 juil. 2005 à 16:13
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
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
18 juil. 2005 à 16:40
Merci Blux, je vais essayer ça et je te réponds demain !
0
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
19 juil. 2005 à 14:42
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
blux Messages postés 26490 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 novembre 2024 3 315
19 juil. 2005 à 15:32
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
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007 > blux Messages postés 26490 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 novembre 2024
19 juil. 2005 à 15:58
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
blux Messages postés 26490 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 novembre 2024 3 315
19 juil. 2005 à 16:21
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
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
19 juil. 2005 à 16:35
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
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
19 juil. 2005 à 17:24
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
blux Messages postés 26490 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 novembre 2024 3 315
20 juil. 2005 à 11:30
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
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
20 juil. 2005 à 10:59
ça ne me donne pas les bonnes dates, j'ai juste la dernière date et non la date de ruptutre
0
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
20 juil. 2005 à 11:51
Merci Blux, je vais tester et je te repondrais
0
donlefou Messages postés 44 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 28 juin 2007
20 juil. 2005 à 15:47
C'est bon Blux, ça semble marcher. Je te remercie. Je fais tourner mon appli pendant qq temps pour tester;
0