PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Surcharger HexécuteRequête
Surcharger HexécuteRequête
Iniciado por Yvan, jun., 24 2019 3:56 PM - 10 respostas
Membro registado
202 mensagems
Popularité : +6 (6 votes)
Publicado em junho, 24 2019 - 3:56 PM
Bonjour,

Je souhaite surcharger la procédure Windev HexécuteRequête comme je l'ai déjà fait avec succès pour HexécuteRequèteSQL.

Voici le code de la procédure surchargée :
Procedure HExécuteRequête(sRequete,*):booléen

SI gclConnexion:m_sTypeBase = hOledbSQLServer ALORS
RENVOYER WL.HExécuteRequête(sRequete,gclConnexion.m_sNomCnx,hRequêteSansCorrection,MesParamètres[2 À ])
SINON SI gclConnexion:m_bModeClientServeur
RENVOYER WL.HExécuteRequête(sRequete,gclConnexion.m_sNomCnx,hRequêteDéfaut,MesParamètres[2 À ])
SINON
RENVOYER WL.HExécuteRequête(sRequete,hRequêteDéfaut,MesParamètres[2 À ])
FIN


Mais j'obtiens le message d'erreur suivant :
Erreur à la ligne 10 du traitement Procédure globale HExécuteRequête.
Aucune syntaxe de 'HExécuteRequête' ne correspond à l'appel.

J'imagine que c'est parce que la requête passée en paramètre est une chaine alors qu'elle doit être une "requête" au sens Windev du terme.
J'ai essayé de traiter la requête en indirection mais là le message d'erreur est :
Erreur à la ligne 10 du traitement Procédure globale HExécuteRequête.
Le fichier, la vue ou la requête 'Select_Parametres' n'est pas connu.

Un conseil?

Merci.
Membro registado
3.887 mensagems
Popularité : +227 (347 votes)
Publicado em junho, 24 2019 - 4:27 PM
Yvan a écrit :

J'imagine que c'est parce que la requête passée en paramètre est une chaîne alors qu'elle doit être une "requête" au sens Windev du terme.


C'est en effet cela. Éventuellement, cela peut être une variable de type Requête SQL ou le nom d'une requête créée sous l'éditeur

--
Il y a peut être plus simple, mais, ça tourne
Mensagem modificada, junho, 24 2019 - 4:28 PM
Membro registado
202 mensagems
Popularité : +6 (6 votes)
Publicado em junho, 24 2019 - 8:36 PM
OK, mais même en constatant ça, Windev n'interprète pas le paramètre comme tel, même en essayant une indirection (pas vraiment prévue pour les requêtes de l'éditeur).
Membro registado
1.623 mensagems
Popularité : +100 (114 votes)
Publicado em junho, 25 2019 - 10:28 AM
Hello,

Peux nous montrer le code qui fait appel a cette procédure ?
Membro registado
202 mensagems
Popularité : +6 (6 votes)
Publicado em junho, 25 2019 - 11:59 AM
Bonjour,

En fait j'aimerai surcharger tous mes appels à HexécuteRequête, et donc ne lui passer plus que la requête et ses paramètres:

SI HExécuteRequête(Select_couleurEntrepotUnique,Table_Articles.COL_VOCARTIDA[i] ) ALORS


Dans le code ci-dessus, Select_couleurEntrepotUnique est une requête construite sous l'éditeur qui attend 1 paramètre. Dans de rares cas ce sera une variable de type requete SQL, mais si nécessaire je les traiterais autrement.

Juste pour info, l'application concernée peut fonctionner sur une DB HFSQL classique, ou HFSQL CS ou MSSQL, ce qui explique mes 3 syntaxes du hexécuteRequête.

Yvan
Membro registado
1.623 mensagems
Popularité : +100 (114 votes)
Publicado em junho, 25 2019 - 12:32 PM
Et quand tu execute le code avec
SI HExécuteRequête(Select_couleurEntrepotUnique,Table_Articles.COL_VOCARTIDA[i] ) ALORS


Tu a l'erreur ? .. c'est curieux, si Select_couleurEntrepotUnique est une requete en provenance de l'editeur ca devrait fonctionner ... :s
Publicado em junho, 25 2019 - 2:56 PM
Oui, l'erreur est celle reprise plus haut (requête différente mais le problème est identique pour toutes) :

Yvan a écrit :

Mais j'obtiens le message d'erreur suivant :
Erreur à la ligne 10 du traitement Procédure globale HExécuteRequête.
Aucune syntaxe de 'HExécuteRequête' ne correspond à l'appel.

J'ai essayé de traiter la requête en indirection mais là le message d'erreur est :
Erreur à la ligne 10 du traitement Procédure globale HExécuteRequête.
Le fichier, la vue ou la requête 'Select_Parametres' n'est pas connu.
Publicado em junho, 25 2019 - 3:37 PM
Bonjour,

