PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Uun histogramme par mois et par an...
Uun histogramme par mois et par an...
Débuté par WindevNurse, 23 jan. 2021 20:55 - 16 réponses
Membre enregistré
57 messages
Posté le 23 janvier 2021 - 20:55
Bonjour à tous,
J'ai une petite expérience avec le champ graphe mais des fois certains éléments m'échappent ..

J'ai fait une requête calculant le nombre de jours travaillées par mois, du style:
Janvier 2020 > 10 jours
Février 2020 > 11 jours
etc...
Janvier 2021 > 15 jours
Février 2021 > 16 jours
etc..
Mais je voudrais pouvoir comparer les années mois par mois pour obtenir un champs graphe de ce style:




Avec en Mauve: 2020
Avec en Turquoise: 2021

Cependant je n'y arrive pas avec la description du Graph...
Je mets les "Mois" en source des étiquettes...
Mais pour les séries...je galère un peu...

Dois je passer par la programmation du graphe ?

Merci à tous pour votre aide.
Membre enregistré
213 messages
Posté le 24 janvier 2021 - 01:32
Salutations,

Personnellement il y a longtemps que j'ai renoncé à "lier" mes graphes aux sources de données.
Tout se fait par programmation.




On voit l'impact de la COVID sur les jours travaillés.
oO

Ma routine ProChargeGraphe().
Avec des données codées en dur pour cet exemple.
Procedure ProChargeGraphe()
//
tabMois est un tableau de chaînes
tab2020 est un tableau d'entiers
tab2021 est un tableau d'entiers
//
//--- Données fictives pour les besoins du test
tabMois = ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"]
tab2020 = [22, 20, 22, 21, 18, 21, 22, 21, 22, 22, 20, 22]
tab2021 = [20, 20, 16, 5, 7, 6, 8, 22, 22, 21, 20, 5]
//
//--- Initialise le graphe
grSupprimeTout(FgrfJTM)
//
//--- Étiquette de série
grEtiquetteSérie(FgrfJTM, 1, "2020")
grEtiquetteSérie(FgrfJTM, 2, "2021")
//
//--- Couleurs des séries
FgrfJTM[1]..CouleurSérie = RougeFoncé
FgrfJTM[2]..CouleurSérie = BleuFoncé
//
//--- Dégradé
grDégradé(FgrfJTM, FintDégradé[1]..Valeur)
//
//--- Relief
grRelief(FgrfJTM, FpotGrapheRelief..Valeur)
//
//--- Orientation
SI FselHorVer..Valeur = 1 ALORS
grOrientation(FgrfJTM, grOrdonnée, grADroite, grEnHaut)
SINON
grOrientation(FgrfJTM, grAbscisse, grADroite, grEnHaut)
FIN
//
//--- Chargement des données ------------------------------------------------------------
//
POUR X = 1 À 12
//--- Série #1
grAjouteDonnée(FgrfJTM, 1, X, tab2020[X])
//--- Série #2
grAjouteDonnée(FgrfJTM, 2, X, tab2021[X])
//--- Étiquette des mois
grEtiquetteCatégorie(FgrfJTM, X, tabMois[X])
FIN
//
//--- Rafraichissement ------------------------------------------------------------------
//
grParamètre(FgrfJTM, grGraduationsOptimiséesX, Vrai)
grDessine(FgrfJTM)

À chaque modification de l'interrupteur ou du sélecteur:
ProChargeGraphe()


À chaque modification du potentiomètre:
grRelief(FgrfJTM, FpotGrapheRelief..Valeur)
grDessine(FgrfJTM)


J'offre aussi un combo de couleurs à mes utilisateurs.
Ils peuvent personnaliser la couleur de chaque série.

Et il y a plus encore que tu peux faire.

Bon dev.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
213 messages
Posté le 24 janvier 2021 - 01:46
Tout bon pour moi...
8)

La série 2020 devrait se nommer 2019.
La série 2021 devrait se nommer 2020.

Hop, je corrige et j'en profite pour ajouter une série pour 2021.



Sans relief...



À l'horizontal...




Bon dev.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
57 messages
Posté le 24 janvier 2021 - 16:18
Merci Serge,
Et là, je me dis qu'il y a vraiment des gens qui maitrisent la programmation avec Windev...
J'ai encore beaucoup à apprendre,
Je vais me servir de tout ça pour aller chercher les données dans mon fichier.
Membre enregistré
213 messages
Posté le 25 janvier 2021 - 01:42
Je ne maîtrise pas Windev, et de loin.

J'ai simplement eu à me battre avec le champ graphe au fil de mes développements.
:p

N'hésites pas à glisser une note si tu as encore des questions.

