PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Requête avec un calcul de somme
Requête avec un calcul de somme
Iniciado por Jean Turcotte, 17,jun. 2019 00:45 - 15 respuestas
Miembro registrado
1.397 mensajes
Publicado el 17,junio 2019 - 00:45
Bonjour, je crée un Agenda contenant des RDV, j'utilise une requete pour calculer la somme des délais de chaque RDV de la date du jour. Lorsque je clic sur mon bouton test, la somme ne m'indique le nombre de RDV (3) mais juste le délai du dernier RDV de la date du jour et non la somme des 3.








HExécuteRequête(REQ_TOT_HEURE_DISPO_PAR_EMPLOYÉ,hRequêteDéfaut,"Vi1", DateDuJour)
test est un numérique = HNbEnr(REQ_TOT_HEURE_DISPO_PAR_EMPLOYÉ)
ToastAffiche(test + ": " + REQ_TOT_HEURE_DISPO_PAR_EMPLOYÉ.la_somme_Durée)


--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Miembro registrado
4.361 mensajes
Publicado el 17,junio 2019 - 07:35
Bonjour,
Si on pouvait avoir le code SQL (touche F2 lors de l'aperçu) de ta requête, ce serait bien.

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
1.397 mensajes
Publicado el 17,junio 2019 - 13:31
Voilà!
SELECT
CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE AS ID_DISPONIBILITE,
CONTACT_PERSO_DISPONIBILITE.DateDebut AS DateDebut,
CONTACT_PERSO_DISPONIBILITE.Datefin AS Datefin,
CONTACT_PERSO_DISPONIBILITE.Image AS Image,
CONTACT_PERSO_DISPONIBILITE.Importance AS Importance,
CONTACT_PERSO_DISPONIBILITE.JournéeEntiere AS JournéeEntiere,
CONTACT_PERSO_DISPONIBILITE.Lieu AS Lieu,
CONTACT_PERSO_DISPONIBILITE.Notes AS Notes,
CONTACT_PERSO_DISPONIBILITE.Ordre AS Ordre,
CONTACT_PERSO_DISPONIBILITE.Ressource AS Ressource,
CONTACT_PERSO_DISPONIBILITE.Titre AS Titre,
CONTACT_PERSO_DISPONIBILITE.Répétition AS Repetition,
CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue,
Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée
FROM
CONTACT_PERSO_DISPONIBILITE
WHERE
CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye}
AND CONTACT_PERSO_DISPONIBILITE.DateAbsolue = {ParamDateAbsolue}
GROUP by
CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE,
CONTACT_PERSO_DISPONIBILITE.DateDebut,
CONTACT_PERSO_DISPONIBILITE.Datefin,
CONTACT_PERSO_DISPONIBILITE.Image,
CONTACT_PERSO_DISPONIBILITE.Importance,
CONTACT_PERSO_DISPONIBILITE.JournéeEntiere,
CONTACT_PERSO_DISPONIBILITE.Lieu,
CONTACT_PERSO_DISPONIBILITE.Notes,
CONTACT_PERSO_DISPONIBILITE.Ordre,
CONTACT_PERSO_DISPONIBILITE.Ressource,
CONTACT_PERSO_DISPONIBILITE.Titre,
CONTACT_PERSO_DISPONIBILITE.Répétition,
CONTACT_PERSO_DISPONIBILITE.NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue


--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Miembro registrado
2.321 mensajes
Publicado el 17,junio 2019 - 14:13
Bonjour,

Plus simple ?
SELECT
CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE AS ID_DISPONIBILITE,
CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue,
Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée
FROM
CONTACT_PERSO_DISPONIBILITE
WHERE
CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye}
AND CONTACT_PERSO_DISPONIBILITE.DateAbsolue = {ParamDateAbsolue}
GROUP by
CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE,
CONTACT_PERSO_DISPONIBILITE.NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue


