- Utiliser la procédure dynamique
- Code dynamique
- Paramètres d'une requête
- Déploiement d'une application utilisant la fonction Compile
- Limitations
Compile (Fonction) En anglais : Compile Compile dynamiquement une procédure dont le code source est fourni. La procédure créée et compilée est une procédure globale au projet.
// Syntaxe 1 : Compilation dynamique d'une procédure globale // Source : champ dans lequel est saisi le code de procédure sRésultat est une chaîne sRésultatCompile est une chaîne sRésultatCompile = Compile("Proc_dynamique", MonCodeSource) SELON sRésultatCompile CAS "" : sRésultat = ExécuteTraitement("Proc_dynamique", trtProcédure) CAS "ERR" : sRésultat = "Compilation impossible." + RC + ErreurInfo() AUTRE CAS : sRésultat = sRésultatCompile FIN RENVOYER sRésultat
// Syntaxe 2 : Compilation dynamique d'une procédure globale // Utilisation du type Procédure // Source : champ dans lequel est saisi le code de procédure Formule est une procédure = Compile("Proc_dynamique", MonCodeSource) SI ErreurDétectée = Faux ALORS ExécuteTraitement("Proc_Dynamique", trtProcédure) // Autre possibilité pour exécuter la procédure : Formule() SINON Info(ErreurInfo()) FIN
// Syntaxe 3 : Compilation dynamique d'une procédure globale // Utilisation directe du type Procédure // Source : champ dans lequel est saisi le code de procédure Formule est une procédure = Compile(MonCodeSource) SI ErreurDétectée = Faux ALORS Formule() SINON Info(ErreurInfo()) FIN
Syntaxe
Compilation dynamique d'une procédure globale Masquer les détails
<Résultat> = Compile(<Nom de la procédure> , <Code source>)
<Résultat> : Chaîne de caractères Résultat de la compilation :- Chaîne vide ("") si la compilation a réussi. La procédure peut être exécutée grâce aux fonctions ExécuteTraitement et Exécute utilisées avec la constante trtProcédure .
- ERR si une erreur grave est survenue : fichier wdxxxcpl.dll non trouvé, <Code source> incorrect, pas de projet en cours, procédure globale déjà créée, etc. La fonction ErreurInfo permet d'obtenir le détail de l'erreur.
- Un message d'erreur si une erreur de compilation a été détectée. Ce message correspond au libellé de l'erreur.
<Nom de la procédure> : Chaîne de caractères Nom de la procédure globale dynamique à créer.Pour créer une procédure locale, il suffit de préciser le nom de l'élément. Par exemple : "NomFenêtre.NomProcédure". Attention : Si la fonction Compile est appelée plusieurs fois avec le même nom de procédure, la dernière procédure créée est automatiquement écrasée. <Code source> : Chaîne de caractères Code source en WLangage de la procédure à compiler dynamiquement. - Si ce code contient des guillemets, il est nécessaire de les doubler (voir Exemple).
- Ce code peut contenir le code d'appel et de déclaration d'une procédure interne.
Remarques Utiliser la procédure dynamique - Si vous utilisez la première syntaxe, pour utiliser vos procédures dynamiques, il suffit de lancer la procédure grâce à la fonction ExécuteTraitement ou à la fonction Exécute.
Autre solution (déconseillée) : avant d'exécuter la fonction Compile, déclarez le nom de la procédure au compilateur du WLangage grâce au mot-clé EXTERNE et utilisez directement la procédure. - Si vous utilisez la seconde syntaxe, pour utiliser vos procédures dynamiques, il suffit de lancer la procédure :
- Si vous utilisez la troisième syntaxe, pour utiliser vos procédures dynamiques, il suffit de lancer la procédure par un appel direct de la variable de type Procédure.
Une procédure compilée dynamiquement peut attendre de paramètres. Exemple :
MonCodeSource est une chaîne = [ PROCÉDURE AdditionneXetY(aa, bb) RENVOYER aa + bb ] MaProc est une procédure = Compile(MonCodeSource) Trace(MaProc(2, 3))
Code dynamique Nouveauté 28Les structures peuvent être utilisées dans le code dynamique. Les constantes ne peuvent pas être utilisées dans le code dynamique (définies avec le mot-clé CONSTANTE). Lors de l'utilisation de constantes dans un code, toutes les occurrences des constantes sont remplacées par leur valeur au moment de la compilation sous l'éditeur, mais la correspondance entre le nom des constantes et leur valeur n'est pas "embarquée" dans l'application. Donc la compilation dynamique ne peut pas utiliser les constantes. Voici deux alternatives : - 1ère solution : Utiliser des variables à la place des constantes.
Le code :
devient par exemple
CST_Nom est un entier = 1
- 2ème solution : Dans la chaîne qui contient le code à compiler dynamiquement, il suffit de remplacer le nom de la constante par sa valeur :
sCode est une chaîne sCode = [ Info(CST_Nom) ] // Remplace le nom de la constante par sa valeur sCode = Remplace(sCode, "CST_Nom", CST_Nom, MotComplet + SansCasse) // Il est ensuite possible de compiler le code SI Compile("ProcDyn", sCode) <> "" ALORS Erreur("Erreur de compilation de la procédure dynamique : ", ... ErreurInfo()) SINON // Puis de l'exécuter QUAND EXCEPTION DANS ExécuteTraitement("ProcDyn", trtProcédure) FAIRE Erreur("Erreur d'exécution de la procédure dynamique : ", ... ExceptionInfo()) FIN FIN
Paramètres d'une requête Si le code source utilisé pour la compilation dynamique exécute une requête paramétrée (fonction HExécuteRequête), les paramètres attendus par la requête doivent obligatoirement être précisés dans la fonction HExécuteRequête. Par exemple, il faut utiliser :
HExécuteRequête("MaRequête", hRequêteDéfaut, "Dupont")
au lieu de :
MaRequête.NomClient = "Dupont" HExécuteRequête("MaRequête", hRequêteDéfaut)
Déploiement d'une application utilisant la fonction Compile Lors du déploiement d'une application utilisant la fonction Compile (création de l'exécutable ou déploiement du site), il est nécessaire d'indiquer toutes les librairies du Framework WINDEV/WEBDEV/WINDEV Mobile utilisées par le code compilé dynamiquement. En effet, ce code étant compilé dynamiquement, WINDEV, WEBDEV et WINDEV Mobile ne détectent pas les librairies du framework utilisées.
Liste des exemples associés :
|
Exemples unitaires (WINDEV) : Compilation dynamique
[ + ] Compilation dynamique de code WLangage (stocké sous forme de chaîne), exécution de la procédure générée dynamiquement et traitement des éventuelles erreurs d'exécution. La compilation dynamique est très utile par exemple dans le cas de calculs mathématiques proposés à l'utilisateur final.
|
Documentation également disponible pour…
|
|
|