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

Macro Discussion :

Problème avec macro variables


Sujet :

Macro

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Problème avec macro variables
    Bonjour,

    J'ai un problème pour récupérer la valeur d'une macro-variable appelée à l'aide d'une autre macro-variable et de la fonction %eval.

    L'exemple dans la LOG vaut mieux qu'un long discours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    787  %put &coupure_4_a.;
    970071
    788  %put %eval(&nb_coupures_matrice. + 1);
    4
    789  %put &coupure_%eval(&nb_coupures_matrice. + 1)_a.;
    AVERTISSEMENT: Référence symbolique apparente COUPURE_ non traitée.
    &coupure_4_a.
    Le but est de récupérer le contenu de la macro variable dénommée "coupure_4_a". Je ne peux pas l'appeler directement et je souhaiterais l'appeler avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &coupure_%eval(&nb_coupures_matrice. + 1)_a.
    mais ça ne fonctionne pas.

    Pour preuve que l'étape intermédiaire fonctionne,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %eval(&nb_coupures_matrice. + 1) renvoie bien 4 !
    Je ne trouve pas d'explication. En auriez-vous une ?

    Par avance merci beaucoup de votre aide.

  2. #2
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Bonjour,
    Je pense que l'exemple ci dessous va t'aider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %LET test=10;
    %LET nb=10;
    %LET test10=100;
    %PUT &&test&nb;
    Il faut utiliser les double &!

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par fafabzh6 Voir le message
    Bonjour,
    Je pense que l'exemple ci dessous va t'aider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %LET test=10;
    %LET nb=10;
    %LET test10=100;
    %PUT &&test&nb;
    Il faut utiliser les double &!
    Malheureusement ça ne fonctionne pas non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    901  %put &&coupure_%eval(&nb_coupures_matrice. + 1)_a.;
    AVERTISSEMENT: Référence symbolique apparente COUPURE_ non traitée.
    &coupure_4_a.
    ou alors je ne les ai pas mis au bon endroit les &&.


    Pour info je viens de m'en sortir en attribuant le calcul à une macro-variable temporaire mais je n'aime pas trop faire ça ! Enfin ça fonctionne mais bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %let temp = %eval(&nb_coupures_matrice. + 1);
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %put &&coupure_&temp._a.;
    En tout cas merci de ton aide. Si tu vois autre chose, je suis preneur.
    Peut-être que ce n'est tout simplement pas faisable directement...

  4. #4
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Bonjour,
    Personnellement je ne pense pas que cela soit possible car tu déclarerais du texte et des macro fonctions en même temps, ce qui explique à mon sens le conflit ... mais je n'ai pas la science infuse!!
    a+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par fafabzh6 Voir le message
    Bonjour,
    Personnellement je ne pense pas que cela soit possible car tu déclarerais du texte et des macro fonctions en même temps, ce qui explique à mon sens le conflit ... mais je n'ai pas la science infuse!!
    a+
    Oui c'est possible que le conflit vienne de là. De toutes façons, je ne vois comment faire autrement. Merci

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Points : 254
    Points
    254
    Par défaut
    Je me souviens (très vaguement !) comment le processeur de macro de SAS traite des cas pareils, il y avait un truc avec des guillemets... Par exemple, si tu exécute le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    %let coupure_4_a = toto;
    %let n = 3;
    %put &&coupure_%eval(&n. + 1)_a.;
    , tu as le même erreur que avant. Par contre le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    %let coupure_4_a = toto;
    %let n = 3;
    %put "&&coupure_%eval(&n. + 1)_a.";
    , affiche le même avertissement, mais sort "toto" dans le log.

    Malheureusement, je ne me souviens plus des détails, il faut creuser dans la doc. Ou appeler le support. Dans les deux cas, si tu trouve la réponse, tu le dis ?

  7. #7
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Le souci vient de l'ordre dans lequel le compilateur macro va évaluer l'expression : comme il lit de gauche à droite, il va du premier & au %, car le % ne pourra pas, se dit-il, faire partie du nom de la macro-variable. Or, ce qu'on veut, c'est que le %EVAL s'effectue d'abord, et ensuite la résolution à partir du &.
    Traditionnellement, ce genre d'effet retard s'obtient avec un double &, mais seulement quand on utilise des macro-variables déjà définies, pas des calculs. Pour le cas présent, il faut retarder l'évaluation en masquant le & (avec la fonction %QUOTE) le temps que le nom de la macro-variable soit construit ; puis lancer l'évaluation de sa valeur en démasquant le & (fonction %UNQUOTE).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %LET test3_a = oui ;
    %LET i = 2 ;
    %PUT %UNQUOTE(%QUOTE(&)test%EVAL(&i+1)_a) ;
    Olivier

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Bonjour.
    Le souci vient de l'ordre dans lequel le compilateur macro va évaluer l'expression : comme il lit de gauche à droite, il va du premier & au %, car le % ne pourra pas, se dit-il, faire partie du nom de la macro-variable. Or, ce qu'on veut, c'est que le %EVAL s'effectue d'abord, et ensuite la résolution à partir du &.
    Traditionnellement, ce genre d'effet retard s'obtient avec un double &, mais seulement quand on utilise des macro-variables déjà définies, pas des calculs. Pour le cas présent, il faut retarder l'évaluation en masquant le & (avec la fonction %QUOTE) le temps que le nom de la macro-variable soit construit ; puis lancer l'évaluation de sa valeur en démasquant le & (fonction %UNQUOTE).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %LET test3_a = oui ;
    %LET i = 2 ;
    %PUT %UNQUOTE(%QUOTE(&)test%EVAL(&i+1)_a) ;
    Olivier
    Quelle information vraiment très intéressante. Merci beaucoup pour tes éclaircissements. C'est très intéressant de comprendre cela.

  9. #9
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    N'oublie pas de cliquer sur si la solution te convient
    a+

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

Discussions similaires

  1. Problème avec les variables en PHP
    Par King_T dans le forum Langage
    Réponses: 3
    Dernier message: 06/05/2006, 23h46
  2. [xmlrad]problème avec la variable session
    Par ekmule dans le forum XMLRAD
    Réponses: 5
    Dernier message: 22/02/2006, 13h22
  3. Problèmes avec les variables et les unités
    Par christoufe dans le forum EDI
    Réponses: 2
    Dernier message: 22/01/2006, 16h22
  4. Problèmes avec les variables final
    Par casolaro dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2004, 14h29
  5. Réponses: 6
    Dernier message: 28/05/2004, 09h39

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