|
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+ |
| |
| |
| | | |
|
| | | | |
| | |
|