|
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.898 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 tourneMensagem 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 :
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.898 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 :
-- 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. |
| |
| |
| | | |
|
| | | | |
| | |
|