PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2025 → Connaître le type d'un élément
Connaître le type d'un élément
Started by Nicolas, Jun., 02 2025 11:55 AM - 5 replies
Posted on June, 02 2025 - 11:55 AM
Hello,

Il n'y pas un moyen de savoir si "INT_sansNom1" est un champ ou une rubrique ou une variable ?
Car le code ci-dessous renvoi VRAI aux 2 conditions :/

SI INT_SansNom1..Type = typInterr ALORS Trace("typInterr")
SI INT_SansNom1..Type = hRubEntier4 ALORS Trace("hRubEntier4")


Cordialement,
Nicolas
Registered member
950 messages
Posted on June, 02 2025 - 3:17 PM
Bonjour,
Il faudrait affiner car les 2 types que vous citez ont la même constante = 5

https://doc.pcsoft.fr/fr-FR/?2510131&name=type_propriete

Cdlt
Posted on June, 02 2025 - 3:48 PM
Bonjour Cédric,

C'est justement le drame.
Impossible de savoir vraiment ce qu'est vraiment INT_SansNom1 car la propriété ..Type peut avoir la même valeur pour des types différents.

C'est dingue que la constante typInterr vaut par exemple la même valeur que hRubEntier4 (soit 5) alors qu'un interrupteur n'a rien à voir avec une rubrique.

J'espère que j'arrive à être assez clair.

Nicolas.
Registered member
20 messages
Posted on June, 02 2025 - 4:51 PM
Bonjour,
La fonction ChampExiste() semble être utile dans ton cas.
NN12
Registered member
5 messages
Posted on June, 02 2025 - 7:01 PM
Salut,

la propriété ..type dans votre cas indique le type contenu dans un élément et non le type de l'élément lui même.
Voir https://doc.pcsoft.fr/?2510131&name=type_propriete

C'est pour ça que plusieurs constantes peuvent avoir la même valeur, vu que vous êtes sensé déjà savoir si ce que vous manipulez est une rubrique (constantes hRubXXX), un champ (constantes typXXX), etc ...

Dans votre cas je ne vois pas de méthode miracle, à part faire une fonction qui discrimine via des ChampExiste, des RécupèreDéfinition et des RécupèreDéfinitionVariable (pas super propre...)
https://doc.pcsoft.fr/fr-FR/?1410090635
https://doc.pcsoft.fr/fr-FR/?1000019333
https://doc.pcsoft.fr/fr-FR/?1000019559

Question subsidiaire :
Dans quel but avez-vous besoin de faire ça ?
Vu que votre exemple n'utilise pas d'indirection, Windev connait le type de INT_SansNom1 à la compilation, et ce type ne peut pas changer.

Cordialement
Registered member
1 message
Posted on June, 03 2025 - 9:23 AM
Bonjour,

Je vous remercie de vos réponses,

C'est dans le but de gérer le NULL "simplement" et sans activer les nullables.
L'impact pour activer les nullables dans le projet est trop important.

Par conséquent, comparer 2 éléments NULL est possible mais pas si simple.
Entre les rubriques où le NULL est géré comme une propriété , le Variant ou les champs qui le gère par valeur, j'en suis arrivé à écrire une procédure globale qui doit comparer 2 éléments quels qu'ils soient (rubrique, champ ou variant)

Problème. La façon de tester le NULL est différents selon rubrique, champ ou variant.
rubrique = ..NULL (propriété)
champ, Variant = NULL (valeur)

J'ai donc écrit pgEstIdentique() qui fonctionne très bien mais l'utilisation de l'Exception pour deviner l'élément est trop couteux en performance.
Et comme il s'agit d'une procédure globale dont l'élément à tester arrive par param d'entrée, ChampExiste() n'est pas possible.
L'idéal était de tester les 2 éléments avec la propriété Type. Malheureusement...

Procedure pgEstIdentique(vpElementA, vpElementB)

// Cette procédure permet de comparer 2 éléments en gérant NULL et 0 comme différents
//
// Paramètres d'entrées : A et B peuvent être des variants, des rubriques ou des champs.
// Leur gestion du NULL étant différente, ils sont adaptés en Variant.

vVariantA, vVariantB est un Variant


// Permet de déterminer si l'élément A est un champ ou une rubrique de fichier
// Nécessaire car la gestion du NULL est différent
QUAND EXCEPTIONEXCEPTION DANS
vpElementA..Null // Pas d'erreur alors il ne s'agit pas d'un champ
vVariantA = vpElementA.Null ? Null SINON vpElementA
FAIRE // A est un champ
vVariantA = vpElementA = Null ? Null SINON vpElementA
FIN

// Permet de déterminer si l'élément B est un champ ou une rubrique de fichier
QUAND EXCEPTIONEXCEPTION DANS
vpElementB..Null // Pas d'erreur alors il ne s'agit pas d'un champ
vVariantB = vpElementB.Null ? Null SINON vpElementB
FAIRE // B est un champ
vVariantB = vpElementB = Null ? Null SINON vpElementB
FIN

// Comparaison entre A et B
SI (PAS vVariantA = Null _ET_ PAS vVariantB = Null _ET_ vVariantA = vVariantB) _OU_ ...
(vVariantA = Null _ET_ vVariantB = Null) ALORS

RENVOYER Vrai // A et B sont identiques

SINON

RENVOYER Faux // A et B sont différents

FIN
Message modified, June, 03 2025 - 9:33 AM