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 19/07/2011, 11h44   #1
Invité de passage
 
Femme
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Par défaut Utilisation de variables d'une macro dans une autre macro SAS

Bonjour à tous,
je souhaiterais avoir une information par rapport à la programmation en SAS. Voilà je dispose de deux macros programmes a et b. je souhaite utiliser des variables créees dans la macro b (par exemple u et v de la table "table") dans la macro a (pour effectuer des tests)
Est-ce possible ? Je précise aussi que j'utilise la macro b dans la macro a...
Merci pour vos réponses !

Voici une illustration des macro-programmes a et b (je ne sais pas si cela fonctionne, mais c'est juste pour que vous ayez un aperçu de mon problème :

Code :
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
29
30
31
32
%macro a ();
 
...
%b(3.6)
...
 
%mend a;
 
 
%macro b(var1,var2);
DATA TABLE;
input res1 res2 res3;
cards;
1 2 3
4 5 6
;
run;
proc print DATA=TABLE;
run;
 
DATA TABLE;
SET TABLE;
u = res3 * 3 + &var1;
v = &var2 +  (2 * res2);
w = 1/&var1;
y = 1/&var2;
run;
proc print DATA=TABLE;
run;
%mend b;
 
%a()
patril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 11h48   #2
Membre actif
 
Inscription : mars 2003
Messages : 149
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 149
Points : 162
Points : 162
Bonjour,

Il faut les déclarer en global et non en paramètre de la macro b

Code :
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
29
30
31
32
33
34
35
36
%macro a ();
 
...
%global var1;
%global var2;
%let var1=3;
%let var2=6;
%b(&var1, &var2)
...
 
%mend a;
 
 
%macro b;
DATA TABLE;
input res1 res2 res3;
cards;
1 2 3
4 5 6
;
run;
proc print DATA=TABLE;
run;
 
DATA TABLE;
SET TABLE;
u = res3 * 3 + &var1;
v = &var2 + (2 * res2);
w = 1/&var1;
y = 1/&var2;
run;
proc print DATA=TABLE;
run;
%mend b;
 
%a()
Bon courage
la2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 14h28   #3
Invité de passage
 
Femme
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Par défaut réponse

j'ai déclaré les 2 paramètres de la macro b en global, mais je n'arrive toujours pas à récupérer le résultat de u ou de v dans la macro a.. Peut-être ai-je mal compris votre réponse ?

Et d'une manière générale, cmt peut-on récuperer le résultat d'une variable d'une macro b (dans une macro a) s'il ne dépend pas des paramètres de la macro b?
Je vous remercie.
patril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 15h34   #4
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 823
Points : 2 823
Bonjour.
Tu crées des VARIABLES dans le macro-programme %b, d'après ton exemple. Ce ne sont pas des MACRO-VARIABLES. Elles n'ont donc pas à être globales ou locales, elles sont dans leur table et elles y restent. Si tu veux te servir de leurs valeurs, tu relis la table.
Si tu veux les "sortir" de leur table pour en faire des macro-variables, il faut faire un CALL SYMPUTX (ou juste CALL SYMPUT en v8).
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 17h30   #5
Membre actif
 
Inscription : mars 2003
Messages : 149
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 149
Points : 162
Points : 162
OK, je croyais que tu voulais récupérer var1 et var2, qui sont des macros variables.
Si tu veux récupérer u et v qui sont des variables de ta table, suit ce qu'a t'écrit Olivier.
la2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 09h12   #6
Invité de passage
 
Femme
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Par défaut réponse

D'accord très bien merci olivier.decourt ! je vais utiliser un call symput dans la macro b pour créer des macro-variables. Et du coup, si jutilise la macro-variable dans la macro a, elle la connaitra aussi ? Merci !
patril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 09h37   #7
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 823
Points : 2 823
Citation:
si jutilise la macro-variable dans la macro a, elle la connaitra aussi ?
Disons que ce n'est pas automatique. On a débattu de ça la semaine dernière je crois dans un autre post. Le plus sûr, si tu as SAS v9, serait de faire
Code :
CALL SYMPUTX ("nomMV", nomVariableSAS, "G") ;
pour que la macro-variable &nomMV soit globale (le G final) à coup sûr. Et donc visible dans le macro-programme %a.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 10h03   #8
Invité de passage
 
Femme
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Par défaut remerciement

d'accord je vais essayer, merci bien !
patril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2011, 20h56   #9
Invité de passage
 
Femme
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Par défaut Boucle sur une macro

Bonsoir,

j'ai une autre question toujours par rapport aux deux macros a et b : J'aimerais pouvoir appeler la macro b depuis la macro a, dans une boucle comme je l'ai écrit juste après... Cependant cela ne fonctionne pas.
Est-ce possible ? Je vous remercie beaucoup !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%macro a ();
%let i=1; 
 
%do &i=1 %TO 5;
%b()
%let i= %sysevalf(&i+1);
%end;
 
%mend a;
 
 
%macro b()
 
 
%mend b;
 
%a()
patril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 07h34   #10
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 823
Points : 2 823
Bonjour.
Deux soucis dans ta boucle :
1) au niveau du %DO, le nom de la macro-variable ne doit pas être précédé d'un & --> %DO i=1 %TO 5 ;
2) l'incrémentation du compteur de boucle est automatique : tu n'as donc pas besoin de la ligne %LET i= %sysevalf(&i+1) ; car sinon i va être incrémenté 2 fois (il vaudra 1, puis 3, puis 5). Si c'est pourtant ce que tu veux faire (augmenter i de 2 en 2) il est plus propre d'écrire %DO i=1 %TO 5 %BY 2 ; et de virer la ligne de %LET.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 10h03   #11
Invité de passage
 
Femme
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Par défaut r

Merci pour votre réponse ! j'y arrive lorsque j'incrémente avec un entier :

Code :
1
2
3
%do i=1 %TO 5;
%b()
%end;
mais comment faire avec un incrément décimal ? Le code ci-après ne fonctionne pas... Merci encore.

Code :
1
2
3
%do i=0.1 %TO 0.5 %BY 0.1;
%b()
%end;
patril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 12h43   #12
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
Tu ne peux pas : il faut que cela soit des entiers.
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 13h32   #13
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Hello,
sa dépend de ton usage, dans certains cas tu peux contourner ce problème.
Il suffit de consulter le FAQs
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 20h35   #14
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 823
Points : 2 823
A part la solution de la boucle %WHILE donnée dans la FAQ, on peut aussi utiliser une boucle avec des entiers et diviser ensuite à l'intérieur d'un %SYSEVALF.
Code :
1
2
3
4
%DO i=1 %TO 5 ;
  %LET j=%SYSEVALF(&i / 10) ;
  ...
%END ;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 09h50   #15
Invité de passage
 
Femme
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Par défaut remerciement

Merci beaucoup, les deux solutions fonctionnent !
patril 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 04h21.


 
 
 
 
Partenaires

Hébergement Web