--
Bon dev,
Jean-Pierre
Miembro registrado
1.397 mensajes
Publicado el 17,junio 2019 - 15:29
Bonjour Jean-Pierre, Même après avoir simplifié la requête, le résultat reste le même.

D'autres idées?

--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Miembro registrado
72 mensajes
Publicado el 17,junio 2019 - 21:12
Bonjour Jean ?

Si tu enlève ta SUM() et GROUP BY est-ce que tu reçois plusieurs lignes ou seulement 1 ?
Ta rubrique Durée est sous quel type ? Entier, Chaine, Date, Durée ?

Ca provient peut-être du type de ta rubrique, j'utilise toujours des entiers me donnant des minutes par exemple et je fais la conversion lors de l'affichage au besoin. J'ai jamais tester les calcul SQL avec la rubrique durée de HFSQL.
Miembro registrado
1.397 mensajes
Publicado el 17,junio 2019 - 22:21
C'est un numérique

--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Miembro registrado
1.397 mensajes
Publicado el 18,junio 2019 - 03:51
J'ai créé ma requete SQL manuellement et ca fonctionne tres bien, quelqu,un pourrait me dire pourquoi celle du WLANGAGE ne fonctionne pas?

reqSumDelai est une Requête SQL =
[
SELECT SUM(Durée) FROM CONTACT_PERSO_DISPONIBILITE
WHERE NoEmploye = {ParamIDEmploye}
AND DateAbsolue = {ParamDateAbsolue}
]

reqSumDelai.ParamIDEmploye = "Vi1"
reqSumDelai.ParamDateAbsolue = DateDuJour()

HExécuteRequête(reqSumDelai)
xTemp est numérique
POUR TOUT reqSumDelai
xTemp = reqSumDelai.Expr1
FIN


--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Miembro registrado
1.397 mensajes
Publicado el 18,junio 2019 - 04:34
Après avoir approfondie la problématique des requêtes. Voici le code de la requête en WLANGAGE fonctionnel
SELECT
Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée,
CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue,
CONTACT_PERSO_DISPONIBILITE.Contenu AS Contenu,
CONTACT_PERSO_DISPONIBILITE.Auteur AS Auteur,
CONTACT_PERSO_DISPONIBILITE.AvecRepetition AS AvecRepetition,
CONTACT_PERSO_DISPONIBILITE.Catégorie AS Catégorie,
CONTACT_PERSO_DISPONIBILITE.Importance AS Importance,
CONTACT_PERSO_DISPONIBILITE.JournéeEntiere AS JournéeEntiere,
CONTACT_PERSO_DISPONIBILITE.Lieu AS Lieu,
CONTACT_PERSO_DISPONIBILITE.Ordre AS Ordre,
CONTACT_PERSO_DISPONIBILITE.Répétition AS Repetition
FROM
CONTACT_PERSO_DISPONIBILITE
WHERE
CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye}
AND Left(CONTACT_PERSO_DISPONIBILITE.DateAbsolue,8) = Left(SYSDATE,8)
GROUP by
CONTACT_PERSO_DISPONIBILITE.NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue,
CONTACT_PERSO_DISPONIBILITE.Contenu,
CONTACT_PERSO_DISPONIBILITE.Auteur,
CONTACT_PERSO_DISPONIBILITE.AvecRepetition,
CONTACT_PERSO_DISPONIBILITE.Catégorie,
CONTACT_PERSO_DISPONIBILITE.Importance,
CONTACT_PERSO_DISPONIBILITE.JournéeEntiere,
CONTACT_PERSO_DISPONIBILITE.Lieu,
CONTACT_PERSO_DISPONIBILITE.Ordre,
CONTACT_PERSO_DISPONIBILITE.Répétition


Voici une image de la table en question, toutes les rubriques encadrées en rouge sont problématiques et empêche la requête de bien fonctionner si je les inclus dans la requête. Je n'ai trouvé aucun lien commun.





Des Idées?

