|
|
|
|
|
- Utiliser la procédure dynamique
- Code dynamique
- Paramètres d'une requête
- Rubriques dans les fonctions HFSQL
- 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.
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
Formule est une procédure = Compile("Proc_dynamique", MonCodeSource)
SI ErreurDétectée = Faux ALORS
ExécuteTraitement("Proc_Dynamique", trtProcédure)
SINON
Info(ErreurInfo())
FIN
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> [, <Paramètres>])
<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.
<Paramètres> : Variable optionnelle de type CodeWLangageCompilation
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 Les 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 :
CONSTANTE
CST_Nom = 1
FIN
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)
]
sCode = Remplace(sCode, "CST_Nom", CST_Nom, MotComplet + SansCasse)
SI Compile("ProcDyn", sCode) <> "" ALORS
Erreur("Erreur de compilation de la procédure dynamique : ", ...
ErreurInfo())
SINON
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)
Rubriques dans les fonctions HFSQL Si le code source utilisé pour la compilation dynamique exécute une fonction HFSQL nécessitant le nom d'une rubrique en paramètre, ce nom doit être donné sous la forme d'une chaîne de caractères entre guillemets. Par exemple, le code à utiliser pour la fonction HLitRecherchePremier est le suivant :
HLitRecherchePremier(Article, "CodeArticle", "ValeurRecherchée")
au lieu de :
HLitRecherchePremier(Article, CodeArticle, "ValeurRecherchée")
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…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|