Bon Dev.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
57 messages
Posté le 25 janvier 2021 - 12:31
Merci Serge,
Je vais abuser un peu mais après je clôturerai le sujet.
Cette méthode fonctionne si l'on a des valeurs de janvier à décembre.
Mais comment procéder si les premières valeurs commencent à partir de septembre par exemple...?
Imaginons que la personne veuille voir le résultat de la requête à partir d'une requête paramétrée avec date de début et date de fin.
Surtout que le résultat de la requête apparait sous la forme:
202011 > 5 jours
202012 > 6 jours
202101 > 7 jours
etc...

ça se complique..
Membre enregistré
4 328 messages
Posté le 25 janvier 2021 - 13:15
Bonjour,
Une requête dans le style :
SELECT
SUM(Janvier) AS NbJanvier,
SUM(Février) AS NbFévrier
//etc
FROM
(
SELECT
NbJours AS Janvier,
0 AS Fevrier
FROM
JourOuvre
WHERE
MoisMesure=1
AND
AnnéeMesure={pAnnée}

UNION

SELECT
0 AS Janvier,
NbJours AS Février
FROM
JourOuvre
WHERE
MoisMesure=2
AND
AnnéeMesure={pAnnée}

//ETC
)

devrait faire l'affaire.
Pour les mois qui manquent, il suffit de créer une nouvelle UNION en mettant à 0 les mois non concernés

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
4 328 messages
Posté le 25 janvier 2021 - 13:17
EDIT

Et en complétant les 2 premières sous requêtes

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
4 328 messages
Posté le 25 janvier 2021 - 15:00
En utilisant la requête ci dessus, on peut créer La fonction AfficheHisto pour afficher les données
Procedure AfficheHisto(nDébut est entier,nFin est entier)
stJourAnnée est STJourOuvré
sSourceJour est chaîne
nIndice est entier

REQ_JourOuvrés.pDébut=nDébut
REQ_JourOuvrés.pFin=nFin
HExécuteRequête(REQ_JourOuvrés)
FichierVersTableau(gtabRécap,REQ_JourOuvrés)


POUR TOUT stJourAnnée de gtabRécap
nIndice++
sSourceJour=ChaîneConstruit("%1;%2",stJourAnnée:NbJanvier,stJourAnnée:NbFévrier) /// à vcompléter avec les autres mois
grSourceSérie(GRF_JourOuvré,nIndice,grProgrammation,sSourceJour)
grEtiquetteSérie(GRF_JourOuvré,nIndice,stJourAnnée:Année)
FIN
grDessine(GRF_JourOuvré)


STJourOuvré est une structure basée sur la requête :
STJourOuvré est structure
NbJanvier est entier
NbFévrier est un entier
//Etc
Année est entier
FIN

gtabRécap est tableau de STJourOuvré


--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
213 messages
Posté le 26 janvier 2021 - 05:53
Sautations,

Heure du Québec il est temps pour moi de penser à ma nuit de sommeil.
J'ai bricolé un petit "tout inclus" que je compte compléter demain soir.



Le tout est basé sur une requête toute simple.
SELECT
GrapheTest.Année AS Année,
GrapheTest.Mois AS Mois,
GrapheTest.JoursTravaillés AS JoursTravaillés
FROM
GrapheTest
WHERE
GrapheTest.Année >= {pDébutAnnée}
AND GrapheTest.Année <= {pFinAnnée}
AND GrapheTest.Mois >= {pDébutMois}
AND GrapheTest.Mois <= {pFinMois}
ORDER by
Année Asc,
Mois Asc

Est-ce que la requête correspond à ton besoin ?

Le graphe sectoriel, c'est pour mon plaisir.
Je voulais le découvrir depuis un moment et ta demande répond au besoin.

Je laisse chaque bloc de code sur le forum demain soir (partage à long terme).
Je fournirai un lien pour le téléchargement du projet (ZIP).

Bon dev.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
4 328 messages
Posté le 31 janvier 2021 - 10:51
Voici une nouvelle mouture un peu moins lourde que la première pour prendre en compte les mois où il n'y a pas eu de pointage :
SELECT
ISNULL(JourOuvre.NbJours,0) AS NbJours, //Les mesure qui manquent seront à 0
PlageMesure.MoisMesure AS MoisMesure,
PlageMesure.AnnéeMesure AS AnnéeMesure
FROM
JourOuvre
RIGHT OUTER JOIN //ON prend en compte les mesures qui ne sont pas dans la plage théorique
//ON récupère la plage théorique ie toutes les paires Mois/Années
(SELECT
PlageMois.MoisMesure AS MoisMesure,
PlageAnnée.AnnéeMesure AS AnnéeMesure
FROM
//ON initialise tous les mois de l'année
(SELECT
1 AS MoisMesure
UNION
SELECT
2 AS MoisMesure
UNION
SELECT
3 AS MoisMesure
UNION
SELECT
4 AS MoisMesure
UNION
SELECT
5 AS MoisMesure
UNION
SELECT
6 AS MoisMesure
UNION
SELECT
7 AS MoisMesure
UNION
SELECT
8 AS MoisMesure
UNION
SELECT
9 AS MoisMesure
UNION
SELECT
10 AS MoisMesure
UNION
SELECT
11 AS MoisMesure
UNION
SELECT
12 AS MoisMesure) AS PlageMois,
//On récupère les années dans la plage demandée
(SELECT DISTINCT
JourOuvre.AnnéeMesure AS AnnéeMesure
FROM
JourOuvre
WHERE
JourOuvre.AnnéeMesure BETWEEN {pAnnéeDébut} AND {pAnnéeFin}) AS PlageAnnée) AS PlageMesure
ON PlageMesure.MoisMesure = JourOuvre.MoisMesure
AND PlageMesure.AnnéeMesure = JourOuvre.AnnéeMesure
ORDER BY
AnnéeMesure ASC,
MoisMesure ASC


