DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Syntaxe WLangage / Opérateurs
  • Quand utiliser l'indirection?
  • Désigner l'objet en cours
  • Indirection sur une structure
  • Utiliser l'indirection sur les chemins dans un document XML
  • Limitations
  • Indirections en Java
WINDEV
WindowsLinuxJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac Catalyst
Autres
Procédures stockées
Les opérateurs { et } permettent d'accéder à un champ, une variable, un membre d'une classe ou une rubrique d'une table en construisant dynamiquement le nom du champ, de la variable, du membre de la classe ou de la rubrique.
L'intérêt des opérateurs { et } est multiple:
  • Passer en paramètre un nom de champ, de variable, de membre d'une classe ou de rubrique.
  • Construire le nom d'un champ, de la variable, d'un membre d'une classe ou d'une rubrique par programme.
WEBDEV - Code Serveur Pour effectuer une indirection sur un champ d'une page, l'option "Support des indirections (ralentit l'exécution)" doit être cochée (onglet "Détail" de la fenêtre de description du champ).
AndroidWidget AndroidJava Les indirections ne sont pas gérées sur les variables locales. Les indirections sont gérées uniquement sur les variables globales. Une indirection sur une variable locale d'un traitement provoquera l'erreur "élément inconnu".
Exemple
// Indirection simple 
{"NOM"} = NomCli		// Est équivalent à NOM=NomCli 
{"NOM"} = {"CL.NOMCLI"}	// Est équivalent à NOM=CL.NOMCLI 
{"FENCLI.NOM"} = NomCli	// Est équivalent à FENCLI.NOM=NomCli 
{"FENCLI"+".NOM"} = NomCli	// Est équivalent à FENCLI.NOM=NomCli 

// Indirection typée
{"Nom",indChamp} = NomCli

// Indirection avec un nom de table dans une variable
nNomFic est une chaîne = "Client"
{nNomFic + ".Nom"} = "Durand"
HAjoute({nNomFic})
// Indirection dans une procédure 
NomChamp est une chaîne
NomChamp = "SAI_SAISIE1"			// SAI_SAISIE1 est le nom du champ 
// Appel d'une procédure rendant un champ invisible 
Rend_Invisible(NomChamp)

PROCÉDURE Rend_Invisible(NChamp)
{NChamp}..Etat = Invisible
// Indirection avec variable 
NomAlias est une chaîne
NomAlias = FenPrécédente()
// NOM est le nom du champ 
// NomCli est la valeur à affecter 
{NomAlias+".NOM"} = NomCli 
Abrev est une chaîne
NomRub est une chaîne
{Abrev+"."+NomRub} = NomCli 
{Abrev+"."+NomRub} = {NomChamp}
// Déclaration d'une classe avec deux membres 
Maclasse est une Classe
Membre1 est une chaîne
Membre2 est une chaîne
// Affichage de la valeur d'un membre 
PROCÉDURE GLOBALE AfficheMembre(Numéro)
// Récupération de la valeur du membre global choisi
Valeur est une chaîne = {"::Membre"+Numéro}
Info(Valeur)
c est un cWord
var est une Description de Variable
Def est un Définition

Def = RécupèreDéfinition(c)
// Récupère la 2ème variable de la classe: version de Word
var = Def..Variable[2]

Trace(var..Nom) // Affiche le nom de la variable
Trace("Version de Word: ",{c, var}) // Affiche la version de Word
Syntaxe

Indirection simple Masquer les détails

{ <Expression> }
<Expression> : Chaîne de caractères
Expression permettant d'identifier le champ, la variable ou la rubrique à manipuler. L'élément est tout d'abord recherché:
  • parmi les variables,
  • selon le nombre de points dans le nom:
    • 0 point: recherche parmi les champs, puis les rubriques HFSQL.
    • 1 point: recherche parmi les rubriques HFSQL, les champs, puis les paramètres de requête.
    • supérieur à 1 point: recherche parmi les champs.
  • parmi les éléments spéciaux conservés par compatibilité (par exemple _Ongletx, ...).
Si cette expression correspond à une chaîne vide (""), une erreur du WLangage est générée.

Indirection sur un membre de classe Masquer les détails

