PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → DataBinDing et inverse de ..LiaisonFichier ???
DataBinDing et inverse de ..LiaisonFichier ???
Iniciado por LM Concept, 06,jun. 2019 15:58 - 6 respuestas
Miembro registrado
405 mensajes
Publicado el 06,junio 2019 - 15:58
Bonjour a tous.
Si on lie une structure à des champs., il possible de connaitre la variable liée au champ avec la propriété ..LiaisonFichier
Exemple
Info(SAI_NOM..LiaisonFichier) // Retourne stAdresse:sNom

Mais y a t il une propriété qui donne les contraire ?
Info(stAdresse:sNom..??????) // Retourne SAI_NOM


Merci de votre aide
BON DEV
Miembro registrado
953 mensajes
Publicado el 06,junio 2019 - 16:20
bonjour LM Concept,

il faut je pense faire un parcours des champs de votre fenêtre avec la fonction EnumèreSousElement() pour ensuite tenter d'accéder à leur propriété ..LiaisonFichier et la comparer à ce que vous souhaitez.

=> https://doc.pcsoft.fr/fr-FR/?3064002&name=EnumereSousElement

un peu comme ceci :
//Saisie1 ,Saisie2 et Saisie3 sont en liaison avec la variable mon_str_test.label
Info(Saisie1..LiaisonFichier)
// Donne :
// :mon_str_test.label

sParent est une chaîne = MaFenêtre..Nom

PROCEDURE INTERNE proc_int_enum_sous_elem(vp_Parent)
sNomChamp est une chaîne = EnumèreSousElément(vp_Parent, enumPremier)
TANTQUE sNomChamp <> ""

// Nom complet du champ
sNomComplet est une chaîne = vp_Parent + "." + sNomChamp
// Récupération du type de l'élément

QUAND EXCEPTIONEXCEPTION DANS
nType est un entier = {sNomComplet, indGPW}..Type

// Si c'est un groupe de champs ou un onglet
SELON nType
CAS typOnglet,typTable,typBarreOutils,typBoîteAOutils,typSuperChamp
// Enumération des champs qui sont à l'intérieur
proc_int_enum_sous_elem(sNomComplet)
CAS typOptionMenu
// Ne fait rien si c'est une option de menu

AUTRE CAS
// Ajout de l'élément dans la trace
SI {sNomComplet,indGPW}..LiaisonFichier=":mon_str_test.label" ALORS
Trace("Found : "+sNomComplet+" ("+{sNomComplet,indGPW}..LiaisonFichier+")")
FIN

FIN
FAIRE

FIN

// Champ suivant
sNomChamp = EnumèreSousElément(vp_Parent)
FIN

FIN

proc_int_enum_sous_elem(sParent)


bon dèv
Mensaje modificado, 06,junio 2019 - 16:20
Miembro registrado
405 mensajes
Publicado el 06,junio 2019 - 17:21
Bonjour,
Merci pour l'info.
Mais bon je vais faire cette méthode. C'est une fenêtre des 350 champs lié à un xmlDocument, et donc le parcours prend un peu de temps.
Je pensais qu'il y aurait plus simple ! Une propriété qui m’était inconnue.

Merci et BON DEV
Miembro registrado
2.682 mensajes
Publicado el 07,junio 2019 - 08:50
Bonjour,

EN prenant la méthode de Christophe, tu peux tout simplement énumérer tous les champs et pour tous ceux qui ont une liaison les stocker dans un tableau associatif.

Du coup lorsque tu as besoin de savoir à quel champ appartient la liaison, il te suffit de regarder dans le tableau associatif, ce qui est très rapide.

Je verrai quelque chose comme ça:
// Init de la fenêtre
gtaLiaisons est un tableau associatif de chaînes
proc_int_enum_sous_elem(MoiMême) // c'est la fenêtre à l'init

PROCEDURE INTERNE proc_int_enum_sous_elem(vp_Parent)
sNomChamp est une chaîne = EnumèreSousElément(vp_Parent, enumPremier)
TANTQUE sNomChamp <> ""

// Nom complet du champ
sNomComplet est une chaîne = vp_Parent + "." + sNomChamp
// Récupération du type de l'élément

QUAND EXCEPTIONEXCEPTION DANS
nType est un entier = {sNomComplet, indGPW}..Type

// Si c'est un groupe de champs ou un onglet
SELON nType
CAS typOnglet,typTable,typBarreOutils,typBoîteAOutils,typSuperChamp
// Enumération des champs qui sont à l'intérieur
proc_int_enum_sous_elem(sNomComplet)
CAS typOptionMenu
// Ne fait rien si c'est une option de menu

AUTRE CAS
// Ajout de l'élément dans la trace
SI {sNomComplet,indGPW}..LiaisonFichier=":mon_str_test.label" ALORS
gtaLiaisons[{sNomComplet,indGPW}..LiaisonFichier] = sNomComplet
FIN

FIN
FAIRE

FIN

// Champ suivant
sNomChamp = EnumèreSousElément(vp_Parent)
FIN

FIN


Au moment où tu recherches le champ lié :
SI gtaLiaisons[":mon_str_test.label"]..Existe ALORS
{gtaLiaisons[":mon_str_test.label"],indChamp} = "toto"
FIN


--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
405 mensajes
Publicado el 07,junio 2019 - 09:03
Oui c'est exactement ce que j'ai fait.
Car je suis obligé de lire tous les champs avec leur lien pour pouvoir faire un "SourceVersEcran" autre problème que j’avais soumis ici.
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/230368-databindding-sur-xmldocument/read.awp…

Du coup en lisant tous les membres, j'ai rajouté une sauvegarde ce ceux-ci dans un tableau de structure. Et quand j'en ai besoin, j'ai juste à chercher dans le tableau.
Merci à vous.
BON DEV
Miembro registrado
2.682 mensajes
Publicado el 07,junio 2019 - 12:31
Bonjour,

J'avais pas vu ce post, j'utilise du Databinding sur des source xml et je n'ai pas ce problème. Par contre tu devrais essayer cette syntaxe. Chez moi pas de problème.

SourceVersEcran(FEN_TEST,"gDocXML")


--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
405 mensajes
Publicado el 07,junio 2019 - 14:19
j'avais essayé avec et sans guillemet et cela ne fonctionnait pas !
Sans guillemet j'ai : Un élément de type 'xmlDocument' ne peut pas être converti vers type 'chaine unicode'
Avec guillemet j'ai : Erreur de liaison sur le champ source de SAI_XXX (qui est le premier champ de le fenêtre...)

En tout cas ces deux soucis m'ont obligé à faire un tableau de structure qui désormais m'est bien utile ! ;)

Merci.
BON DEV.