PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Requête SQL
Requête SQL
Started by Daniel, Mar., 28 2017 3:27 PM - 9 replies
Registered member
71 messages
Posted on March, 28 2017 - 3:27 PM
Bonjour à tous,

J'essaie d'écrire une requête en SQL afin de paramétrer dynamiquement certaines conditions. Je commence simplement et étape par étape pour écrire et tester ma requête.

1 .Le code suivant qui sélectionne les clés uniques des comptes répondant aux critères provoque déjà une erreur et je ne vois pas ce qui cloche, mais je ne suis qu'un débutant en SQL.

sRequête_Recherche est une chaîne ="SELECT COMPTES.C5CLEUNIK AS C5CLEUNIK " +...
"FROM COMPTES" +...
"WHERE COMPTES.STCTYPE IN ('IN','IP','SC','IF','IG','SF')"


2. Je suppose qu'il y a également moyen de construire des conditions de IN en créant une chaîne de caractère mais comment l'insérer dans le code de la requête ? Avec des indirections ?

Merci d'avance.

Dan, le boulet en SQL
Registered member
257 messages
Popularité : +35 (37 votes)
Posted on March, 28 2017 - 4:12 PM
1 )
sRequête_Recherche est une chaîne =
[
SELECT COMPTES.C5CLEUNIK AS C5CLEUNIK
FROM COMPTES
WHERE COMPTES.STCTYPE IN ('IN','IP','SC','IF','IG','SF')
]


2 )
Param est une chaîne = "'IN','IP','SC','IF','IG','SF'"
sRequête_Recherche est une chaîne =
[
SELECT COMPTES.C5CLEUNIK AS C5CLEUNIK
FROM COMPTES
WHERE COMPTES.STCTYPE IN (%2)
]
sRequête_Recherche= ChaîneConstruit(sRequête_Recherche,Param)


Bonus :
Param est une chaîne = "'IN','IP','SC','IF','IG','SF'"
R01 est une Source dede Données <Description=COMPTES>
T01 est une chaîne = "SELECT COMPTES.C5CLEUNIK FROM COMPTES WHERE COMPTES.STCTYPE IN (%2)"
T01=ChaîneConstruit(T01,Param)
SI HExécuteRequêteSQL(R01,hRequêteDéfaut,T01) = Faux ALORS
Erreur("erreur sur requête 'R01'",HErreurInfo(hErrComplet))
SINON
HLitPremier(R01)
SI HEnDehors(R01) = Vrai ALORS
Erreur("aucun resultat")
SINON
MonResultat est une chaîne = R01.C5CLEUNIKFIN
FIN
FIN
HAnnuleDéclaration(R01)

--
Baptiste CLOART
Freelance
b.cloart@blv-tech.com
06.88.74.80.65
www.linkedin.com/in/cloart
www.blv-tech.com
Message modified, March, 28 2017 - 4:20 PM
Posted on March, 28 2017 - 4:22 PM
Bonjour,
C'est bien de dire que la requête provoque une erreur, mais c'est encore
mieux de dire quelle erreur...
Ici je dirai qu'il manque un espace après COMPTES sur la deuxième ligne.
D'ailleurs je dirai que tu devrais plutôt utiliser les crochets pour mettre
ta chaine sur plusieurs lignes.
Tu auras mois ce genre de proiblèmes:
sRequete_Recherche est une chaîne

sRequete_Recherche=[
SELECT COMPTES.C5CLEUNIK AS C5CLEUNIK
FROM COMPTES
WHERE COMPTES.STCTYPE IN ('IN','IP','SC','IF','IG','SF')
]


Pour la deuxième question, ta requête n'est "qu'une chaine", donc toutes les
fonctions de traitement des chaines sont utilisables ici.
Si tu sais construire un message pour tes utilisateurs, tu sais construire
une requête SQL ;)

Frédéric.

"Daniel" a écrit dans le message de groupe de discussion :
20176a84c9a6eed5282119d9e4134a5449de@news.pcsoft.fr...

Bonjour à tous,

J'essaie d'écrire une requête en SQL afin de paramétrer dynamiquement
certaines conditions. Je commence simplement et étape par étape pour écrire
et tester ma requête.

1 .Le code suivant qui sélectionne les clés uniques des comptes répondant
aux critères provoque déjà une erreur et je ne vois pas ce qui cloche, mais
je ne suis qu'un débutant en SQL.

sRequête_Recherche est une chaîne ="SELECT COMPTES.C5CLEUNIK AS C5CLEUNIK "
+...
"FROM COMPTES" +...
"WHERE COMPTES.STCTYPE IN ('IN','IP','SC','IF','IG','SF')"


2. Je suppose qu'il y a également moyen de construire des conditions de IN
en créant une chaîne de caractère mais comment l'insérer dans le code de la
requête ? Avec des indirections ?

Merci d'avance.

Dan, le boulet en SQL
Registered member
71 messages
Posted on March, 29 2017 - 6:48 AM
Bonjour à vous deux, Baptiste et Frédéric.

Tout d'abord merci d'avoir pris le temps de m'aider.
Pour le point 1, effectivement cela marche mieux avec les [ ], et l'écriture en est simplifiée.

Pour le point 2, j'en étais arrivé à la même conclusion. Ce qui est un peu énervant c'est que la chaîne passée en paramètre ne s'écrit pas de la même manière en fonction de l'usage qui en est fait, requête WD ou SQL, ce qui implique l'écriture d'une petite fonction pour passer d'une écriture à l'autre mais, en cela, rien de bien compliqué, juste un peu de temps passé à l'écriture de la fonction...de quoi développer 9 fois plus vite au lieu de 10 fois ;)

