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

IHM Discussion :

[A-03] réalisation de graphiques multi-courbes depuis sélection variable en vba


Sujet :

IHM

  1. #1
    Membre du Club Avatar de thiefer
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 94
    Points : 61
    Points
    61
    Par défaut [A-03] réalisation de graphiques multi-courbes depuis sélection variable en vba
    Bonjour à tous,

    j'essaie d'illustrer des résultats statistiques sur des graphiques access mais je ne vos pas trop comment m'y prendre entre utiliser l'assistant graphique limité semble t'il à une seule courbe par controle, la création de requête croisée ou sélection, la création de formulaire graphe croisé dont je ne parviens pas à faire apparaître d'autre résultat que la somme de mes champs...

    Voici le détail de mon besoin :
    Je crée en vba une requête entièrement paramétrable depuis un formulaire.
    Je réalise des variables strselect, strwhere, strgroupby et strorderby fonction de ma sélection d'analyse souhaitée.
    Je complète ensuite soit avec un strtransform si usage d'une reqête croisée, soit directement mon strselect si requête sélection de 7 champs calculés.
    Les 3 premiers d'entre eux, temps total, temps moyen et temps max devront appraître dans un premier graphique.
    Les 4 suivants, fréquence moyenne, fréquence max moyenne, fréquence max et FCM théorique (ou calculée) devront appraître sur un seconde graphique.
    Je souhaite dessiner les champs totaux sous forme de bâtons et les champs moyennes sous forme de courbes sur le même graphique.
    Enfin vous l'aurez compris, ma maille de sélection est variable, toutes les combinaisons sont possibles entre Année, Trimestre, Mois, Semaine et Jour.

    Par exemple, je veux mes stats par année / Mois
    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
    SELECT 
    tbl_sport.sport AS [Sport], 
    Year(date) AS [Année], 
    StrConv(Format([date],"mmmm"),3) AS [Mois], 
    Int((Sum(temps*86400))/3600) & ":" & Format(Int(((Sum(temps*86400)) Mod 3600)/60),"00") & ":" & Format(((Sum(temps*86400)) Mod 3600/60),"00") AS [Temps Tot], 
    Int((Avg([temps]*86400))/3600) & ":" & Format(Int(((Avg([temps]*86400)) Mod 3600)/60),"00") & ":" & Format(((Avg([temps]*86400)) Mod 3600/60),"00") AS [Temps Avg], 
    Max(temps) AS [Temps Max], 
    Round(Sum(temps*fmoy)/Sum(temps),0) AS [Frq Avg], 
    Round(Avg(fmax),0) AS [Frq Max Avg],
    Max(fmax) AS [Frq Max],
    fcm As [FCM] 
    FROM tbl_sport INNER JOIN tbl_donnees ON tbl_sport.no_sport = tbl_donnees.no_sport 
    WHERE ((date >=#14/04/2002# AND date <=#28/10/2008#)) 
    GROUP BY tbl_sport.sport, Year(date), StrConv(Format([date],"mmmm"),3), Month(date) 
    ORDER BY tbl_sport.sport, Year(date), Month(date);
    Ou je veux mes stats par jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT 
    tbl_sport.sport AS [Sport], 
    Format([date],"dddd") AS [Jour], 
    Int((Sum(temps*86400))/3600) & ":" & Format(Int(((Sum(temps*86400)) Mod 3600)/60),"00") & ":" & Format(((Sum(temps*86400)) Mod 3600/60),"00") AS [Temps Tot], 
    Int((Avg([temps]*86400))/3600) & ":" & Format(Int(((Avg([temps]*86400)) Mod 3600)/60),"00") & ":" & Format(((Avg([temps]*86400)) Mod 3600/60),"00") AS [Temps Avg], 
    Max(temps) AS [Temps Max], 
    Round(Sum(temps*fmoy)/Sum(temps),0) AS [Frq Avg], 
    Round(Avg(fmax),0) AS [Frq Max Avg],
    Max(fmax) AS [Frq Max],
    fcm As [FCM] 
    FROM tbl_sport INNER JOIN tbl_donnees ON tbl_sport.no_sport = tbl_donnees.no_sport 
    WHERE ((date >=#01/01//2008# AND date <=#28/10/2008#)) 
    GROUP BY tbl_sport.sport, DatePart("w",[date],2,2), Format([date],"dddd") 
    ORDER BY tbl_sport.sport, DatePart("w",[date],2,2);
    Pourriez-vous m'indiquer ce qui vous semblerait la meilleure façon de procéder svp, j'ai fouliier plusieurs tutos sur le site mais je ne parviens pas à me dépatouiller du sujet.

    Merci par avance de toute votre aide,

    @ bientôt

    TF

  2. #2
    Membre du Club Avatar de thiefer
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 94
    Points : 61
    Points
    61
    Par défaut
    Bonjour à tous,
    j'ai avancé sur mon problème mais j'ai l'impression de le creuser un peu plus en vérité...

    Je ne parviens absolument pas à me dépêtrer du graph croisé dynamique qui s'obstine (probablement avec une très bonne raison, en tous cas la sienne) à ne me proposer que le compte des enregistrements plutôt que leur somme comme je souhaite le faire pour le temps total par exemple.
    J'ai donc fait quelques test avec l'assistant graphique de base et voici où je me trouve à présent :
    puisque mes sélections seront variables, je décide d'agréger toutes mes sélections sur un seul champ résultant que je nomme [Analyse] et que je construit sous vba par une variable strselect.
    Je place ce champ en entête de ligne dans ma requête croisée.
    Je place le champ [sport] en entête de colonne.
    Je positionne mon [Temps Total en champ détail.
    Cela me donne la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TRANSFORM Int((Sum(temps*86400))/3600) & ":" & Format(Int(((Sum(temps*86400)) Mod 3600)/60),"00") & ":" & Format(((Sum(temps*86400)) Mod 3600/60),"00") AS [Temps Tot]
    SELECT Year(date) & " / " & StrConv(Format([date],"mmm"),3) AS Analyse
    FROM tbl_sport INNER JOIN tbl_donnees ON tbl_sport.no_sport=tbl_donnees.no_sport
    WHERE (((tbl_donnees.date)>=#4/14/2002# And (tbl_donnees.date)<=#10/28/2008#))
    GROUP BY Year(date) & " / " & StrConv(Format([date],"mmm"),3), Year(date), Month(date)
    ORDER BY Year(date), Month(date)
    PIVOT tbl_sport.sport;
    Ce n'est pas l'idéal mais en l'état cela fonctionne même s je n'ai pas le rendu souhaité.

    Mais !!!!

    Comment inclure une seconde courbe, soit le temps moyen de course par sport dans cette requête qui ne semble pas accepter deux champs de détails ?

    Sinon, c'est que je fais certainement fausse piste , en cas, laquelle dois-je suivre ?

    Enfin, s'il n'y a pas possibilité de réaliser ceci sous access, est-il possible d'importer sous access des graphiques générés dans excel ?
    Et comment s'y prendre ?

    Merci par avance de votre aide

    @+ tard

    TF

  3. #3
    Membre du Club Avatar de thiefer
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 94
    Points : 61
    Points
    61
    Par défaut
    Bonjour, toujours pas de nouvelles ?

    sighhh !!!

    De mon côté, en continuant de fouiller j'apure les limites des possibilités offertes par access.
    Tout d'abord, la raison qui faisait que mon graphe croisé dynamique ne me permettait pas de faire la somme de mes temps, venait de ma requête sql qui formatait mon temps en champ texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int((Sum(temps*86400))/3600) & ":" & Format(Int(((Sum(temps*86400)) Mod 3600)/60),"00") & ":" & Format(((Sum(temps*86400)) Mod 3600/60),"00") AS [Temps Tot]
    Du coup, il aime pas et ne me propose en calcul automatique de mes champs totaux que l'option compte.
    Je règle ce problème avec une simplification de mon instruction sql qui fait la somme standard de mes temps, le champ résultant devient numérique, soit pour 01:39:37 la valeur 0,691782407407407
    Je peux donc utiliser le graphe croisé dynamique avec la possibilité de mettre plusieurs courbes sur un même graphe et d'avoir un fonctionnement qui me convient assez.

    Deux limites à présent :
    1 -
    comment faire pour que ce graphique croisé accepte un second axe d'ordonnée sur la droite du graphique (comme sous excel avec un axe principal à gauche et secondaire à droite) avec évidemment une échelle différente.
    J'ai bien vu le second axe d'ordonnée dans les options mais il semble rester à gauche et je n'arrive pas à avoir sur le même plan les deux échelles différentes.
    2 - mon temps total est supérieur à 24h mais la possibilité offerte de modifier le format de l'axe d'ordonnée ne m'ouvre pas le choix personnalisé comme c'est le cas lorsque j'utilise l'assistant graphique ([h]:mm:ss).
    J'ulise donc le format heure complet mais il affiche de 0 à 24h puis recommence au delà de 24h à 0

    Quelqu'un saurait-il me guider pour résoudre mes petits problèmes svp ?

    Merci d'avance pour toute les bribes d'aide que vous pourriez m'apporter.

    @ bientôt

    TF

  4. #4
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 910
    Points : 4 808
    Points
    4 808
    Par défaut
    bonjour,

    1) formattage de l'axe secondaire (il s'installe à droite par défaut) :
    tu sélectionnes l'axe secondaire puis dans le menu Format / Axe sélectionné puis l'onglet Echelles ...


    2) on peut additionner des temps en heures en utilisant un formattage comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    format (Int (totalTemps*24) + Hour(totalTemps), "#,##0") & ":" & format(totalTemps, "nn:ss")
    Int extrait le nombre entier de jours
    Hour extrait les heures inférieures à 1 jour
    ...
    Reste à l'adapter à ton contexte



  5. #5
    Membre du Club Avatar de thiefer
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 94
    Points : 61
    Points
    61
    Par défaut
    Salut micniv, et les autres...

    alors j'y ai cru, un instant, mais non, on n'y est pas encore...

    En fait, pour la question de l'axe secondaire, merci bcp, même si dans ma version d'access il est installé par défaut à gauche, je n'avais pas vu l'option disposition.
    Je peux donc à présent mettre mon axe secondaire à droite, c'est excellent !!

    Seulement voilà, je ne me sors pas du jeu sur les échelles !!!
    En effet, je te prend mon exemple, j'ai un axe principal pour lequel j'ai une valeur max par défaut = 1,2 (24h48 de total)
    Je vais sur mon axe secondaire et en modifie l'échelle en lui mettant 0,1 (2h24 de moyenne).
    Et là, c'est le drame , les deux axes sont paramétrés au max de l'axe secondaire. Je ne parviens donc pas à afficher et, mon temps total sur une échelle, et, mon temps moyen sur un autre échelle, de façon lisible sur le même graphe.
    Il y a certainement encore un truc que je zappe mais lequel ????


    Sinon, question format d'affichage des valeurs de mon axe principal qui excède 24h.
    La solution que tu me préconises crée également un champ [Temps Total] de type texte.
    Donc, quand je le positionne en champ résultat de mon gcd, la seule fonction imposée et possible pour le champ est une nouvelle fois compte. Impossible donc d'afficher la somme comme je parviens à le faire en ne formatant pas mon calcul de [Temps Total] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Sum(tbl_donnees.temps) AS [Temps Total]
    FROM tbl_donnees;
    help, I need somebody, help...
    TF

  6. #6
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 910
    Points : 4 808
    Points
    4 808
    Par défaut
    1) pour les axes, il s'agit bien d'axes Y. Si tu as 2 séries de données les échelles, Min et Max des axes doivent être indépendants ...

    2)
    La solution que tu me préconises crée également un champ [Temps Total] de type texte.
    Je t'ai rien préconisé je t'ai dit d'adapter ce bout de code ; je suis d'accord avec toi, il te faut en final une grandeur mesurable : un nombre une date ...

    Bon courage

  7. #7
    Membre du Club Avatar de thiefer
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 94
    Points : 61
    Points
    61
    Par défaut
    Salut à tous,

    les mots étant souvent superflus, voici du visuel.
    En miniature, le gcd obtenu depuis la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tbl_sport.sport AS Sport, Year(date) AS Année, StrConv(Format([date],"mmmm"),3) AS Mois, Sum(tbl_donnees.temps) AS [Temps Total], Avg(tbl_donnees.temps) AS [Temps Avg]
    FROM tbl_sport INNER JOIN tbl_donnees ON tbl_sport.no_sport = tbl_donnees.no_sport
    GROUP BY tbl_sport.sport, Year(date), StrConv(Format([date],"mmmm"),3), Month(date)
    ORDER BY tbl_sport.sport, Year(date), Month(date);
    qui me donne la base de données suivante (extrait)
    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
    Sport    Année    Mois        Temps Total    Temps Avg
    course    2002    Avril        0,069178241    0,069178241
    course    2003    Juillet        0,483171296    0,040264275
    course    2003    Août        0,256990741    0,032123843
    course    2003    Septembre    0,242071759    0,048414352
    course    2003    Octobre        0,292222222    0,048703704
    course    2003    Novembre    0,124699074    0,031174769
    course    2003    Décembre    0,07995172    0,03997586
    course    2004    Janvier        0,212951389    0,053237847
    course    2004    Février        0,376018519    0,075203704
    course    2004    Mars        0,357453704    0,051064815
    course    2004    Avril        0,596527778    0,085218254
    course    2004    Mai        0,393599537    0,035781776
    course    2004    Juin        0,295405093    0,049234182
    course    2004    Juillet        0,606215278    0,043301091
    course    2004    Août        0,389618056    0,043290895
    course    2004    Septembre    0,365486111    0,03322601
    course    2004    Octobre        0,532511574    0,040962429
    course    2004    Novembre    0,2134375    0,035572917
    course    2004    Décembre    0,170844907    0,034168981
    course    2005    Janvier        0,253981481    0,050796296
    course    2005    Février        0,519965278    0,05777392
    course    2005    Mars        1,005636574    0,052928241
    course    2005    Avril        0,670405093    0,055867091
    J'ai donc bien deux axes d'ordonnées (Y)
    L'un doit être basé sur les données issues de [Temps Total], l'autre sur [Temps Moyen].
    L'option propriété/format des axes me permet à l'aide de l'option heure complète d'afficher mes valeurs ci-dessus en heures sur le graphe.
    Seul bémol, au delà de 24h pour le [Temps Total], le compteur est remis à 0.
    Comment faire pour que cela ne se produise pas ?

    Enfin, comment m'y prendre pour que l'axe Y1 [Temps Total] soit en max 1,2 et l'axe Y2[Temps Moyen] soit en max 0,1 ?

    Merci par avance

    TF
    Images attachées Images attachées  

  8. #8
    Membre du Club Avatar de thiefer
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 94
    Points : 61
    Points
    61
    Par défaut
    Bonjour à tous,
    j'ai réglé mon problème de double échelle, voici comment s'y prendre :
    Afficher le gcd en mode création
    Afficher la fenêtre propriété
    Sélection dans l'onglet général de l'espace graphique
    Aller sur l'onglet groupe de séries
    Sélectionner le seconde courbe dans le groupe de série de l'axe 2 à créer
    Sélectionner nouveau groupe dans le champ opération puis ok
    Sélectionner le nouveau groupe dans la liste groupes
    Choisir la position du nouvel axe (droite en ce qui me concerne)
    Cliquer sur ajouter
    Enjoy !!!

    Maintenant si quelqu'un pouvait me dire comment régler mon problème d'affiche des heures supérieures à 24h !!! J'apprécierai grandement... cf miniature et explications sur post précédent.

    Merci d'avance

    TF

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

Discussions similaires

  1. [PROC GPLOT] Réaliser un graphique avec plusieurs courbes par année
    Par titoine15 dans le forum ODS et reporting
    Réponses: 3
    Dernier message: 30/04/2015, 14h38
  2. Graphique multi-courbes
    Par Rammazotti dans le forum BIRT
    Réponses: 4
    Dernier message: 24/03/2011, 11h27
  3. Graphiques multi courbes
    Par david87 dans le forum IHM
    Réponses: 2
    Dernier message: 04/06/2008, 13h23
  4. proc capability : graphiques multi-courbes
    Par mitmit dans le forum ODS et reporting
    Réponses: 8
    Dernier message: 22/01/2008, 11h16
  5. [C#] Dessiner un graphique en courbes
    Par FoxDeltaSierra dans le forum ASP.NET
    Réponses: 11
    Dernier message: 28/07/2005, 16h16

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