PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Condition requete SQL
Condition requete SQL
Started by Monsieur AURAY-LORIVAL, Mar., 28 2017 12:53 AM - 9 replies
Registered member
64 messages
Popularité : -1 (1 vote)
Posted on March, 28 2017 - 12:53 AM
Bonjour à tous,

J'ai une table mysql et avec une colonne latitude et une colonne longitude et j'essaie de faire une sélection dans la clause WHERE sur les coordonnées à moins d'une certaine distance donnée.
Pour cela je passe 3 paramètres : une latitude, une longitude, et la distance max que je veux.
Ca ne plante pas mais la requête retourne aucun résultats.
Je l’exécute avec la fonction SQLExecWDR avec les paramètres associés.

Ma requête :
SELECT
moi.IDPlace AS IDPlace,
moi.Latitude AS Latitude,
moi.Longitude AS Longitude,

FROM
moi
WHERE (6371 * ACOS( ROUND( COS( radians( moi.Latitude ) ) * COS( radians( {setlatitude} ) ) * COS( radians( {setlongitude} ) - radians( moi.Longitude ) ) + SIN( radians(moi.Latitude ) ) * SIN( radians( {setlatitude} ) ) , 10 ) ) ) <= {distanceMax}
ORDER BY
IDPlace ASC


Merci à vous
Posted on March, 28 2017 - 2:52 AM
Coucou,

Tu peut joindre deux samples de donnée ?

Charly
Registered member
64 messages
Popularité : -1 (1 vote)
Posted on March, 28 2017 - 8:06 AM
Biensur,

Voici deux sample de ma base:


Registered member
939 messages
Popularité : +66 (68 votes)
Posted on March, 28 2017 - 5:56 PM
bonjour,

votre requête à première vue semble juste, du moins le calcul de la distance.

si vous lancer sur votre serveur MySQL la requête suivante :

SELECT
moi.IDPlace AS IDPlace,
moi.Latitude AS Latitude,
moi.Longitude AS Longitude,
(6371 * ACOS( Round( Cos( radians( moi.Latitude ) ) * Cos( radians( 41.6203590 ) ) * Cos( radians( 8.974535 ) - radians( moi.Longitude ) ) + Sin( radians(moi.Latitude ) ) * Sin( radians( 41.6203590 ) ) , 10 ) ) ) AS distance
FROM
moi
ORDER by
IDPlace Asc


voir exactement ce que votre serveur vous retourne, ( sans passer par windev ),
çà donne quoi ?
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on March, 28 2017 - 5:57 PM
ah en fait,

le texte de votre requête c'est exactement ce que vous exécutez ?

car il y a une virgule en trop dans le select

comme si vous aviez une 4ème rubrique extraite
Registered member
1,304 messages
Popularité : +47 (51 votes)
Posted on March, 28 2017 - 8:51 PM
Christophe a écrit :
ah en fait,

le texte de votre requête c'est exactement ce que vous exécutez ?

car il y a une virgule en trop dans le select

comme si vous aviez une 4ème rubrique extraite

Christophe a écrit :

C'est correcte la 4ème info est la distance :)

A+
Daryl

--
http://www.concept4u2.com
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on March, 29 2017 - 10:34 AM
re bonjour,

en fait j'ai reproposé une requête avec en 4eme rubrique la distance pour voir ce que le serveur MySQL calculait. Mais sur le tout premier message, il y a une virgule en trop car seulement 3 rubriques extraites du fichier 'MOI' et il y a une virgule après la troisième rubrique...

c'est cela que vous indiquer ;)
Registered member
1,304 messages
Popularité : +47 (51 votes)
Posted on March, 29 2017 - 2:22 PM
Salut Christophe,

Oui en effet :D

Toutes mes excuses

A+
Daryl

--
http://www.concept4u2.com
Registered member
64 messages
Popularité : -1 (1 vote)
Posted on March, 29 2017 - 11:36 PM
Merci à vous, le problème à été résolu,
J'ai crée une colonne Distance dans ma table et il faut faire la formule dans le SELECT et non dans le WHERE et je précise que pour qu'il réponde à ma condition j'ai du utilisé la clause HAVING à la place de la clause WHERE

SELECT
moi.IDPOI AS IDPOI,
moi.Latitude AS Latitude,
moi.Longitude AS Longitude,
(6371 * ACOS( ROUND( COS( radians( Latitude ) ) * COS( radians( {setLatitude} ) ) * COS( radians( {setLongitude} ) - radians( Longitude ) ) + SIN( radians(Latitude ) ) * SIN( radians( {setLatitude} ) ) , 10 ) ) ) AS Distance
FROM moi
HAVING Distance < {DistanceMax}


Merci à vous
Posted on March, 29 2017 - 11:57 PM
C'est très surprenant. La 1ère requête paraissait beaucoup plus correcte que la dernière.
Accessoirement je n'aime pas du tout acos( round (.... ) )
Par principe, j'effectue tous les calculs normaux, et au dernier moment, pour avoir un affichage sympa, je fais round()
Mais c'est hors-sujet.

Dans le 1er message tu dis ; ça ne plante pas.

Quand tu lances la requête, tu passes par HexecuteRequete ou un truc comme ça.
Il faut toujours tester les codes-retour (bien sur, le info ("Ok") est facultatif).

SI PAS HExécuteRequête ( ... ) alors
Erreur ( " requete incorrecte", etc etc )
RETOUR
FIN
Info ( " ok ")
// Suite du traitement.


Parce que sans ces précautions, avec une requête totalement fausse, tu peux croire que la requête renvoie 0 ligne, mais simplement, elle ne s'exécute pas.