PC SOFT

DOCUMENTATION EN LIGNE
DE WINDEV, WEBDEV ET WINDEV MOBILE

  • Utiliser la procédure dynamique
  • Code dynamique
  • Paramètres d'une requête
  • Déploiement d'une application utilisant la fonction Compile
  • Limitations
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadApple WatchUniversal Windows 10 AppWindows Mobile
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.
Versions 17 et supérieures
Remarque : Les fonctions ExécuteCode et EvalueExpression permettent également d'utiliser du code généré dynamiquement.
Nouveauté 17
Remarque : Les fonctions ExécuteCode et EvalueExpression permettent également d'utiliser du code généré dynamiquement.
Remarque : Les fonctions ExécuteCode et EvalueExpression permettent également d'utiliser du code généré dynamiquement.
Versions 17 et supérieures
iPhone/iPad Cette fonction est désormais disponible pour les applications iPhone/iPad.
Nouveauté 17
iPhone/iPad Cette fonction est désormais disponible pour les applications iPhone/iPad.
iPhone/iPad Cette fonction est désormais disponible pour les applications iPhone/iPad.
Versions 22 et supérieures
Universal Windows 10 App Cette fonction est désormais disponible en mode Universal Windows 10 App.
Nouveauté 22
Universal Windows 10 App Cette fonction est désormais disponible en mode Universal Windows 10 App.
Universal Windows 10 App Cette fonction est désormais disponible en mode Universal Windows 10 App.
// 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
Versions 19 et supérieures
// 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
Nouveauté 19
// 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 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
Versions 19 et supérieures
// 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
Nouveauté 19
// 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 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.
PHP Ce paramètre n'est pas disponible. Cette fonction ne retourne pas de résultat.
<Nom de la procédure> : Chaîne de caractères (avec guillemets)
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".
<Code source> : Chaîne de caractères (avec guillemets)
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).
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.
PHP Code source en PHP de la procédure à compiler dynamiquement. Si ce code contient des guillemets, il est nécessaire de les doubler (voir Exemple).
Versions 19 et supérieures
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsLinuxiPhone/iPadWindows MobileUniversal Windows 10 AppAjaxCode Utilisateur (MCU)

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>)
<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".
<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).
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.
Nouveauté 19
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsLinuxiPhone/iPadWindows MobileUniversal Windows 10 AppAjaxCode Utilisateur (MCU)

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>)
<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".
<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).
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.
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsLinuxiPhone/iPadWindows MobileUniversal Windows 10 AppAjaxCode Utilisateur (MCU)

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>)
<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".
<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).
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.
Versions 19 et supérieures
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsLinuxiPhone/iPadWindows MobileUniversal Windows 10 AppAjaxCode Utilisateur (MCU)

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

<Résultat> = Compile(<Code source>)
<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 (avec guillemets)
Code source en WLangage de la procédure à compiler dynamiquement.
Si ce code contient des guillemets, il est nécessaire de les doubler.
Nouveauté 19
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsLinuxiPhone/iPadWindows MobileUniversal Windows 10 AppAjaxCode Utilisateur (MCU)

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

<Résultat> = Compile(<Code source>)
<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 (avec guillemets)
Code source en WLangage de la procédure à compiler dynamiquement.
Si ce code contient des guillemets, il est nécessaire de les doubler.
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsLinuxiPhone/iPadWindows MobileUniversal Windows 10 AppAjaxCode Utilisateur (MCU)

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

<Résultat> = Compile(<Code source>)
<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 (avec guillemets)
Code source en WLangage de la procédure à compiler dynamiquement.
Si ce code contient des guillemets, il est nécessaire de les doubler.
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.
  • Versions 19 et supérieures
    Si vous utilisez la seconde syntaxe, pour utiliser vos procédures dynamiques, il suffit de lancer la procédure :
    Nouveauté 19
    Si vous utilisez la seconde syntaxe, pour utiliser vos procédures dynamiques, il suffit de lancer la procédure :
    Si vous utilisez la seconde syntaxe, pour utiliser vos procédures dynamiques, il suffit de lancer la procédure :
  • Versions 19 et supérieures
    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.
    Nouveauté 19
    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.
    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 ne peut pas attendre de paramètres. Toute valeur de variable doit être indiquée directement dans le code à compiler.

Code dynamique

Si le code source utilisé pour la compilation dynamique contient des noms de fichiers, de rubriques, de champs, de fenêtres, d'états, de requêtes, ... ces noms doivent obligatoirement être entourés par des guillemets.
Par exemple, il faut utiliser : HLitPremier("Client", "Nom") au lieu de HLitPremier(Client, Nom)
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)

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.
WINDEVWEBDEV - Code ServeurWINDEV MobileEtats et RequêtesiPhone/iPadWindows MobileUniversal Windows 10 AppAjaxCode Utilisateur (MCU)

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 traitement 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 <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.
Composantes
WINDEVWEBDEV - Code ServeurEtats et Requêtes wd220vm.dll
Windows Mobile wp220vm.dll
Linux wd220vm.so
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire