Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/11/2011, 23h12   #1
Invité régulier
 
Inscription : juillet 2010
Messages : 28
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 28
Points : 5
Points : 5
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 :
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 :
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 :
1
2
3
4
5
 
%parangons(matable,
cle,
v1 v2 v3 v4 v5 v6 v7 v8,
cluster);
Mais j'ai une erreur :
Code :
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.
ibrahima13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 07h16   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
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 :
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 :
%EVAL(1+%SYSFUNC(COUNTC(&listeVar,%STR( ))))
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 10h23   #3
Invité régulier
 
Inscription : juillet 2010
Messages : 28
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 28
Points : 5
Points : 5
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
ibrahima13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h36.


 
 
 
 
Partenaires

Hébergement Web