PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Requete MySQL dans une boucle
Requete MySQL dans une boucle
Débuté par Jeremy, 14 mai 2018 09:06 - 8 réponses
Posté le 14 mai 2018 - 09:06
Bonjour,

Je crée une appli qui doit récupérer en boucle des données depuis une base MySQL. En gros la boucle se présente comme ci-dessous.

Le premier passage dans la boucle se passe à merveille. Je récupère mes données normalement.
Au passage suivant, j'obtiens une erreur :

=====================================================================
Que s'est-il passé ?
La rubrique HFSQL '_SOURCE_sdRes_1.Col1' est inconnue.

Code erreur : 1022
Niveau : erreur fatale

Dump de l'erreur du module 'wd230vm64.dll' (23.0.319.3).
Identifiant des informations détaillées (.err) : 1022
Informations de débogage :
Recuperation d'un ItemData apres bStillAvailable()==FALSE
Informations supplémentaires :
EIT_PILEWL :
Procédure globale MAJ_TableauDeBord (COL_ProcéduresGlobales.MAJ_TableauDeBord), ligne 71
EIT_DATEHEURE : 12/05/2018 16:52:51
EIT_TYPE_WDFILE : <7>
EIT_IDCODE : <458752>
=====================================================================

L'erreur parle de HFSQL, ce qui me semble étrange, vu que je n'utilise pas HFSQL mais une source MySQL via le connecteur natif...

J'utilise Windev 23, dans sa dernière MAJ, et la DLL libmysql.dll en version 5.6

J'ai tracé le retour de données, juste après le HExecuteRequeteSQL, j'ai bien des lignes, et des colonnes dont le nom correspond exactement au 1er passage, ce qui est logique vu que la requête n'a pas changé.

Je pense qu'il y a un bug quelque part, mais je pense pas dans mon code. La même requête sur une base HFSQL fonctionne en boucle sans aucun problème...

Des idées, au moins de contournement ? J'ai pensé à créer une variable source de données à chaque itération de boucle, mais manifestement, on ne peut pas créer dynamiquement de variable sous Windev.

En vous remerciant pour vos suggestions. En attendant, j'ai ouvert un ticket au ST.
Jeremy


Code de la Boucle
=====================================================================
// déclaration requete SQL
sRequeteSQL est une chaine = "SELECT * FROM table"

BOUCLE()

HouvreConnexion(MySQL_descConn)

// déclaration source de données qui récupère le résultat
sdResSQL est une source de données

// Execution !
HExecuteRequeteSQL(sdRes,MySQL_descConn,sRequeteSQL,hrequetesanscorrection)

// traitement du résultat
HlitPremier(sdRes)
TANTQUE PAS HEndehors(sdRes)
tableajouteligne(TABLE_Res,sdRes.Col1,sdRes.Col2)
HLitSuivant(sdRes)
FIN

// Destruction
HAnnuleDéclaration(sdRes)

// Attente avant prochain passage dans la boucle
Temporisation (600)

FIN
Posté le 14 mai 2018 - 09:35
Bonjour,
Pourquoi ouvres-tu la connexion dans la boucle ?
Il vaut mieux le faire avant d'entrer dans la boucle.
Il manque aussi la condition de sortie de boucle, ainsi que la fermeture de
la connexion.

Frédéric.

"Jeremy" a écrit dans le message de groupe de discussion :
2018c10c0e57226f043bf9c3a6e1ed698748@news.pcsoft.fr...

Bonjour,

Je crée une appli qui doit récupérer en boucle des données depuis une base
MySQL. En gros la boucle se présente comme ci-dessous.

Le premier passage dans la boucle se passe à merveille. Je récupère mes
données normalement.
Au passage suivant, j'obtiens une erreur :

=====================================================================
Que s'est-il passé ?
La rubrique HFSQL '_SOURCE_sdRes_1.Col1' est inconnue.

Code erreur : 1022
Niveau : erreur fatale

Dump de l'erreur du module 'wd230vm64.dll' (23.0.319.3).
Identifiant des informations détaillées (.err) : 1022
Informations de débogage :
Recuperation d'un ItemData apres bStillAvailable()==FALSE
Informations supplémentaires :
EIT_PILEWL :
Procédure globale MAJ_TableauDeBord
(COL_ProcéduresGlobales.MAJ_TableauDeBord), ligne 71
EIT_DATEHEURE : 12/05/2018 16:52:51
EIT_TYPE_WDFILE : <7>
EIT_IDCODE : <458752>
=====================================================================

L'erreur parle de HFSQL, ce qui me semble étrange, vu que je n'utilise pas
HFSQL mais une source MySQL via le connecteur natif...

J'utilise Windev 23, dans sa dernière MAJ, et la DLL libmysql.dll en version
5.6

J'ai tracé le retour de données, juste après le HExecuteRequeteSQL, j'ai
bien des lignes, et des colonnes dont le nom correspond exactement au 1er
passage, ce qui est logique vu que la requête n'a pas changé.

