PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → Condition requete SQL
Condition requete SQL
Iniciado por Monsieur AURAY-LORIVAL, 28,mar. 2017 00:53 - 9 respuestas
Miembro registrado
64 mensajes
Popularité : -1 (1 vote)
Publicado el 28,marzo 2017 - 00:53
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
Publicado el 28,marzo 2017 - 02:52
Coucou,

Tu peut joindre deux samples de donnée ?

Charly
Miembro registrado
64 mensajes
Popularité : -1 (1 vote)
Publicado el 28,marzo 2017 - 08:06
Biensur,

Voici deux sample de ma base:


Miembro registrado
939 mensajes
Popularité : +66 (68 votes)
Publicado el 28,marzo 2017 - 17:56
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 ?
Miembro registrado
939 mensajes
Popularité : +66 (68 votes)
Publicado el 28,marzo 2017 - 17:57
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
Miembro registrado
1.304 mensajes
Popularité : +47 (51 votes)
Publicado el 28,marzo 2017 - 20:51
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
Miembro registrado
939 mensajes
Popularité : +66 (68 votes)
Publicado el 29,marzo 2017 - 10:34
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 ;)
Miembro registrado
1.304 mensajes
Popularité : +47 (51 votes)
Publicado el 29,marzo 2017 - 14:22
Salut Christophe,

Oui en effet :D

Toutes mes excuses

A+
Daryl

--
http://www.concept4u2.com
Miembro registrado
64 mensajes
Popularité : -1 (1 vote)
Publicado el 29,marzo 2017 - 23:36
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
Publicado el 29,marzo 2017 - 23:57
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.