En utilisant une variable source de données, ça semble fonctionner.

Procedure HExécuteRequête(sRequete est une Source dede Données,*):booléen

LOCAL
bRet est un booléen


bRet = WL.HExécuteRequête(sRequete,hRequêteDéfaut)
SI PAS bRet ALORS
Erreur(ErreurInfo())
SINON
Info("Je m'épate !")
FIN

RENVOYER bRet


appel :
rDateArchivage.pNomBase = "blabla"
HExécuteRequête(rDateArchivage, hRequêteDéfaut)
Info(HNbEnr(rDateArchivage))
SI HLitPremier(rDateArchivage) ALORS Info(rDateArchivage.DateArchivage)


Je ne passe jamais les paramètres directement via HExecuteRequete mais j'imagine que ça devrait fonctionner.
Membro registado
202 mensagems
Popularité : +6 (6 votes)
Publicado em junho, 25 2019 - 7:04 PM
Bonjour Erwan,

Excellente idée, ça fonctionne.
Petit bémol, il faut de fait gérer les paramètres différemment, sinon ils sont tous traités comme des chaines et les requêtes ne savent plus retourner un résultat correct, ce qui est logique. De plus, ça me forcera à passer mes paramètres à ces requêtes avant le hexécuteRequête et ainsi d'éviter que l'ordre des paramètres se mélange d'une version windev à l'autre...

Merci à vous tous de m'avoir aidé à écrire correctement cette surcharge bien pratique.

Voici finalement comment j'utilise la surcharge :

// Résumé : redéfini la méthode Windev
Procedure HExécuteRequête(sdReq est une Source dede Données,nMode=-1):booléen
SI nMode = -1 ALORS
SI gclConnexion:m_sTypeBase = hOledbSQLServer ALORS
RENVOYER WL.HExécuteRequête(sdReq,gclConnexion.m_sNomCnx,hRequêteSansCorrection)
SINON SI gclConnexion:m_bModeClientServeur
RENVOYER WL.HExécuteRequête(sdReq,gclConnexion.m_sNomCnx,hRequêteDéfaut)
SINON
RENVOYER WL.HExécuteRequête(sdReq,hRequêteDéfaut)
FIN
SINON
SI gclConnexion:m_sTypeBase = hOledbSQLServer ALORS
RENVOYER WL.HExécuteRequête(sdReq,gclConnexion.m_sNomCnx,nMode)
SINON SI gclConnexion:m_bModeClientServeur
RENVOYER WL.HExécuteRequête(sdReq,gclConnexion.m_sNomCnx,nMode)
SINON
RENVOYER WL.HExécuteRequête(sdReq,nMode)
FIN
FIN


Par défaut je ne passe pas de mode à HExécuteRequête et du coup j'utilise le mode qui m'intéresse selon le type de BDD, et je me garde le droit de le forcer au besoin.
Dans mon code, je repasse sur tous mes HExécuteRequête et j'identifie les paramètres de la requête avant l'appel :

select_DroitsVisuEditSupp.ParamIdUser = :p_nIdUtilisateur
SI HExécuteRequête(select_DroitsVisuEditSupp) ALORS


Bons devs.
Membro registado
3.887 mensagems
Popularité : +227 (347 votes)
Publicado em junho, 25 2019 - 8:07 PM
Pourquoi ne pas utiliser TypeVar
Procedure HExécuteRequête(MaReq,*):booléen
SELON TypeVar(MaReq)
CAS wlSourceDeDonnées :
....
CAS wlChaîne :
...
AUTRE CAS :
//Traiter éventuellement les autres type de chaine


--
Il y a peut être plus simple, mais, ça tourne
Publicado em junho, 27 2019 - 4:25 PM
Rebonjour,

Il y a tout de même un bémol...
Ca fonctionne bien pour les sources de données, c'est à dire les requêtes faites via l'éditeur.
Par contre les requêtes SQL faites via le type de variable requête SQL, ça ne fonctionne pas.

Le message d'erreur est : "l'élement _QUERY_Select_29 n'a pas été trouvé".

J'ai bien tenté de passer par un typevar(), car de fait le type de variable d'une variable requête SQL est wlRequeteSQL et pas wlSourceDeDonnees, mais ça ne m'avance pas de le savoir, car je ne peut typer une variable dans ce type qu'en déclarant sont contenu directement, alors qu'ici je la reçoit en paramètre et je veux juste la transmettre à la fonction Windev mais correctement typée...

Bref, je crois que pour les requêtes SQL faites via le type de variable requête SQL je vais oublier la surcharge ...
Sauf si vous avez une meilleur idée.