{ <Expression> }
<Expression> : Chaîne de caractères
Expression permettant d'identifier le membre de la classe.
Si le membre est:
  • global, utilisez la syntaxe suivante: {" :: NomDuMembre"}
  • n'est pas global, utilisez la syntaxe suivante: {" : NomDuMembre"}
Si cette expression correspond à une chaîne vide (""), une erreur du WLangage est générée.

Indirection sur un membre de classe Masquer les détails

{ <Classe> , <Membre> }
<Classe> : Chaîne de caractères
Instance de la classe
<Membre> : Chaîne de caractères ou variable de type Description de variable
Correspond:

Indirection en spécifiant le type de l'élément (optimise la vitesse d'exécution) Masquer les détails

{ <Expression>, <Type> }
<Expression> : Chaîne de caractères
Expression permettant d'identifier le champ, la variable ou la rubrique à manipuler. Si cette expression correspond à une chaîne vide (""), une erreur du WLangage est générée.
<Type> : Constante
Constante permettant de préciser le type de l'élément recherché:
indChampÉlément recherché parmi les champs et les groupes.
indConnexionÉlément recherché parmi les connexions.
indEtatÉlément recherché parmi les états.
PHP Cette constante n'est pas disponible en PHP.
indFenêtreÉlément recherché parmi les fenêtres.
PHP Cette constante n'est pas disponible en PHP.
indFichierÉlément recherché parmi les tables.
indGPWÉlément recherché parmi les éléments du groupware utilisateur (permet de récupérer l'état initial des champs).
PHP Cette constante n'est pas disponible en PHP.
indLiaisonÉlément recherché parmi les liaisons.
PHP Cette constante n'est pas disponible en PHP.
indParamètreRequête Élément recherché parmi les paramètres des requêtes.
indRubriqueÉlément recherché parmi les rubriques.
indVariableÉlément recherché parmi les variables.
AndroidWidget AndroidJavaPHP L'élément est recherché uniquement parmi les variables globales.
indPageÉlément recherché parmi les pages.
PHP Seule la page courante est accessible.
Remarques

Quand utiliser l'indirection?

L'indirection peut être utilisée par exemple:
  • Pour accéder à la valeur d'un élément (champ, variable, rubrique, ...):
    {s_NomChamp} = 10
    ValeurChamp = {s_NomChamp}
  • Pour utiliser une propriété:
    {s_NomChamp}..Hauteur = 10
  • Pour manipuler une colonne d'un champ Table par programmation:
    {s_NomColonne, indChamp}[Numéro_Ligne] = 10
  • Pour manipuler une colonne d'une table:
    {s_NomTable + "." +s_NomColonne, indChamp}[Numéro_Ligne] = 10
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsAndroidWidget AndroidiPhone/iPadJavaCode Utilisateur (MCU)

Désigner l'objet en cours

Pour désigner l'objet en cours, utilisez les mots-clés suivants:
  • MoiMême: le champ en cours
  • MaFenêtre: la fenêtre en cours
  • MaPage: la page en cours
    AndroidWidget AndroidiPhone/iPadJava Ce mot-clé n'est pas disponible.
  • MonEtat: l'état en cours
    AndroidWidget AndroidJava Ce mot-clé n'est pas disponible.
  • MaSource: la source de données courante.
  • MonFichier: la table qui a déclenché le trigger en cours.
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsiPhone/iPadJavaCode Utilisateur (MCU)

Indirection sur une structure

Une indirection ne peut pas contenir un accès à une structure ou à une instance de classe. Cependant, il est possible d'utiliser la syntaxe suivante:
{<Variable structure>}: membre
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsiPhone/iPadJavaCode Utilisateur (MCU)

Utiliser l'indirection sur les chemins dans un document XML

Il est possible d'utiliser les opérateurs d'indirection pour construire le chemin d'un élément dans un document XML.
Exemple :
sDocXML est une chaîne = [
	<?xml version="1.0" encoding="UTF-8"?>
	<Document>
	<InfoVersion>
	<Version>21</Version>
	<Millesime>2016</Millesime>
	</InfoVersion>
	</Document>
]

xmlExemple est un xmlDocument = XMLOuvre(sDocXML, depuisChaîne)

sParam est une chaîne = "WinDev_Param"

// Lecture directe d'une information ...
Trace(xmlExemple.Document.InfoVersion.Version) 

// Lecture avec une partie du chemin XML contenu dans une variable
// (idem si rubrique d'un fichier, paramètre d'une fenêtre, méthode, ...)
sParamètre est une chaîne = "InfoVersion"
Trace ({"xmlExemple.Document." + sParamètre + ".Version"})
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsiPhone/iPadJavaCode Utilisateur (MCU)

Limitations

L'opérateur d'indirection permet de retrouver un élément par son nom.
Les opérations suivantes ne sont donc pas autorisées dans une indirection:
  • accès à un membre d'une instance de classe ou de structure autre que l'instance de classe courante (opérateurs: et:: ).
  • accès à un sous-élément de champ ou de tableau (opérateur [] ).
  • accès à une sous-partie de chaîne (opérateur [[]] ).
  • accès à une propriété (opérateur ..).
  • indirection (opérateur { } ).
  • appel de procédure ou de méthode d'objet Automation.
  • déclaration de variable.
Remarques:
  • Les opérateurs d'accès sur un élément (opérateurs: et [] et [[]] et .. ) peuvent être utilisés sur l'élément obtenu par indirection. Quelques exemples:
    { <indirection> }: membre

    { <indirection> } [ indice ]

    { <indirection> } [[ indice ]]

    { <indirection> }..propriété
  • Pour appeler une procédure connue par son nom, utilisez les fonctions Exécute ou ExécuteTraitement.
  • Pour combiner ces opérations de manière dynamique, il est possible d'utiliser la compilation dynamique (voir la fonction Compile).
Java

Indirections en Java

Les indirections ne sont pas gérées sur les variables locales.
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
Example
In Button
ExibeData(MyPage..Name +"."+FSTC_fecha..Name)


In procedure global
PROCEDURE ExibeData(myfecha)

mesEspanhol is string

dHoje is Date = Today()

SWITCH dHoje..Month
CASE 1
mesEspanhol = "enero"
CASE 2
mesEspanhol = "febrero"
CASE 3
mesEspanhol = "marzo"
CASE 4
mesEspanhol = "abril"
CASE 5
mesEspanhol = "mayo"
CASE 6
mesEspanhol = "junio"
CASE 7
mesEspanhol = "julio"
CASE 8
mesEspanhol = "agosto"
CASE 9
mesEspanhol = "setiembre"
CASE 10
mesEspanhol = "octubre"
CASE 11
mesEspanhol = "noviembre"
CASE 12
mesEspanhol = "diciembre"
OTHER CASE
mesEspanhol = ""
END

{myfecha} = dHoje..Day +" de "+ mesEspanhol +" de "+ dHoje..Year
Boller
11 sep. 2024
Example Use
//exemplo de indirection
gJanela01 is string = gJanela + "."+gLooper+"["+gLinha+"]."+gAttFoto
{gJanela01,indControl} = gsCheminDernièreCapture

HReset(pomv_parte_objeto_mov_local)
Busca is Buffer = HBuildKeyValue(pomv_parte_objeto_mov_local,chavecomposta, gEquipamento,gRegid_cab,gRegid_Item)
IF HReadSeek(pomv_parte_objeto_mov_local,chavecomposta,Busca,hIdentical) = True
IF HFound(pomv_parte_objeto_mov_local) = True
pomv_parte_objeto_mov_local.e001_id = gEquipamento
pomv_parte_objeto_mov_local.pocb_id = gRegid_cab
pomv_parte_objeto_mov_local.poit_id = gRegid_Item
pomv_parte_objeto_mov_local.pomv_data_emi = DateSys()+TimeSys()
pomv_parte_objeto_mov_local.pomv_foto = dLoadImage(gsCheminDernièreCapture,imgDefault)
IF HModify(pomv_parte_objeto_mov_local) = True THEN
gJanela01 = gJanela + "."+gLooper
LooperDisplay({gJanela01,indControl},taInit)
END
END
END
Boller
15 avr. 2021

Dernière modification : 08/12/2024

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