--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Miembro registrado
4.361 mensajes
Publicado el 18,junio 2019 - 08:39
Ta requête fait le calcul de la durée pour chaque ID donc retourne 3 enregistrements avec la durée de chaque enregistrement.
SELECT
COUNT(CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE) AS NB_RDV,
SUM(CONTACT_PERSO_DISPONIBILITE.Durée) AS DuréeTotale
FROM
CONTACT_PERSO_DISPONIBILITE
WHERE
Disponibilite.NoEmployé = {pEmployé}
AND Disponibilite.DateAbsolue = {pDate}


--
Il y a peut être plus simple, mais, ça tourne
Mensaje modificado, 18,junio 2019 - 08:42
Miembro registrado
1.397 mensajes
Publicado el 18,junio 2019 - 13:43
Jean TURCOTTE a écrit :
Après avoir approfondie la problématique des requêtes. Voici le code de la requête en WLANGAGE fonctionnel
SELECT
Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée,
CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue,
CONTACT_PERSO_DISPONIBILITE.Contenu AS Contenu,
CONTACT_PERSO_DISPONIBILITE.Auteur AS Auteur,
CONTACT_PERSO_DISPONIBILITE.AvecRepetition AS AvecRepetition,
CONTACT_PERSO_DISPONIBILITE.Catégorie AS Catégorie,
CONTACT_PERSO_DISPONIBILITE.Importance AS Importance,
CONTACT_PERSO_DISPONIBILITE.JournéeEntiere AS JournéeEntiere,
CONTACT_PERSO_DISPONIBILITE.Lieu AS Lieu,
CONTACT_PERSO_DISPONIBILITE.Ordre AS Ordre,
CONTACT_PERSO_DISPONIBILITE.Répétition AS Repetition
FROM
CONTACT_PERSO_DISPONIBILITE
WHERE
CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye}
AND Left(CONTACT_PERSO_DISPONIBILITE.DateAbsolue,8) = Left(SYSDATE,8)
GROUP by
CONTACT_PERSO_DISPONIBILITE.NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue,
CONTACT_PERSO_DISPONIBILITE.Contenu,
CONTACT_PERSO_DISPONIBILITE.Auteur,
CONTACT_PERSO_DISPONIBILITE.AvecRepetition,
CONTACT_PERSO_DISPONIBILITE.Catégorie,
CONTACT_PERSO_DISPONIBILITE.Importance,
CONTACT_PERSO_DISPONIBILITE.JournéeEntiere,
CONTACT_PERSO_DISPONIBILITE.Lieu,
CONTACT_PERSO_DISPONIBILITE.Ordre,
CONTACT_PERSO_DISPONIBILITE.Répétition


Mais alors qu'es-ce qui détermine qu'une rubrique supplémentaire me donne 3 résultats et que toutes celles déjà incluses me donne le calcul désiré. Je croyais à tord au départ que le lien était avec des rubrique indexés. C'est pourtant très important de savoir ça.

--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Miembro registrado
4.361 mensajes
Publicado el 18,junio 2019 - 14:12
Cela provient du GROUP BY.
On appelle les fonction SQL COUNT, SUM ... des agrégats ou fonction d'agrégation.
Les calculs sont faits sur les rubriques identiques.
Pour plus d'informations https://sql.sh/.
Dans notre cas, sur tous les enregistrements correspondant au même NoEmployé. Si on enlève la condition "CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye}" on aura 1 ligne par employé à une date donnée.
Si on inclus un GROUP BY ID... on aura tous les enregistrements, ID... est unique.

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
72 mensajes
Publicado el 18,junio 2019 - 15:42
Pour faire suite à Voroltinquo,
Aussi, il faut faire attention au rubriques date car, si elle sont on format AAAAMMJJHHmmSS chaque enregistrement risque d'être unique. C'est assez facile des oublier celles-là :P

En bref, chaque LIGNE de données doit être UNIQUE pour que la SUM soit calculé. Enlève ta SUM et ton GROUP BY. Si une seule colonne d'une de tes ligne est différente, ta requête ne pourra pas les regrouper et faire ton agrégat.
Miembro registrado
72 mensajes
Publicado el 18,junio 2019 - 16:03
Ta requête au Post #8 fonctionne car tu n'a pas de group by, il fait alors la SUM sur toute les lignes de ta tables.

Par contre aussitôt que tu veux sortir une rubrique (colonne) de plus en même temps que ton aggrégat, il doit obligatoirement être dans ton GROUP BY. Pour qu'il soit regrouper il faut que tout ce qu'il y a dans le GROUP BY soit IDENTIQUE. Il va alors faire la SUM de tout ce qui est identique.

Prénom Age
Jean 18
Pierre 50
Jean 15
Jeanne 25
Pierre 50

SELECT
Prénom,
SUM(Age)
FROM
Personne
GROUP BY
Prénom

Va retourner 3 lignes la car il y a 3 noms différents et il va applique la somme sur l'age qui comporte les mêmes noms.
Résultat :

Jean 33 (18+15)
Pierre 100 (50+50)
Jeanne 25 (25)


Par contre s'il y a plusieurs rubrique.
Prénom Nom Age
Jean Toto 18
Pierre Tata 50
Jean Tata 15
Jeanne Tata 25
Pierre Tata 50

SELECT
Prénom,
SUM(Age)
FROM
Personne
GROUP BY
Prénom

Va retourner la même chose que précédement car seul le Prénom est demander dans le GROUP BY.

Par contre

SELECT
Prénom,
Nom,
SUM(Age)
FROM
Personne
GROUP BY
Prénom,
Nom

Va retourner :
Prénom Nom SUM
Jean Toto 18 // Toto et Tata sont différent
Jean Tata 15 // Toto et Tata sont différent
Pierre Tata 100 (50+50) // Pierre ET Tata sont identique pour les 2 lignes donc la SUM est appliqués
Jeanne Tata 25


Espérant t'avoir aider à comprendre :)
Miembro registrado
1.397 mensajes
Publicado el 18,junio 2019 - 18:22
Merci, explication très complète et surtout très utile. :merci:

--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Miembro registrado
1.397 mensajes
Publicado el 19,junio 2019 - 16:34
Grace à vous, je comprend mieux le fonctionnement des requêtes. J'aimerais toutefois savoir pourquoi une requête de l'éditeur de requêtes comme celle-ci fonctionne;
SELECT
Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée,
CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue
FROM
CONTACT_PERSO_DISPONIBILITE
WHERE
CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye}
AND CONTACT_PERSO_DISPONIBILITE.DateAbsolue BETWEEN {DateDebut} AND {DateFin}
GROUP by
CONTACT_PERSO_DISPONIBILITE.NoEmploye,
CONTACT_PERSO_DISPONIBILITE.DateAbsolue


J'aimerais recréer ce code en WLANGAGE mais je n'y arrive pas. La fonction SELECT ne prend que la SUM(...) et n'accepte aucune autre rubrique.
reqSumDelai est une Requête SQL =
[
SELECT SUM(CONTACT_PERSO_DISPONIBILITE.Durée), CONTACT_PERSO_DISPONIBILITE.DateAbsolue
FROM CONTACT_PERSO_DISPONIBILITE
WHERE NoEmploye = {ParamIDEmploye}
AND CONTACT_PERSO_DISPONIBILITE.DateAbsolue BETWEEN {DateDebut} AND {DateFin}
GROUP BY CONTACT_PERSO_DISPONIBILITE.DateAbsolue
]

reqSumDelai.ParamIDEmploye = "Vi1"
reqSumDelai.DateDebut = "20190601"
reqSumDelai.DateFin = "20190618"

HExécuteRequête(reqSumDelai)
xTemp est numérique
POUR TOUT reqSumDelai
xTemp = reqSumDelai.Expr1
ToastAffiche(reqSumDelai.DateAbsolue + ": " + xTemp)

FIN


--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram