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 :

Appel d'une marco dans un macro


Sujet :

Macro

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 114
    Points : 158
    Points
    158
    Par défaut Appel d'une marco dans un macro
    Bonjour à tous,
    J'ai défini une macro qui compte simplement le nombre de valeurs dans une liste. Je voudrais ensuite utiliser ce nombre dans une autre macro. Explications :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /*Cette macro compte simplement le nombre d'éléments dans liste*/
    %macro nb_elements(liste);
    %let i=1;
    %do %while(%length(%scan(&liste,&i))NE 0);
    %let i=%eval(&i+1);
    %end;
    %let nb=%eval(&i-1);
    %mend nb_elements;
    Je voudrais ensuite utiliser cette macro dans dans une autre macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    %macro parangons(table,ident,listevar,classe);
    %let n=%nb_elements(&listevar);
    %put &n;
    proc means data=&table mean std;
    var &listevar;
    class &classe;
    output out=moyennes mean=m1-m&n std=sigma1-sigma&n;
    run; 
    %mend parangons;
    J'ai fait exprès de mettre le %put pour vérifier que le nombre d'éléments a été bien récupéré.
    Mais quand j’exécute la macro parangons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    %parangons(matable,
    cle,
    v1 v2 v3 v4 v5 v6 v7 v8,
    cluster);
    Mais j'ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERREUR: m n'a pas un suffixe numérique.
    ERREUR: sigma n'a pas un suffixe numérique.
    Donc il ne me reconnait pas le m. Pourtant dans la première macro je récupère bien le nombre. Je n'arrive pas à comprendre pourquoi.

    Merci de votre aide.

  2. #2
    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 : 46
    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
    Citation Envoyé par ibrahima13 Voir le message
    J'ai fait exprès de mettre le %put pour vérifier que le nombre d'éléments a été bien récupéré.
    Et a priori ton %PUT n'affiche rien. Car le macro-programme %NB_ELEMENTS compte bien, crée bien en interne une macro-variable &NB qui lui est locale, et quand il a fini de s'exécuter, cette valeur est perdue.
    2 solutions sont possibles :
    1) soit déclarer &NB comme globale (elle existera même quand %NB_ELEMENTS aura fini de s'exécuter) et l'utiliser ensuite plutôt que &N dans %PARANGONS
    2) soit faire de %NB_ELEMENTS une macro-fonctions : c'est ainsi que tu veux l'utiliser mais pour le moment ce n'est pas ce qu'elle fait car elle ne renvoie aucune information.
    Comme la solution 2 me semble plus dans le fil de ce que tu as déjà écrit, voilà comment je modifierais %NB_ELEMENTS.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %macro nb_elements(liste);
    %let i=1;
    %do %while(%length(%scan(&liste,&i))NE 0);
    %let i=%eval(&i+1);
    %end;
    %eval(&i-1);
    %mend nb_elements;
    Juste avant le %MEND, on "pousse" une valeur plutôt que de la stocker dans un macro-variable.

    Et accessoirement il y a une solution 3 sans utiliser un sous-macro-programme puisque tu peux compter les éléments d'une liste avec la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %EVAL(1+%SYSFUNC(COUNTC(&listeVar,%STR( ))))
    Bon courage.
    Olivier
    Bon courage.
    Olivier

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 114
    Points : 158
    Points
    158
    Par défaut Récupérer la valeur d'une macro fonction
    Merci Olivier.

    Je ne connaissais pas la troisième solution que tu proposes. elle est beaucop plus simple

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/11/2005, 20h43
  2. Appel d'une fonction dans uns boucle d'un tableau
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/02/2005, 15h37
  3. [PL/SQL] appel d'une procedure dans une procedure
    Par Ilhan_ dans le forum Oracle
    Réponses: 9
    Dernier message: 28/01/2005, 10h30
  4. Réponses: 4
    Dernier message: 26/01/2005, 13h08
  5. [Debutant(e)]Appel d'une servlet dans une page jsp
    Par kouadjalain dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 20/07/2004, 15h02

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