passage de paramètre de champ
Stagiaire WDF
Inscrit:
14/06/2006 11:15
Post(s): 12
Bonjour,

Voici mon problème, j'aimerais passer des champs en paramètres à mes procédures, comme pour les procédure WinDev natives.
C'est à dire que je veux pouvoir la passer avec ou sans guillemets.

Si vous avez déjà résolu ce problème, où si une solution existe dans une version supérieure à WinDev 9, je suis intéressé.

Voici un début de code qui me permet d'avoir le nom du champ dans la variable s_Zone à la fin, il n'est pas encore parfais, car des cas tordus peuvent faire que cela ne marche pas.


PROCEDURE maProcedure(x_nomChamp)

s_Zone est une chaîne

//// si le paramètre n'est pas une chaine, alors c'est forcement un champ de type numérique
SI TypeVar(x_nomChamp)<>wlChaîne ALORS
s_Zone=x_nomChamp..Nom

SINON // si c'est un champ de type chaine, ou bien un chaine qui contient le nom du champ (dont le type reste indéterminé)
SI Taille(x_nomChamp)=0 ALORS
// c'est un champ texte qui ne contient rien
// ça pourrait être aussi une chaine de caractère vide, mais c'est quasi impossible,
// car le paramètre est obligatoire, et cela fesait planter l'utilsation d'une indirection
s_Zone=x_nomChamp..Nom
SINON
//// c'est un champ texte qui contient qq chose
// on suppose que le contenu du champ texte, ne peut pas être un nom de champ qui existe
// sinon si ce champ existe et est vide, cela va faire un faux positif


// si le valeur de x_nomChamp n'est pas un champ qui existe, alors x_nomChamp doit être un champ texte
// ce champ texte qui contient qq chose => il ne faut rien faire sauf s'il s'agit d'une date fausse
SI Occurrence(x_nomChamp)=0 ALORS
s_Zone=x_nomChamp..Nom
SINON
// sinon il s'agit d'une chaine qui contient le nom du champ => il faut tester la valeur du champ
// ou bien cela peut être un champ texte, qui a pour valeur le nom d'un champ (cas tordu et quasi-impossible)
s_Zone=x_nomChamp
FIN
FIN
FIN

Trace(TypeVar(x_nomChamp),s_Zone)

Contribution le : 08/08/2007 10:58
Créer un fichier PDF de la contribution Imprimer


Re: passage de paramètre de champ
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Hum, je vous invite a feuilleter l'aide et notre site sur l'indirection.

si pcNomChamp est le paramètre qui contien le nom du champ à manipuler, il est alors possible d'utiliser l'indirection pour en manipuler les propriétés :

{pcNomChamp,IndChamp}..type : retournera le type de champ manipulé

Contribution le : 08/08/2007 11:48
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: passage de paramètre de champ
Stagiaire WDF
Inscrit:
14/06/2006 11:15
Post(s): 12
Merci pour votre réponse, je pense connaitre assez bien la possibilité d'indirection de WinDev, mais je n'ai pas été assez clair dans ma question.

Je vais donner un exemple de ce que j'aimerais pouvoir faire.

MonChamp est un champ de saisie d'une fenêtre, et dans le code du bouton de validation j'aimerais pouvoir appeler une procédure maProcedure, qui va faire ne vérification sur le champ, de 2 façon différentes soit :

// soit :
maProcedure(MonChamp)
// soit :
maProcedure("MonChamp")


Et toute la difficulté c'est de faire la différence entre un paramètre "champ" et un paramètre "variable chaine"


edit : si on fait
{MonChamp,IndChamp}..type

cela génère une exception. D'ailleurs on peut se baser sur cela pour savoir si le paramètre est une chaine ou un champ, mais je trouve cela pas très propre.

Contribution le : 09/08/2007 08:27
Créer un fichier PDF de la contribution Imprimer


Re: passage de paramètre de champ
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Hum, un simple contrôle avec ChampExiste() pourrait faire la différence, non ?

Contribution le : 09/08/2007 08:58
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: passage de paramètre de champ
Stagiaire WDF
Inscrit:
14/06/2006 11:15
Post(s): 12
oui c'est vrai que :

ChampExiste("MonChamp") => Vrai
ChampExiste(MonChamp) => Faux

Sauf si le champ MonChamp, contient le nom d'un autre champ qui existe. Je sais que c'est très peu probable, mais j'aurais aimé pouvoir gérer ce cas aussi.

Contribution le : 09/08/2007 10:24
Créer un fichier PDF de la contribution Imprimer


Re: passage de paramètre de champ
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Citation :
//ChampExiste("MonChamp") => Vrai
ChampExiste(MonChamp) => Faux


on peut alors faire :

SI PAS ChampExiste("MonChamp") ALORS
   // 
   Si position(Enumerechamp(...),NomChamp) ALORS
      // C'est un Champ
   FIN
SINON
  // c'est un champ
FIN

Contribution le : 09/08/2007 10:58
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: passage de paramètre de champ
Stagiaire WDF
Inscrit:
14/06/2006 11:15
Post(s): 12
Merci R&B pour ton aide

Si j'ai bien compris tu me proposes d'utiliser EnumèreChamp, pour vérifier que le champ existe bien sur la fenêtre en cours. Je n'avais pas pensé faire ce test. Mais je n'ai pas envie de faire une boucle pour chercher tout les champs, et en plus EnumèreChamp ne liste pas les champs dans des onglets et dans le fenêtre en même temps. En creusant cette l'idée, j'ai trouvé que ParentObjet marchait mieux


Mais reste que dans ton exemple ChampExiste, ne résouts pas tout les problèmes
exemple dans la procédure suivante (version simplifiée de mon 1er post) :
// cette procédure retourne le nom du champ sous forme de chaine, qu'il doit rentré avec ou sans guillemets 
PROCEDURE MaProcedure(x_monChamp)

s_nomChamp	est un chaîne


SI PAS ChampExiste(x_monChamp) ALORS
	
	s_nomChamp=x_monChamp..Nom
SINON
	// c'est un champ
	s_nomChamp=x_monChamp
FIN

RENVOYER s_nomChamp



tests de MaProcedure :
// Si MonChamp contient une chaine vide ca va donner 
MaProcedure("MonChamp") // ==> "MonChamp"
MaProcedure(MonChamp) // ==> "MonChamp"

// Mais si MonChamp contient "MonAutreChamp", qui est le nom d'un champ valide alors
MaProcedure("MonChamp") // ==> "MonChamp"
MaProcedure(MonChamp) // ==> "MonAutreChamp"



Voici une version ce que j'ai trouvé pour que cela marche dans tout les cas :
PROCEDURE MaProcedure2(x_monChamp)

s_nomChamp	est un chaîne


QUAND EXCEPTION DANS
	s_nomChamp=x_monChamp..Nom
FAIRE
	s_nomChamp=x_monChamp
FIN

RENVOYER s_nomChamp


J'aurais aimé évité d'utiliser les exceptions, mais je n'ai pas trouvé mieux.

Encore merci R&B, pour le temps passé à me répondre.

Contribution le : 09/08/2007 15:15
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2