Bon, je retourne à l'écriture de mes requêtes et sous-requêtes. Je risque de repasser par ici....8)
Registered member
71 messages
Posted on March, 29 2017 - 10:24 AM
Je ne m'étais pas trompé, me revoici déjà.

J'ai créé le bout de code suivant, la boucle est juste là pour visualiser le test (raison pour laquelle je n'ai pas écrit le transfert des autres rubriques). J'ai repris le code SQL issu de l'éditeur de requête et j'ai, dans un premier temps, codé en "dur" les conditions de sélection de COMPTES (ce sont des paramètres en requête WD). J'obtiens le message d'erreur m'indiquant que la requête n'a pas été exécutée. Voyez-vous ce qui cloche dans ce code ?
Procedure CalculStocks()

sRequête_Recherche est une chaîne = [
SELECT
STOCKMOB.C5CLEUNIK AS C5CLEUNIK,
COMPTES.STFORM1 AS STFORM1,
COMPTES.LIVRMA1 AS LIVRMA1,
COMPTES.STCTYPE AS STCTYPE,
STOCKMOB.LIVRCOD AS LIVRCOD,
STOCKMOB.LIVRORG AS LIVRORG,
STOCKMOB.LIVRNPN AS LIVRNPN,
STOCKMOB.LIVNWN AS LIVRNWN,
SUM(STOCKMOB.LIVRQL2) AS LIVRQL2,
SUM(STOCKMOB.LIVRQL3) AS LIVRQL3,
SUM(STOCKMOB.LIVRQUF) AS LIVRQUF,
SUM(STOCKMOB.LIVRQUS) AS LIVRQUS,
SUM(STOCKMOB.LIVRUER) AS LIVRUER,
SUM(STOCKMOB.LIVRUEQ) AS LIVRUEQ,
SUM(STOCKMOB.LIVRUEN) AS LIVRUEN
FROM
COMPTES,
STOCKMOB
WHERE
COMPTES.C5CLEUNIK = STOCKMOB.C5CLEUNIK
AND
(
STOCKMOB.C5CLEUNIK = ANY
(
SELECT
COMPTES.C5CLEUNIK AS C5CLEUNIK
FROM
COMPTES
WHERE
COMPTES.STCTYPE IN ('IN','IP','SC','IF','IG','SF')
AND COMPTES.STFORM1 NOT IN ('UNH')
AND COMPTES.LIVRMA1 NOT IN ('COGEMA/TNX','USDOE/EU/25')
)
)
GROUP BY
STOCKMOB.C5CLEUNIK,
COMPTES.STFORM1,
COMPTES.LIVRMA1,
COMPTES.STCTYPE,
STOCKMOB.LIVRCOD,
STOCKMOB.LIVRORG,
STOCKMOB.LIVRNPN,
STOCKMOB.LIVRNWN
ORDER BY
STFORM1 ASC,
LIVRMA1 ASC,
STCTYPE ASC,
LIVRCOD ASC,
LIVRORG ASC
]

sdMaSourceDonnée est une Source dede Données
bMaSourceDonnéeOK est un booléen

bMaSourceDonnéeOK = HExécuteRequêteSQL(sdMaSourceDonnée,sRequête_Recherche)
SI bMaSourceDonnéeOK=Faux ALORS
Erreur("Erreur d'exécution de la requête.")
RETOUR
FIN
TableSupprimeTout(TABLE_STOCKS)
POUR TOUT sdMaSourceDonnée
TableAjouteLigne(TABLE_STOCKS,sdMaSourceDonnée.C5CLEUNIK)
FIN
Registered member
71 messages
Posted on March, 29 2017 - 11:19 AM
Bon, suite de l'aventure, il semble que ce sont les caractères / dans le SELECT de COMPTES qui posent problème.

J'imagine que la chaîne doit être transformée avec un caractère d'échappement pour que le / soit interprété correctement, non ? Si oui, quel est le caractère d'échappement à utiliser ?
Posted on March, 29 2017 - 11:29 AM
Coucou,

J'suis en nouvelle zellande, sa te branche pas un coup de sponsoring billet / allez retour dans une petit ile a coté ? Et moi tes requêtes SQL je te fait tranquillou ;)

Charly.
Posted on March, 29 2017 - 11:29 AM
Coucou,

J'suis en nouvelle zellande, sa te branche pas un coup de sponsoring billet / allez retour dans une petit ile a coté ? Et moi tes requêtes SQL je te fait tranquillou ;)

Charly.
Registered member
71 messages
Posted on March, 29 2017 - 12:39 PM
Bonjour Charly,

Merci de cette proposition mais je pense que cela passerait mal si je réclamais un vol vers Auckland pour ça. ;)

Trêve de plaisanterie, le / ne posait pas problème, un nom de rubrique mal orthographié (LIVNW au lieu de LIVRNWN).

Je continue à complexifier le code, étape par étape j'y arriverai, le temps investi maintenant me servira ultérieurement.
Posted on March, 29 2017 - 10:44 PM
Coucou,

Hesite pas j vais surveiller le forum si t as des soucis ^^
Essaye de poster un sample de data quant tu place tes requetes qui te file des soucis, j suis op en sql / poo et optimisation ^^

Charly