IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

problème de calcul d'une moyenne


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 109
    Par défaut problème de calcul d'une moyenne
    Salut,


    Je dois calculer la moyenne d'un champ d'une table sous Access.
    Chaque enregistrement contient les données suivante: Id, Date, X.
    Pour chaque mois, je dois calculer la somme du champs X puis je divise par le nombre d'années.

    Je veux expliquer un peu le problème:

    j'ai par exemple ceci:
    Id Date X
    1 01/09/2007 2
    1 02/09/2007 5
    ---
    1 30/09/2007 10
    ---
    1 17/09/2012 12


    la valeur à calculer est la somme des x pour le mois 9 (par exemple) terminé divisée par 5 car le mois 9 de l'année 2013 n'est pas encore terminé.

    j'ai essayé la fonction (Diff.year) pour trouver le nombre des années mais le résultat ne me convient pas car elle ne controle pas est ce que le mois est terminé ou non elle fais juste la soustraction de deux années.

    Avez vous un résonnement pour résoudre ce problème?

    Merci d'avance.


  2. #2
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    Bonjour Safine.

    Que ce soit avec la classe Date ou la classe DateTime, il est impossible d'effectuer une addition entre deux dates, car cela n'aurait pas de sens.
    Mais il est possible d'ajouter un nombre signé d'intervalles de temps à une date, et de soustraire deux dates en obtenant un nombre signé d'intervalles de temps, la durée d'un intervalle étant paramétrable.

    On peut ainsi calculer la moyenne de plusieurs dates en procédant comme suit :

    étant données n dates d1, d2, d3, ... dn, leur moyenne m vaut

    m = d1 + [(d2 - d1) + (d2 - d1) + ... (dn - d1)] / n
    Bon courage.

  3. #3
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    Rectification.

    La formule est

    m = d1 + [(d2 - d1) + (d3 - d1) + ... (dn - d1)] / n
    Mais vous avez probablement rectifié vous-même.

    Salutations.

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 109
    Par défaut
    Salut
    Merci Jean-Marie Grave.Je ne viens pas à comprendre l'utilité de votre proposition pour la résolution de mon problème
    Je veux expilquer le résultat voulu:

    Je calcule la somme de X pour un mois donné d'une année donnée

    Pour 09/07 on a une somme x1
    Pour 09/08 on a une somme x2
    Pour 09/09 on a une somme x3
    Pour 09/10 on a une somme x4
    Pour 09/11 on a une somme x5
    Pour 09/12 on doit pas calculer la somme car le mois n'a pas encore fini.

    moy=(x1+x2+x3+x4)/n, n= nombre des années
    est-il clair?

    Donc je dois faire des controles sur les dates
    1/ pour calculer (n)
    2/ Pour extraire les données X d'un mois déterminé d'une année bien déterminée

    Avez-vous une idée?
    Merci d'avance

  5. #5
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    Bonjour Safine.

    Votre problème m'a amusé. J'en ai donc fait un cas d'école, que je vous livre ci-dessous, en espérant qu'il vous sera utile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Public Class Acceuil
        Private Liste() As Date
        Private Const dDte As DateInterval = DateInterval.Day
     
        Private Sub Acceuil_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Configurer()
        End Sub
     
        Private Sub bClc_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bClc.Click
            Calculer()
        End Sub
     
        Private Sub Configurer()
            Dim i As Integer, n As Integer, Txt As String, Msg As String
            n = 10 : ReDim Liste(n) : Msg = ""
            For i = 0 To n
                Txt = (i + 1).ToString & "/05/2012"
                Liste(i) = DateValue(Txt)
            Next i
            For i = 0 To n
                Msg = Msg & Liste(i).ToShortDateString & vbCrLf
            Next i
            MsgBox(Msg)
        End Sub
     
        Private Sub Calculer()
            Dim i As Integer, n As Integer, Dte0 As Date, Difs As Double, Moy As Date
            n = Liste.Length - 1
            Dte0 = Liste(0) : Difs = 0
            For i = 1 To n
                Difs = Difs + CDbl(DateDiff(dDte, Dte0, Liste(i)))
            Next i
            Moy = DateAdd(dDte, Difs / n, Dte0) : MsgBox(Moy.ToShortDateString)
        End Sub
     
    End Class
    Cordialement.

  6. #6
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    C'est encore moi.

    Il se trouve que vous m'aviez fait une réponse pendant que je préparais le bout de code que je vous ai envoyé, dans l'hypothèse où il fallait faire une moyenne entre un certain nombre de dates.

    Veuillez m'excuser si ce n'es pas le cas.

  7. #7
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    S'il ne s'agit que de détecter si une date donnée Dt est du mois Ms et de l'année An, je vous propose la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Function DateExistante(ByVal Dt As Date, ByVal Ms As Integer, ByVal An As Integer) As Boolean
            Return (Dt.Month = Ms And Dt.Year = An)
        End Function
    Salutations.

  8. #8
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 109
    Par défaut
    Bonjour Jean-Marie Grave,

    Je vous remercie pour votre aide.

    J'ai résolu mon problème de ma manière. L'idée est de comparer la date actuelle à la date suivante: nbre_jour_mois_actuelle/num_mois_actuel/an
    et on joue sur la variable (an), on l'initialise au début au numéro de l'année minimale de la base, ensuite en l'incrémente par 1.
    et on calcule le nombre des années initialisé à 0.

    Voici le code, il peut être utile à quelqu'un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Dim date_min, date_finale, date_j As Date
            Dim somm, ap_j, moy As Double
            Dim num_j_min, num_mois_min, num_mois_actuel, num_an_actuel, nbre_j_mois_actuel, num_an_minimale, nbre_ans, an, i, j As Integer
            'on initialise i à 1
            i = 1
            'date minimale dans la base
            date_min = Me.Historiques_barragesTableAdapter1.ScalarQueryMin_Date()
     
            'num jour de la date minimale
            num_j_min = date_min.ToString("dd")
     
            'num mois de la date min
            num_mois_min = date_min.ToString("MM")
     
            'num de l'année de la date minimale
            num_an_minimale = date_min.ToString("yyyy")
     
            'num mois actuel
            num_mois_actuel = DateTimePicker1.Value.ToString("MM")
     
            'num de l'année actuelle
            num_an_actuel = DateTimePicker1.Value.ToString("yyyy")
     
            'nombre de jour du mois actuel
            nbre_j_mois_actuel = Date.DaysInMonth(num_an_actuel, num_mois_actuel)
            ' on initilise an à 
            an = num_an_minimale
            'date final de control
            date_finale = CDate(nbre_j_mois_actuel & "/" & num_mois_actuel & "/" & an)
     
            'on initialise le nombre d'années à 0
            nbre_ans = 0
            'on initilise la somme à 0
            somm = 0
            If (num_mois_min < num_mois_actuel) Or (num_mois_min = num_mois_actuel And num_j_min = 1) Then
                an = num_an_minimale
                       Else : an = num_an_minimale + 1
                      End If
            Do While DateTime.Compare(DateTimePicker1.Value.ToShortDateString, date_finale.ToShortDateString) > 0
                           For j = 1 To nbre_j_mois_actuel
                    date_j = CDate(j & "/" & num_mois_actuel & "/" & an)
                    ap_j = CDbl(Me.Matable.GetDataBy(i, date_j.ToShortDateString).Item(0).X)
                    somm = somm + ap_j
                Next
                nbre_ans = nbre_ans + 1
                an = an + 1
                date_finale = CDate(nbre_j_mois_actuel & "/" & num_mois_actuel & "/" & an)
            Loop
                  moy = somm / nbre_ans

    Mes salutations Jean-Marie Grave, j'espère que mon code vous plait.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Calcul d'une moyenne pondérée
    Par BertMont dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/06/2007, 09h49
  2. Calcul d'une moyenne pondérée
    Par solorac dans le forum Excel
    Réponses: 1
    Dernier message: 21/05/2007, 16h54
  3. [Tableaux] Calcul d'une moyenne à partir d'un tableau
    Par Mordanus dans le forum Langage
    Réponses: 13
    Dernier message: 09/05/2007, 18h03
  4. Problèmes de calcul dans une requete imbriquée
    Par LeNovice dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/03/2007, 16h56
  5. requete sql : calcul d'une moyenne
    Par timide94 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 16/01/2007, 19h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo