Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD12] Souci dans une requête Sql

3 réponses
Avatar
Juanito
Bonjour,

Je viens de passer un projet de Windev 10 en 12. Tout semble bien se
passer sauf que j'ai une erreur sur une requête Sql qui fonctionnait
avant.

Quelqu'un pourrait-il m'aiguiller ? Cette requête est sur un fichier
Hyperfile non C/S.

Select Mouvements.CodeAccess, Mouvements.DateMvt, Mouvements.SensMvt,
Mouvements.Categorie, SUM (Mouvements.Montant) As TotMontant ,SUM
(Mouvements.Quantite) As TotQuantite, Mouvements.IDMagasin,
Mouvements.IDRayonnage From Mouvements Where Mouvements.DateMvt Between
'20080801' And '20080831' AND Mouvements.CodeMvt ='IMPVE' Group By
Mouvements.CodeAccess Order By TotQuantite DESC

Me donne l'erreur :
"Erreur dans le code SQL de la requête <SD_MaRequete>. Initialisation
de la requête impossible.
L'utilisation de fonctions agrégats avec d'autres rubriques ou
fonctions non agrégat n'est pas autorisée sans l'utilisation d'une
clause GROUP BY. Toutes les rubriques ou fonctions non agrégat doivent
figurer dans la clause GROUP BY."

Je comprends donc qu'il faudrait que mes rubriques Quantite et Montant
devraient se trouver dans le Group By mais je désire avoir une ligne
par CodeAccess.

Bref ma requête est-elle mal faite ? Pourtant en WD10 cela
fonctionnait. Tout du moins elle renvoyait des valeurs... Mais
étaient-ce les bonnes ? ;-)

Merci d'avance

Jean

3 réponses

Avatar
news.motzarella.org
Le Mon, 18 Aug 2008 14:09:55 +0200, Juanito
a écrit:

Bonjour,

Je viens de passer un projet de Windev 10 en 12. Tout semble bien se
passer sauf que j'ai une erreur sur une requête Sql qui fonctionnait
avant.

Quelqu'un pourrait-il m'aiguiller ? Cette requête est sur un fichier
Hyperfile non C/S.

Select Mouvements.CodeAccess, Mouvements.DateMvt, Mouvements.SensMvt,
Mouvements.Categorie, SUM (Mouvements.Montant) As TotMontant ,SUM
(Mouvements.Quantite) As TotQuantite, Mouvements.IDMagasin,
Mouvements.IDRayonnage From Mouvements Where Mouvements.DateMvt Between
'20080801' And '20080831' AND Mouvements.CodeMvt ='IMPVE' Group By
Mouvements.CodeAccess Order By TotQuantite DESC

Me donne l'erreur :
"Erreur dans le code SQL de la requête <SD_MaRequete>. Initialisation de
la requête impossible.
L'utilisation de fonctions agrégats avec d'autres rubriques ou fonctions
non agrégat n'est pas autorisée sans l'utilisation d'une clause GROUP
BY. Toutes les rubriques ou fonctions non agrégat doivent figurer dans
la clause GROUP BY."

Je comprends donc qu'il faudrait que mes rubriques Quantite et Montant
devraient se trouver dans le Group By mais je désire avoir une ligne par
CodeAccess.

Bref ma requête est-elle mal faite ? Pourtant en WD10 cela fonctionnait.
Tout du moins elle renvoyait des valeurs... Mais étaient-ce les bonnes ?
;-)

Merci d'avance

Jean




Bonjour,

Avis hors HF , mais ORACLE. Dans un select avec un group by , toutes les
colonnes doivent
être ou des fonction de groupe (sum, ....) ou bien faire partie du group
by.

Dans ton cas , il faudrait ajouter au group by DateMvt,SensMvt, Categorie
... mais évidemment pas
Quantite et Montant.

Ce n'est pas illogique puisque tu veux AUSSI les colonnes indiquées et pas
seulement CodeAccess.



--
JB
Avatar
Albert
Bonjour,

Depuis la version 11 c'est devenu un peu plus strict au niveau du code

Comme la requête ne fait appel qu'a un seul fichier, vous pouvez
également
alléger son code

LOCAL
sCode, sCodeSQL, sCodeMvt sont des chaines
dDate1, dDate2 sont des dates
sdReq est une source de données

// *** Initialiser les variables
dDate1 = '20080801'
dDate2 = '20080831'
sCodeMVT = "IMPVE"

// *** Code de la Requête
sCode = [
SELECT [CodeAccess], [DateMvt], [SensMvt], [Categorie], [IDMagasin],
[IDRayonnage],
SUM ( [Montant] ) As TotMontant,
SUM ( [Quantite] ) As TotQuantite
FROM Mouvements
WHERE [DateMvt] BETWEEN '%1' AND '%2''
AND [CodeMvt] = '%3'
GROUP BY [CodeAccess], [DateMvt], [SensMvt], [Categorie],
[IDMagasin], [IDRayonnage]
ORDER BY TotQuantite DESC
]

// *** Construction du code de la requête
sCodeSQL = ChaineConstruit( sCode, dDate1, dDate2, sCodeMvt)

// *** Si besoin vous pouvez encore contrôler le code par
Trace(sCodeSQL)

SI HExécuteRequêteSQL(sdReq, sCodeSQL) ALORS
....
HAnnuleDéclaration(sdReq)
SINON
Ouvre(FEN_Dialogue, " Requête ...", ">>> Erreur
d’initialisation de la requête ... "+[RC]+HErreurInfo(),2)
RETOUR
FIN

En espérant vous avoir aidé

Cordialement

Albert
Avatar
Juanito
Bonjour,

Désolé de ne pas avoir répondu plus tôt mais j'avais supprimé le
message du serveur presque aussitôt après l'avoir envoyé et je ne
pensais pas qu'il y aurait beaucoup de gens pour y répondre ... :-)

J'ai effectivement modifié ma requête en enlevant des rubriques qui
n'étaient pas très utiles et maintenant cela fonctionne.

Par contre, effectivement, Windev 12 est plus stricte que la 10 pour
les requêtes.

Merci à vous 2

Jean

Albert a exprimé avec précision :
Bonjour,

Depuis la version 11 c'est devenu un peu plus strict au niveau du code

Comme la requête ne fait appel qu'a un seul fichier, vous pouvez
également
alléger son code

LOCAL
sCode, sCodeSQL, sCodeMvt sont des chaines
dDate1, dDate2 sont des dates
sdReq est une source de données

// *** Initialiser les variables
dDate1 = '20080801'
dDate2 = '20080831'
sCodeMVT = "IMPVE"

// *** Code de la Requête
sCode = [
SELECT [CodeAccess], [DateMvt], [SensMvt], [Categorie], [IDMagasin],
[IDRayonnage],
SUM ( [Montant] ) As TotMontant,
SUM ( [Quantite] ) As TotQuantite
FROM Mouvements
WHERE [DateMvt] BETWEEN '%1' AND '%2''
AND [CodeMvt] = '%3'
GROUP BY [CodeAccess], [DateMvt], [SensMvt], [Categorie],
[IDMagasin], [IDRayonnage]
ORDER BY TotQuantite DESC
]

// *** Construction du code de la requête
sCodeSQL = ChaineConstruit( sCode, dDate1, dDate2, sCodeMvt)

// *** Si besoin vous pouvez encore contrôler le code par
Trace(sCodeSQL)

SI HExécuteRequêteSQL(sdReq, sCodeSQL) ALORS
....
HAnnuleDéclaration(sdReq)
SINON
Ouvre(FEN_Dialogue, " Requête ...", ">>> Erreur
d’initialisation de la requête ... "+[RC]+HErreurInfo(),2)
RETOUR
FIN

En espérant vous avoir aidé

Cordialement

Albert