IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

4D Discussion :

Valeur d'un champ à partir de son nom


Sujet :

4D

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Valeur d'un champ à partir de son nom
    Re re bonjour,
    Vous l'aurez remarqué, je cherche encore mes marques dans 4D.
    Ceci dit, j'oserai dire que j'ai une certaine expérience en développement, allant de C++, Objective C, en passant par feu HyperCard, MS Access, et aujourd'hui php et le framework de Zend et mysql, Sql Server, etc.

    Bref, il me manque encore quelque chose, et j'ai peur de réinventer la roue dans 4D. Je dois faire une évolution sur une base 4D développée à l'origine par un non informaticien grand spécialiste du copier/coller à grande échelle, et qui a fait entre autre des tables avec des centaines de colonnes. Un truc de fou. Les colonnes sont numérotées, mais elles n'ont pas toujours été créées dans l'ordre, il y a eu des évolutions et donc la numérotation utilisée dans les noms de colonne ne suit pas la numérotation interne à 4D.

    Je dois parcourir ces colonnes en construisant leur nom et récupérer les valeurs correspondantes à partir de ce nom.

    N'ayant pas trouvé mon bonheur dans les fonctions natives de 4D, j'ai donc écrit une méthode de base qu'on appelle comme ceci :

    $valeur:=Valeur Champ Nommé (->[UneTable];$nomColonne)

    Voici le code de Valeur Champ Nommé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
      /* Méthode : Valeur Champ Nommé
      ` Renvoie la valeur dans l'enregistrement courant d'un champs défini par son nom et le pointeur de la table
      ` 
      ` Paramètres :
      ` - $1 : pointeur vers la table
      ` - $2 : nom du champ (alpha)
      ` - $3 : valeur par défaut si le champ n'existe pas dans la table
      ` Valeur retournée : valeur du champ; son type dépend du type du champ */
     
    C_POINTEUR($1)
    C_ALPHA(31;$2)
     
    $0:=$3  /* valeur par défaut si on ne trouve pas le champ */
     
    $nbreColonnes:=Nombre de champs($1)
    $numeroTable:=Table($1)
     
    Boucle ($noCol;1;$nbreColonnes)
     
    	$nomChamp:=Nom du champ($numeroTable;$noCol)
    	Si ($nomChamp=$2)
    		$pointeurChamp:=Champ($numeroTable;$noCol)
    		$0:=$pointeurChamp->
    		$noCol:=$nbreColonnes+1  /* sortie de boucle - pas de break dans 4D ? beark :( */
    	Fin de si 
     
    Fin de boucle
    C'est testé et approuvé, (par moi-même ), mais y-a-t-il une fonction native à 4D qui fasse cela ?
    (Ou des suggestions pour le faire de façon plus efficace sans parcourir la liste des colonnes ? Je rappelle que j'ai affaire à des tables qui ont plus de 400 champs !)

    Merci encore d'avance pour toute suggestion,
    Marc

    PS : dans l'exemple de code ci-dessus, j'ai mis des commentaires à la C à cause de la balise code du forum qui ne connaît pas vraiment la syntaxe de 4D !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 80
    Points : 84
    Points
    84
    Par défaut
    Salut,

    à vu de nez, tu peux faire plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
      /* Méthode : Valeur Champ Nommé
      ` Renvoie la valeur dans l'enregistrement courant d'un champs défini par son nom et le pointeur de la table
      ` 
      ` Paramètres :
      ` - $1 : pointeur vers la table
      ` - $2 : nom du champ (alpha)
      ` - $3 : valeur par défaut si le champ n'existe pas dans la table
      ` Valeur retournée : valeur du champ; son type dépend du type du champ */
     
    C_POINTEUR($1)
    C_ALPHA(31;$2)
     
    $0:=$3  /* valeur par défaut si on ne trouve pas le champ */
     
    $NumChamp:=Champ($2)**` Récupération du numéro du champ de $2
    $NomDuChamp:=Champ($1;$NumChamp)**
    $pointeurChamp:=Champ($numeroTable;$NomDuChamp->)
    $0:=$pointeurChamp->
    Pas testé, mais à priori, fonctionnel

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par sieste68 Voir le message
    Salut,

    à vu de nez, tu peux faire plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    C_POINTEUR($1)
    C_ALPHA(31;$2)   /* Le NOM du champ !!! */
     
    $0:=$3  /* valeur par défaut si on ne trouve pas le champ */
     
    $NumChamp:=Champ($2)**` Récupération du numéro du champ de $2
    $NomDuChamp:=Champ($1;$NumChamp)**
    $pointeurChamp:=Champ($numeroTable;$NomDuChamp->)
    $0:=$pointeurChamp->
    Pas testé, mais à priori, fonctionnel
    Merci, mais à postériori non (j'ai testé au cazoù) : Champ prend soit un numéro de table et un numéro de champ en paramètre, soit un pointeur vers un champ.

    Or $2 n'est pas un pointeur vers un champ, mais son nom (une chaîne de caractères)

  4. #4
    Membre averti
    Homme Profil pro
    Bientôt retraité
    Inscrit en
    Juillet 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Bientôt retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 312
    Points : 385
    Points
    385
    Par défaut
    Je ne pense pas qu'il existe de commande native pour faire ce truc mais si tu dois faire cela sur tous les champs, c'est dommage de faire une boucle complète pour chaque champ.
    Tu peux faire une seule boucle, en mettant le nom des champs dans un tableau (Var process). Ensuite pour il te suffira de faire un chercher dans tableau pour récuperer sa position et donc le numéro.

    Voilà.

    A +

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par michelS Voir le message
    Je ne pense pas qu'il existe de commande native pour faire ce truc mais si tu dois faire cela sur tous les champs, c'est dommage de faire une boucle complète pour chaque champ.
    Tu peux faire une seule boucle, en mettant le nom des champs dans un tableau (Var process). Ensuite pour il te suffira de faire un chercher dans tableau pour récuperer sa position et donc le numéro.

    Voilà.

    A +
    Bonjour,
    J'ai eu hier la confirmation sur le forum "officiel" de 4D (présentement apparement en rade) qu'il n'existe pas de fonction native pour cela, et que "ma" méthode (j'ai juste indiqué le principe) est celle pratiquée.
    On m'a indiqué aussi la fonction LIRE TITRES CHAMPS (présente dans 4D 2003 mais absente de la documentation 2003) qui renvoie les noms des champs et leur numéro dans deux tables, ce qui permet de faire la recherche sur le numéro du champ de façon plus efficace, avant de lire la table elle même.

    Marc

  6. #6
    Membre averti
    Homme Profil pro
    Bientôt retraité
    Inscrit en
    Juillet 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Bientôt retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 312
    Points : 385
    Points
    385
    Par défaut
    Tient, je l'avais oublié celle là . C'est vrai, il y a cette possibilité.

    A +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Syntaxe valeur d'un champs à partir de son nom
    Par forges dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/12/2011, 20h07
  2. Réponses: 2
    Dernier message: 26/11/2009, 08h42
  3. [EVAL] utiliser la valeur d'une variable à partir de son nom
    Par Julien Dufour dans le forum VBA Access
    Réponses: 0
    Dernier message: 24/04/2008, 13h15
  4. Récuperer la valeur d'une variable à partir de son nom
    Par Etanne dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/10/2007, 18h04
  5. connaitre les propriétés d'un champ à partir de son nom
    Par toome dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 24/10/2005, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo