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

Requêtes et SQL. Discussion :

Calcul sur plages glissantes


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Calcul sur plages glissantes
    Bonjour à tous, je me confie à vous car je ne trouve pas la solution à mon problème.

    L'objetcif de ma base est de rentrer des valeurs pour en obtenir des statistiques.

    Dans ma table on retrouve donc des heures, la date (chaque dernier jours de chaque mois), le nb d'accidents.

    Je souhaiterai pouvoir faire le calcul suivant Taux F = (somme des accidents sur 12mois glissants * 1 000 000)/(somme des heures sur 12 mois glissants)

    NB : ex pour mai09 : 12mois glissant de juin08 à mai09
    ex pour juin09 : 12mois glissants de juillet08 à juin09

    Le problème est qu'avec les dates je ne m'en sort pas, si je spécifie une plage dans une requête, impossible de faire la somme des heures car il considère que chaque date est un enregistrement différent, ce qui est logique.
    Ex
    31/01/09 1800
    29/02/09 2900
    31/03/09 789
    etc

    Help !

    Le top serait que je puisse enregistrer la valeur de cette requête dans une table sous le nom TF-Mois/Année, et que cette requete puisse se lancer juste en saisissant le mois.

    Ex TF Mai 09, on lance la requete qui ouvre un messagebox, on saisit mai09 et la requete calcule le TF considéré.

    Si je dois organiser ma table différemment c'est encore possible car je commence juste cette base, qui n'est pour l'heure qu'un pilote.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Il suffit de calculer l'intervalle de date et de ne pas sélectionner la date
    cela devrait donner un truc dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sql = "SELECT sum(heures) FROM ta_table WHERE date between '01/" &iif(mois=12;1;mois+1) &"/" iif(mois=12;an;an-1) &"' AND '01/" &mois+1 &"/" &an &"'"

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Ca ne marche pas, on doit bien taper ton code dans une requete, dans la ligne critère du champ "heures" ? j'ai essayé aussi de cliquer sur sql qui m'ouvre une nouvelle fenetre mais rien non plus.

    J'ai essayé de modifier un peu le code :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT sum(heures), date
    FROM TIntrants
    WHERE date between "01/"&iif(mois=12;01;mois+1)"/"&iif(mois=12;an;an-1) AND "01/"&mois+1"/"&an
    GROUP BY TIntrants.Heures;

    Mais çà ne marche toujours pas

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    C'est sur que si tu sélectionne le champ date, cela ne peut pas marcher. Si tu sélectionne la date, il va t'afficher une ligne par date ce qui fait que tu ne pourras pas avoir le nombre total sur tes douzes dates...

    Je pensais que tu écrivait ta requête dans du code VB et non pas que tu voulais simplement écrire une requête.

    Dans ton éditeur de requête, il te faut par exemple pour avoir le nombre total d'accidents (en mode SQL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Sum(heures) AS nbheures
    FROM TIntrants
    WHERE (((date)>"01/" & IIf([mois]=12,1,[mois]+1) & "/" & IIf([mois]=12,[an],[an]-1) And (date)<"01/" & IIf([mois]=12,1,[mois]+1) & "/" & IIf([mois]=12,[an]+1,[an])));
    et donc pour avoir ton taux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT sum(nbAccidents) * 1000000 / Sum(heures) AS Taux
    FROM TIntrants
    WHERE (((TIntrants.date)>"01/" & IIf([mois]=12,1,[mois]+1) & "/" & IIf([mois]=12,[an],[an]-1) And (TIntrants.date)<"01/" & IIf([mois]=12,1,[mois]+1) & "/" & IIf([mois]=12,[an]+1,[an])));

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci, çà marche et j'ai compris mon erreur.

    En revanche y a-t-il un moyen d'éxécuter cette requete automatiquement pour toutes les mois passés et conserver les valeurs de la requete dans une nouvelle table ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Citation Envoyé par mtitaud Voir le message
    En revanche y a-t-il un moyen d'éxécuter cette requete automatiquement pour toutes les mois passés et conserver les valeurs de la requete dans une nouvelle table ?
    Qu'est ce que tu entends par tous les mois passés ? Cela veut-il dire que par exemple, tu veux une fois par mois, faire le calcul de ton taux et le sauvegarder dans une table ?
    Si oui, tu peux faire une fonction
    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
     
    Public Sub CalculerTaux(ByVal Mois As Integer, ByVal Annee As Integer)
        Dim sql As String
     
        'création d'une requete d'insertion
        'il te faut avoir créé une table ta_Table_de_sortie avec 3 champ :
        ' -mois de type numérique entier
        ' -annee de type numérique entier
        ' taux de type numérique réel
        sql = "INSERT INTO ta_Table_de_sortie (mois, annee, taux) " _
        & "SELECT " & Mois & " as mois," & Annee & " as annee, sum(nbAccidents) * 1000000 / Sum(heures) AS Taux " _
        & "FROM TIntrants" _
        & "WHERE (((date)>#" & Format("01/" & IIf([Mois] = 12, 1, [Mois] + 1) & "/" & IIf([Mois] = 12, [Annee], [Annee] - 1), "mm/dd/yyyy") & "# And (date)<#" & Format("01/" & IIf([Mois] = 12, 1, [Mois] + 1) & "/" & IIf([Mois] = 12, [Annee] + 1, [Annee]), "mm/dd/yyyy") & "#))"
     
        CurrentDb.Execute sql
     
    End Sub
     
    'tu n'as plus qu'à appeler cette fonction à chaque fois que tu voudra calculer le taux en lui passant en paramètre le mois et l'année. cela t'enregistrera le résultat dans ta table

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Oui c'est exactement cela. Merci beaucoup.

    En revanche je ne sais pas intégrer ce code dans access, peux-tu me guider : je dois le mettre où ? comment je lance la fonction?.

    J'ai créer un nouveau module et j'ai mis le code, c'était cela qu'il fallait faire ? Je cherche dans les archives du site mais je m'y perd un peu...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Oui c'est cela. Il faut bien placer cette fonction dans un nouveau module.
    POur l'appeler, tu peux par exemple créér un formulaire avec un bouton et sur l'évènement click du bouton faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub BTonbouton_Click()
         'appeler la fonction créé précédement
         CalculerTaux(month(date), year(date))
         'month(date) te ressort le numéro de mois de la date du jour
         'year(date) te ressort l'année de la date du jour
    end sub

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, je vais essayer cela.

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Non çà ne marche j'ai, erreur de compilation : erreur de syntaxe avec la page vb qui s'ouvre. La 1ère ligne est en jaune

    Private Sub bttfcmsi_Click()
    'appeler la fonction créé précédement
    CTFCMSI (month(calendrier), year(calendrier))
    'month(date) te ressort le numéro de mois de la date du jour
    'year(date) te ressort l'année de la date du jour
    End Sub

    J'ai juste remplacé date par calendrier car la date s'apelle comme cela dans ma table. J'ai essayté des trucs mais systématiquement je tombe sur u ne erreur. Y avaiy-il des choses a modifier dans le code précédent ?

    date je remplace par calendrier
    mois, année évoqué dans la fonction --> il les trouve où dans ma table ?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Si tu veux calculer ton taux pour chaque mois/annee par rapports aux données présentes dans ta table TIntrants, il te aut plutôt faire une fonction comme ceci :

    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
     
    Private Sub bttfcmsi_Click()
    dim rs as dao.recordset
     
    set rs = currentdb.openrecordset("TIntrants")
     
    'on vide la table de sortie car on recalcule tout à chaque fois
    Currentdb.execute ("DELETE * FROM ta_Table_de_sortie")
    while not rs.eof
    'appeler la fonction créé précédement
    CTFCMSI (month(rs!calendrier), year(rs!calendrier))
    rs.movenext
    wend
    rs.close
    End Sub
    Cette fonction va parcourir ta table Tintrants ligne à ligne. Pour chaque ligne, cela va créer l'enregistrement correspondant dans ta_table_de_sortie.
    Par exemple, tu as dans TIntrants :
    calendrier | nbAccidents | heures
    ------------|-------------|--------
    31/01/2009 | 200 | 500
    28/02/2009 | 100 | 150
    31/03/2009 | 120 | 170
    30/04/2009 | 150 | 195
    ...

    lors du clic sur ton bouton, cela va te créer dans ta_table_de_sortie les enregistrements suivants
    mois | Année | Taux
    ------|----------|---------
    01 | 2009 | 145,23
    02 | 2009 | 58,23
    03 | 2009 | 49,32
    04 | 2009 | 64,25

    C'est bien cela que tu veux ?

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Oui c'est exactement cela mais : problème

    la ligne
    CTFCMSI (month(rs!calendrier), year(rs!calendrier))
    se met en rouge

    Le problème viendrait de ma fonction CTFCMSI que j'ai adaptée pour coller a ma base.

    NB : la table de sortie s'apelle "statistiques"

    La fonction CTFCMSI telle qu'elle est chez moi, il y a surement une erreur :

    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
    Public Sub CTFCMSI(ByVal Mois As Integer, ByVal Annee As Integer)
        Dim sql As String
     
        'création d'une requete d'insertion
        'il te faut avoir créé une table ta_Table_de_sortie avec 3 champ :
        ' -mois de type numérique entier
        ' -annee de type numérique entier
        ' taux de type numérique réel
     
        sql = "INSERT INTO statistiques (mois, annee, TF_CMSI) " _
        & "SELECT " & Mois & " as mois," & Annee & " as annee, sum(ATAA_CMSI)*1000000/Sum(Heures_CMSI) AS TF_CMSI " _
        & "FROM TIntrants" _
        & "WHERE (((calendrier)>#" & Format("01/" & IIf([Mois] = 12, 1, [Mois] + 1) & "/" & IIf([Mois] = 12, [Annee], [Annee] - 1), "mm/dd/yyyy") & "# And (calendrier)<#" & Format("01/" & IIf([Mois] = 12, 1, [Mois] + 1) & "/" & IIf([Mois] = 12, [Annee] + 1, [Annee]), "mm/dd/yyyy") & "#))"
     
        CurrentDb.Execute sql
     
    End Sub
    Crée dans le module 1

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    De plus je n'ai pas qu'un seul calcul a faire

    mais TF / TFA / TG pour CMSI / ETT / STT / CMSI+ETT. (soit 12 calculs chaque mois)

    Du coup le système de vider la base "statistiques" de ses valeurs avant chaque calcul va me faire perdre les autre calcul réalisés.

    Désolé je ne t'avais tout dit ce qui t'a certainement induit en erreur.

    Ha c'est compliqué !

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Citation Envoyé par mtitaud Voir le message
    Oui c'est exactement cela mais : problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        'il te manque un espace à la fin du TIntrants ou juste avant le WHERE :
        sql = "INSERT INTO statistiques (mois, annee, TF_CMSI) " _
        & "SELECT " & Mois & " as mois," & Annee & " as annee, sum(ATAA_CMSI)*1000000/Sum(Heures_CMSI) AS TF_CMSI " _
        & "FROM TIntrants " _
        & "WHERE (((calendrier)>#" & Format("01/" & IIf([Mois] = 12, 1, [Mois] + 1) & "/" & IIf([Mois] = 12, [Annee], [Annee] - 1), "mm/dd/yyyy") & "# And (calendrier)<#" & Format("01/" & IIf([Mois] = 12, 1, [Mois] + 1) & "/" & IIf([Mois] = 12, [Annee] + 1, [Annee]), "mm/dd/yyyy") & "#))"
    Tu peux créer une nouvelle fonction pour chaque calcul mais si dans ta table statistiques tu as une colonne par taux calculé, il faut alors plutôt modifier ta fonction actuelle et ajouter dans le SELECT les autres calculs à faire.
    Si tu fais 12 fonctions différentes, il t'insèrera 12 lignes pour 1 mois donné et je ne pense pas que ce soit ce que tu souhaite.

    Citation Envoyé par mtitaud Voir le message
    Du coup le système de vider la base "statistiques" de ses valeurs avant chaque calcul va me faire perdre les autre calcul réalisés.
    Si tu ne veux faire le calcul que pour le dernier mois, il te faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub bttfcmsi_Click()
    dim rs as dao.recordset
     
    set rs = currentdb.openrecordset("Select * TIntrants WHERE calendrier = (select max(calendrier) FROM Tintrants)")
    'de cette façon, il ne fera le calcul que sur la ligne
    'dont la date est la plus récente dans ta table TIntrants

  15. #15
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    J'ai fais les modifs, il n'y a plus d'erreurs mais rien ne se passe quand je clique sur le bouton de mon formulaire.

    Jette un oeil à mon fichier, j'ai zippé.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [DATA] Calcul sur fenêtres glissantes
    Par bol45 dans le forum SAS Base
    Réponses: 2
    Dernier message: 18/02/2015, 16h11
  2. [XL-2010] Somme sur plage glissante avec condition
    Par Blaiz58 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/06/2014, 14h07
  3. [AC-2007] Optimisation calcul sur periode glissante
    Par LouisT dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/02/2013, 18h08
  4. [Vxi3] Calcul sur année glissante
    Par BoCcool dans le forum Webi
    Réponses: 10
    Dernier message: 19/09/2012, 14h49
  5. [XL-2003] Calcul sur une plage de cellules
    Par kokoVBA dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/08/2009, 10h35

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