Je pense qu'il y a un bug quelque part, mais je pense pas dans mon code. La
même requête sur une base HFSQL fonctionne en boucle sans aucun problème...

Des idées, au moins de contournement ? J'ai pensé à créer une variable
source de données à chaque itération de boucle, mais manifestement, on ne
peut pas créer dynamiquement de variable sous Windev.

En vous remerciant pour vos suggestions. En attendant, j'ai ouvert un ticket
au ST.
Jeremy


Code de la Boucle
=====================================================================
// déclaration requete SQL
sRequeteSQL est une chaine = "SELECT * FROM table"

BOUCLE()

HouvreConnexion(MySQL_descConn)

// déclaration source de données qui récupère le résultat
sdResSQL est une source de données

// Execution !
HExecuteRequeteSQL(sdRes,MySQL_descConn,sRequeteSQL,hrequetesanscorrection)

// traitement du résultat
HlitPremier(sdRes)
TANTQUE PAS HEndehors(sdRes)
tableajouteligne(TABLE_Res,sdRes.Col1,sdRes.Col2)
HLitSuivant(sdRes)
FIN

// Destruction
HAnnuleDéclaration(sdRes)

// Attente avant prochain passage dans la boucle
Temporisation (600)

FIN
Posté le 14 mai 2018 - 12:36
Merci Frédéric pour ta réponse.

J'ai essayé d'ouvrir la connexion avant la boucle, ça ne change rien.
Concernant l'instruction de sortie de boucle, il n'y en a pas. La boucle tourne tant que le programme s'exécute, c'est le principe demandé par le client. Il y a juste une temporisation entre 2 passages dans la boucle.

La fermeture de la connexion se fait après, lors de la fermeture du programme.

Si tu as d'autres idées, je prends
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 14 mai 2018 - 13:01
Bonjour,

Je suis d'accord avec Frédéric, ouvrir la connexion dans la boucle n'a aucun sens.

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 14 mai 2018 - 14:02
J'entends bien, d'ailleurs initialement, la connexion était ouverte avant la boucle.
Face à mon problème, j'essaie n'importe quelle piste, qu'elle ait du sens ou non...

Au 1er passage dans la boucle, je peux exploiter le résultat de la requête, et pas au suivant.
Entre les deux passages, rien n'a changé. Ni la requête, ni son résultat, ni la variable "source de données".

Ca n'a aucun sens non plus. Et d'ailleurs, si je change le serveur source MySQL par un serveur HFSQL, ça fonctionne très bien dans chaque passage de boucle........
Posté le 14 mai 2018 - 15:09
Il faudrait tester le retour de hExecuteRequeteSQL, et le cas échéant
afficher le message d'erreur.
MySQL te dira certainement ce qui ne va pas.

Frédéric.

"Jeremy" a écrit dans le message de groupe de discussion :
20182546d0563eeacf3fce4453998697cd20@news.pcsoft.fr...

Merci Frédéric pour ta réponse.

J'ai essayé d'ouvrir la connexion avant la boucle, ça ne change rien.
Concernant l'instruction de sortie de boucle, il n'y en a pas. La boucle
tourne tant que le programme s'exécute, c'est le principe demandé par le
client. Il y a juste une temporisation entre 2 passages dans la boucle.

La fermeture de la connexion se fait après, lors de la fermeture du
programme.

Si tu as d'autres idées, je prends
Posté le 14 mai 2018 - 17:48
Frédéric DEMILLY a écrit :
Il faudrait tester le retour de hExecuteRequeteSQL, et le cas échéant
afficher le message d'erreur.


Je l'ai testé, il n'y a pas d'erreur. Il y a le même nombre de lignes et toutes les colonnes sont au rendez-vous avec le même nom.

Le message d'erreur s'affiche au moment de parser la variable qui contient le résultat de la requête.
Aucun problème au moment du HLitPremier, juste au moment d'utiliser nomdelavarialble.nomdelacolonne

> MySQL te dira certainement ce qui ne va pas.

Il n'y a aucun problème coté MySQL.....
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 14 mai 2018 - 19:40
Bonjour,

Il y a plusieurs choses bizarres.

1- tu déclares la source de donnée dans la boucle. Il faut déclarer ta variable à l'extérieur de la boucle.
2- ta source de données s'appelle 'sdResSQL' dans la déclaration et tu appelles 'sdRes' dans ta boucle.
3- Tu devais supprimer le HAnnuleDéclaration(). Tu ne dois utiliser cette instruction que lorsque tu ne t'en sers plus du tout, or là tu t'en sers toutes les 6 secondes. Extrait de la doc
Conditions d'utilisation de HAnnuleDéclaration
Cette fonction ne doit être utilisée QUE lorsque vous n'avez plus besoin du fichier de données (ou de la requête) concerné !


--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 15 mai 2018 - 08:43
Bonjour,

Tu inverses les paramètres dans : HExecuteRequeteSQL(sdRes,MySQL_descConn,sRequeteSQL,hrequetesanscorrection)

Le dernier paramètre doit être le code SQL de ta requête.
A+