DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Fonctions WLangage / Fonctions standard / Fonctions de gestion de Windows / Fonctions diverses WINDEV
  • 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
WINDEV
WindowsLinuxJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac Catalyst
Autres
Procédures stockées
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.
Remarque : Les fonctions ExécuteCode et EvalueExpression permettent également d'utiliser du code généré dynamiquement.
// 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> [, <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
iPhone/iPad

Compilation dynamique d'une procédure globale associée à une variable de type Procédure Masquer les détails

<Résultat> = Compile(<Nom de la procédure> , <Code source> [, <Paramètres>])
<Résultat> : Variable de type Procédure
Nom de la variable de type Procédure pointant sur la procédure compilée.
La procédure peut être exécutée :
En cas d'erreur de compilation, la variable ErreurDétectée est à Vrai et la fonction ErreurInfo permet d'obtenir le détail 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".
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
iPhone/iPad

Compilation dynamique d'une procédure anonyme Masquer les détails

<Résultat> = Compile(<Code source> [, <Paramètres>])
<Résultat> : Variable de type Procédure
Nom de la variable de type Procédure pointant sur la procédure compilée.
La procédure peut être exécutée par un appel de la variable Procédure.
En cas d'erreur de compilation, la variable ErreurDétectée est à Vrai et la fonction ErreurInfo permet d'obtenir le détail de l'erreur.
La procédure est compilée en tant que procédure globale. Pour compiler une procédure associée à une fenêtre, il est nécessaire de nommer la procédure (syntaxe 2).
<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.
  • 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)
    ]
    
    // 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)

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.
iPhone/iPad

Limitations

  • Si une fenêtre (une page) du projet utilise une procédure locale ayant pour nom <Nom de la procédure>, les appels à <Nom de la Procédure> effectués depuis un événement WLangage de la fenêtre (de la page) exécuteront toujours la procédure locale.
  • Si une procédure globale <Nom de la procédure> existe déjà, la compilation dynamique d'une procédure <Nom de la procédure> provoquera une erreur.
  • Par défaut, la surcharge des fonctions du WLangage n'est pas prise en compte lors de la compilation dynamique.
    Par exemple, si vous avez surchargé la fonction Trace, l'appel de cette fonction dans un code compilé dynamiquement appellera la fonction WLangage et non la fonction surchargée. Pour forcer l'utilisation de la fonction surchargée dans la compilation dynamique, faites précéder le nom de la fonction par le mot-clé "Externe".
  • Les énumérations et les combinaisons ne sont pas disponibles en compilation dynamique.
Liste des exemples associés :
Compilation dynamique 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.
Composante : wd300vm.dll
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
demande de précisions
Bonjour,

Pouvez-vous s'il vous plaît, préciser la durée de vie d'une procédure compilée dynamiquement ?
Par exemple, si la compilation est faite dans le constructeur d'une classe, à quel moment la procédure disparaît (de la mémoire de l'ordinateur) ?
Faut-il libérer la procédure ? Si oui, comment ? ...

Merci
M

mlemaudit
16 nov. 2017

Dernière modification : 20/09/2024

Signaler une erreur ou faire une suggestion | Aide en ligne locale