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 07/04/2008, 09h33   #1
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Par défaut [Macro] Retour (return) d'une macro

Bonjour.

J'ai la macro suivante :

Code :
1
2
3
4
5
%macro concat(var1,var2);
%let tmp1 =%sysfunc(compress(&var1,%str(%")));
%let tmp2 =%sysfunc(compress(&var2,%str(%")));
%put "&tmp1,&tmp2";
%mend;
Et celle-ci :
Code :
1
2
3
4
%macro defines_params(var1,var2);
%IF %length(&var2) = 0 %then [...];
%else return_value = %concat(&var1,&var2) ;
%mend;
Je voudrais assigner à la variable "return-value" le résultat de la macro %concat. Mais en l'état actuel des choses, rien ne se passe.

Comment est-il possible de préciser à une macro qu'elle doit renvoyer un résultat quand on veut l'utiliser ainsi :
Code :
return_value = %concat(&var1,&var2) ;
J'ai essayé en rajoutant %let devant la variable "return_value" lors de l'assignation, mais rien. Elle reste vide.

Merci d'avance.
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 09h45   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Je ne pense pas que tu peux faire un truc comme ça sur SAS.
Je te conseille de déclarer une macro variable global
Je n'ai pas testé si cela marche pas d'exemple d'appl
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
%macro concat(var1,var2);
%let tmp1 =%sysfunc(compress(&var1,%str(%")));
%let tmp2 =%sysfunc(compress(&var2,%str(%")));
%put "&tmp1,&tmp2";
%let return_value="&tmp1,&tmp2";
%mend;
 
%macro defines_params(var1,var2);
%global return_value;
 
%IF %length(&var2) = 0 %then [...];
%else %put return_value ;  ;
%mend;
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 09h45   #3
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Bonjour,
As-tu ensuite exécuté ta macro?
Le code suivant marche très bien chez moi et m'affiche "Hello,World"
Code :
1
2
3
4
5
6
7
8
9
10
%macro concat(var1,var2);
%let tmp1 =%sysfunc(compress(&var1,%str(%")));
%let tmp2 =%sysfunc(compress(&var2,%str(%")));
%put "&tmp1,&tmp2";
%mend;
%macro defines_params(var1,var2);
%IF %length(&var2) = 0 %then [...];
%else %let return_value = %concat(&var1,&var2) ;
%mend;
%defines_params(hello,world);
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 09h50   #4
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
La macro &return_value est vide !!!!
L'affichage que tu vois c'est le résultat du %put "&tmp1,&tmp2";
Code :
1
2
3
4
5
6
7
8
9
10
11
12
%macro concat(var1,var2);
%let tmp1 =%sysfunc(compress(&var1,%str(%")));
%let tmp2 =%sysfunc(compress(&var2,%str(%")));
%put "&tmp1,&tmp2";
%mend;
%macro defines_params(var1,var2);
%IF %length(&var2) = 0 %then %put a ;
%else %do ;%let return_value = %concat(&var1,&var2); 
	%put return_value &return_value;  
	%end;
%mend;
%defines_params(hello,world);
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 09h52   #5
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Citation:
Envoyé par fafabzh6 Voir le message
Bonjour,
As-tu ensuite exécuté ta macro?
Oui oui, j'ai bien exécuté. La macro affiche bien le résultat, mais celui-ci n'est pas assigné à la variable return_value.

Si on fait ensuite :
Dans le log, la valeur est nulle. C'est une ligne vide.

Je vais voir ce que donne la manip de Bahraoui. Par contre je suis surpris car j'ai déjà vu ce style d'assignation. Notamment avec les macros systèmes du type %eval.

Il est possible d'assigner le résultat d'une macro à une variable, sans passer par une variable globale, l'exemple suivant le montre :

Code :
1
2
%let maVar = %eval(50+25);
%put &maVar;
Affiche dans le log :
75


EDIT : au fait, le code source de cette macro %eval est-il disponible quelque part ? Ca permettrait de savoir comment gérer l'assignation du résultat d'une macro...
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 10h00   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
%eval c'est une macro SAS!!
Pour le passage de paramètre entre macro j'utilise toujours les macros variables ou des tables SAS.

Cordialement.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 10h04   #7
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Je sais bien que c'est une macro SAS. Mais si il est possible de l'utiliser ainsi, il doit bien y avoir un moyen d'attribuer le résultat à une autre macro-variable de la même façon.

Idem pour le transfert de paramètres. Mais en l'occurrence, si je met return_value en paramètre de la macro, il n'est alors plus possible de modifier cette macro variable dans la macro elle-même.
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 10h09   #8
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Tu peux modifier la valeur de ta macro variable n'importe quand.

Code :
1
2
3
4
5
6
7
8
9
%macro a(b);
%put &b;
%let b=5;
%put &b;
%mend;
%let b=3;
%a(&b);
%let b=7;
%put &b;
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 10h53   #9
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Citation:
Envoyé par bahraoui Voir le message
Je te conseille de déclarer une macro variable global
Je n'ai pas testé si cela marche pas d'exemple d'appl
A priori ça fonctionne bien. Reste à voir si cela pose d'autres soucis.

Citation:
Envoyé par bahraoui Voir le message
Tu peux modifier la valeur de ta macro variable n'importe quand.
Dans le code que tu as affiché, en effet. Mais l'autre jour, je suis tombé sur un exemple où ce n'était pas possible. J'étais donc passé par autre chose, il devait y avoir quelque chose de particulier...

Edit : ça y est !

En fait, pour renvoyer le résultat de la macro il suffit de préciser ce que l'on veut renvoyer sans aucune commande SAS. Par exemple dans le code que j'avais :

Code :
1
2
3
4
5
6
%macro concat(var1,var2);
%let tmp1 =%sysfunc(compress(&var1,%str(%")));
%let tmp2 =%sysfunc(compress(&var2,%str(%")));
%put "&tmp1,&tmp2";
"&tmp1,&tmp2";
%mend;
Et le tour est joué !
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/04/2008, 11h02   #10
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Cool, je ne connaissais pas ce moyen pour récupérer le réusltat d'une macro.

Cordialement.
bahraoui 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 19h14.


 
 
 
 
Partenaires

Hébergement Web