--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
213 messages
Posté le 01 février 2021 - 04:15
Bonjour,

Avec quelque peu de retard mon projet test est finalement sr le dépôt de PcSoft.
https://depot.pcsoft.fr/resource.awp…

J'ai ouvert un sujet distinct pour le publier.
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev.old/27705-windev-23-projet-exploration-graphes-27709/read.awp

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
213 messages
Posté le 01 février 2021 - 04:20
Je viens de poster une réponse et elle se retrouve "devant" la dernière réponse de Voroltinquo.
Le forum a tenu compte de l'heure "locale"...
:o

Original...

--
-----
Parfois, la logique est implacable...
Membre enregistré
57 messages
Posté le 01 février 2021 - 11:59
Merci à tous,
Je dois avouer que vous m'avez tous beaucoup aidé!
Je me rends compte que j'ai encore beaucoup à apprendre.
Merci aussi à Monsieur SERGE, je suis impressionné!
Pour la petite histoire, je suis un infirmier qui a découvert windev...et qui adore utiliser cet AGL.
Tous les jours, j'en découvre un peu plus! c'est une vraie source d'inspiration pour moi.
J'ai ouvert une petite chaîne Youtube sur la programmation windev. J'essaye d'y traiter les problèmes de compréhension que j'ai eu lorsque j'ai commencé à coder en vba puis en wlangage.
Vous pouvez faire un saut sur cette chaine en tapant "windevnurse".

Maintenant, j'avais tenté de trouver un moyen "contourné" pour arriver à mes fins!
En fait, j'ai crée 2 tableaux invisibles sur ma fenêtre:
un premier qui renseigne les résultats par an et qui alimente les séries.
Pour chaque ligne du premier tableau, je relance une requête qui remplit le deuxième tableau avec les résultats de chaque mois. Puis je les lis, pour remplir ces résultats mois par mois....


Pas très conventionnel mais ça marche aussi.
Comme quoi, en programmation il y a toujours un moyen d'y arriver.

Encore merci à tous!
Membre enregistré
213 messages
Posté le 01 février 2021 - 23:25
Bonjour,

Depuis le projet test que je propose tu peux extraire les seuls parties de code dont tu as besoin.

La requête SQL est on ne peut plus simple et s'adapte facilement:
SELECT
(GAM.Année * 100) + GAM.Mois AS AnnéeMois,
GAM.Année AS Année,
GAM.Mois AS Mois,
GAM.JoursTravaillés AS JoursTravaillés
FROM
GAM
WHERE
AnnéeMois >= {pDébutAnnéeMois}
AND AnnéeMois <= {pFinAnnéeMois}

ORDER by
Année Asc,
Mois Asc


Quelque chose pour la sélection des dates, dans mon cas quelques combos.




Le "moteur" du filtre sur dates, que tu trouves dans ProChargeFiltres().
Puis le chargement du graphe lui-même, par exemple ProHistogrammeCharge().

ProHistogrammeDessine(), c'est pour les fonctions complémentaires.
Orientation, relief, espacement, etc.

Si tu t'y aventures et que tu as des questions glisse un mot.
Idem si tu n'as pas Windev 23 ou plus, je peux extraire les portions de code.

Bon dev.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
91 messages
Posté le 02 février 2021 - 09:47
En tout cas, merci pour cet exemple bien agréable à étudier.

bon dev à tous

Eric
Membre enregistré
57 messages
Posté le 04 avril 2021 - 13:14
Des petites news...alors j'ai contourn'e le problème en passant par un champs table que je remplis à partir du requête donnant des résultats par mois:
202001 = 12
202002 = 20
202003 = ...
Ensuite je lis les différents champs en décomposant les données:
Serie = Gauche(202001,4)
Indice = Droite (202001,2)
et ensuite je remplis le graphique par programmation.

C'est une petite bidouille qui marche bien!
En tout cas merci pour votre aide à tous!