PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Requete qui ne fonctionne plus apres migration vers hfsql C/S
Requete qui ne fonctionne plus apres migration vers hfsql C/S
Débuté par Guillaume, 01 déc. 2017 08:59 - 6 réponses
Membre enregistré
79 messages
Popularité : +1 (1 vote)
Posté le 01 décembre 2017 - 08:59
Bonjour,

J'ai migré récemment une base HFSQL Classique vers HFSQL C/S (c'est ma 1ere fois). En recompilant l'exe j'en ai profité pour mettre en place le GroupWare utilisateur.
ça semblait sans souci... et je me rends compte en ouvrant mon "module de stats" qu'une requête qui marchait avant la migration ne fonctionne plus :
Voici le code (on note qu'il y a 2 requêtes exécutées au préalable, jusque là tout va bien)
//Nb d'élèves musiciens ne suivant pas de FM ou éveil
//Enfants
nEnfPasDeFM est un entier
HExécuteRequête(REQ___ReADIAM_ELEVES_ACTIFS,hRequêteDéfaut)
HExécuteRequête(REQ___ReADIAM_EnfantsActifs,hRequêteDéfaut)

sdEnfPasDeFM est une Source dede Données
sSqlEnfPasDeFM est une chaîne = "SELECT * FROM REQ___ReADIAM_EnfantsActifs WHERE ID_ELEVE IN (SELECT ID_ELEVE FROM TBL_ELPRCOLL WHERE ID_NIV = 0)"
HExécuteRequêteSQL(sdEnfPasDeFM,hRequêteDéfaut,sSqlEnfPasDeFM)
nEnfPasDeFM = HNbEnr(sdEnfPasDeFM)

Mais la dernière requête ne passe pas... si je fais un hErreurInfo() j'obtiens
"Erreur renvoyée par le serveur <SERVEUR:4900> Impossible d'ouvrir le fichier <NOM_DE_LA_DB\>"

Si je shunte l'erreur, alors là c'est verbeux mais ça ne me dit rien de plus.
Ai-je oublié quelque chose ? faut il utiliser hDéclare alors qu'il s'agit d'une table existante dans la base hfsql ?

Vu que le C/S me permet d'utiliser des vues, j'aurais peut être de meilleurs résultats par ce biais. Mais si quelqu'un a déjà rencontré ce problème (et trouvé une solution).

Merci et bonne journée,
Membre enregistré
1 939 messages
Popularité : +53 (65 votes)
Posté le 01 décembre 2017 - 09:39
Bonjour,

Je vous suggère de commencer par vérifier le bon déroulement de la requête REQ___ReADIAM_EnfantsActifs puis de tester avec un code simplifié :
//Nb d'élèves musiciens ne suivant pas de FM ou éveil
//Enfants
nEnfPasDeFM est un entier
SI PAS HExécuteRequête(REQ___ReADIAM_EnfantsActifs,hRequêteDéfaut) ALORS
Erreur(HErreurInfo())
SINON
sdEnfPasDeFM est une Source dede Données
sSqlEnfPasDeFM est une chaîne = "SELECT * FROM REQ___ReADIAM_EnfantsActifs WHERE ID_ELEVE = 1)"
SI PAS HExécuteRequêteSQL(sdEnfPasDeFM,hRequêteDéfaut,sSqlEnfPasDeFM) ALORS
Erreur(HErreurInfo())
SINON
nEnfPasDeFM = HNbEnr(sdEnfPasDeFM)
FIN
FIN

--
Bon dev,
Jean-Pierre
Message modifié, 01 décembre 2017 - 09:49
Membre enregistré
79 messages
Popularité : +1 (1 vote)
Posté le 01 décembre 2017 - 09:51
Bonjour et merci de prendre part :)

En pas à pas les 2 requêtes appelées au préalable renvoient vrai :/
Détail de ces requêtes :
ELEVES_ACTIFS
SELECT ID_ELEVE,NOM,PRENOM,DATE_NAISS, (MONTHS_BETWEEN(SYSDATE,DATE_NAISS)/12) AS AGEELEVE FROM TBL_ELEVES
WHERE ID_ELEVE IN (SELECT ID_ELEVE FROM TBL_ELPRCOLL)


ENFANTS_ACTIFS
SELECT * FROM REQ___ReADIAM_ELEVES_ACTIFS WHERE AGEELEVE < 18


Mais le plus surprenant, c'est que si je décompose la requête problématique en 2 et que j'exécute chacune d'elles indépendamment, aucun souci d'accès aux données...
SELECT * FROM REQ___ReADIAM_EnfantsActifs

puis
SELECT ID_ELEVE FROM TBL_ELPRCOLL WHERE ID_NIV = 0


Je m'attelle à trouver un autre moyen mais c'est quand même curieux vu que ma fenêtre se remplissait bien avant la migration.
Membre enregistré
79 messages
Popularité : +1 (1 vote)
Posté le 01 décembre 2017 - 10:01
En tout cas ce code passe :

//Nb d'élèves musiciens ne suivant pas de FM ou éveil
//Enfants
nEnfPasDeFM est un entier
SI PAS HExécuteRequête(REQ___ReADIAM_ELEVES_ACTIFS,hRequêteDéfaut) ALORS
Erreur(HErreurInfo())
SINON
SI PAS HExécuteRequête(REQ___ReADIAM_EnfantsActifs,hRequêteDéfaut) ALORS
Erreur(HErreurInfo())
SINON
sdEnfPasDeFM est une Source dede Données
sSqlEnfPasDeFM est une chaîne = "SELECT * FROM REQ___ReADIAM_EnfantsActifs"
SI PAS HExécuteRequêteSQL(sdEnfPasDeFM,hRequêteDéfaut,sSqlEnfPasDeFM) ALORS
Erreur(HErreurInfo())
SINON
nEnfPasDeFM = HNbEnr(sdEnfPasDeFM)
FIN
FIN
FIN
Membre enregistré
326 messages
Popularité : +15 (19 votes)
Posté le 01 décembre 2017 - 10:27
Bonjour.
Question bête de ma part -> comment as-tu fait ta migration ?
Plus précisément ton analyse est-elle toujours sur des fichiers HF Classic ou non ? Vu le message, je pencherai pour un problème de connexion à la base.
As-tu le problème avec un "GO" et/ou en exécution ?

Michel.
Membre enregistré
79 messages
Popularité : +1 (1 vote)
Posté le 01 décembre 2017 - 10:34
Bonjour

J'ai importé mes fichiers "classic" depuis le centre de contrôle, ajouté la chaîne de connexion dans le code init du projet
HDécritConnexion("HyperFileCS","admin","mdp","SERVEUR:4900","CCKA_EMK",hAccèsHFClientServeur)
HChangeConnexion("*","HyperFileCS")
HCréationSiInexistant("*")


Dans mon analyse les tables sont passées en orange et tout semble coller quand je regarde les propriétés desdites tables.
D'ailleurs l'essentiel de l'appli reste fonctionnel, tant en prod avec le dernier exe installé (ou en gros je n'ai ajouté que le code de connexion) qu'en test avec Go.

Mais j'ai cette satanée requête qui ne passe plus, en prod comme en test :(

Est-ce que le fait que la connexion décrite comme "hyperfileCS" s'appelle CnxEmkCs dans l'analyse peut être le problème (ce serait subtil puisque tout le reste fonctionne en l'état)
Message modifié, 01 décembre 2017 - 10:36
Membre enregistré
79 messages
Popularité : +1 (1 vote)
Posté le 01 décembre 2017 - 10:59
Bon, je n'arrive pas à expliquer et les rapports de plantage sont... variables.
Mais maintenant que je suis en C/S, je peux faire avec des vues et là, ma fenêtre de stats s'affiche sans erreur...

HRafraîchitVue(CnxEmkCS,VUE_ADIAM)
//Nb d'élèves musiciens ne suivant pas de FM ou éveil
//Enfants
nEnfPasDeFM est un entier
sdEnfPasDeFM est une Source dede Données
sSqlEnfPasDeFM est une chaîne = "SELECT * FROM VUE_ADIAM WHERE AGEELEVE < 18 AND ID_NIV=0"
SI PAS HExécuteRequêteSQL(sdEnfPasDeFM,hRequêteDéfaut,sSqlEnfPasDeFM) ALORS
Erreur(HErreurInfo())
SINON
nEnfPasDeFM = HNbEnr(sdEnfPasDeFM)
FIN


Résolu... par contournement ;)

Merci quand même, et si quelqu'un a une idée de ce qui s'est passé ou a déjà rencontré ce genre de tuile, ça aidera toujours :)