2009-03-05 12 views
3

Existe-t-il un court chemin pour faire TOUTES les variables de macro créées dans une macro globale?Étendue Macro GLOBAL SAS

-à-dire:

%macro x; 
%global _all_; * ??? ; 
%let x=1; 
%let y=1; 
%let z=1; 
%mend; 
+3

Voulez-vous vraiment faire cela? Vous pouvez réduire les variables macro globales déjà existantes avec vos variables locales. Et vous demandez un moyen de le faire implicitement! Il est recommandé de déclarer% LOCAL (jamais% GLOBAL) toutes les variables que vous utilisez dans une macro. –

+3

Je suis absolument d'accord avec Chang Chung. Vous pouvez facilement causer des problèmes pour vous-même ou pour les autres si vous en faites une pratique standard. Si vous devez absolument le faire, essayez de vous assurer qu'ils sont nommés en utilisant un préfixe afin qu'ils ne soient pas écrasés par accident. –

Répondre

5

La seule façon que je peux penser à le faire sans avoir à déclarer chaque macro comme avance globale de temps, puis effectuez une déclaration% let est pour utiliser une macro à la place de l'instruction% let.

Dans le code ci-dessous, je crée une macro appelée % mylet qui a pour seul but la création d'une variable globale avec le nom et la valeur que je passe en arguments. J'utilise ensuite cette macro à la place de% let partout où je veux que les variables globales soient définies.

par ex.

%global myvar; 
%let myvar=2; 

deviendrait ...

%mylet(myvar,2);

/* Define a macro to declare variables as global */ 
%macro mylet(var,value); 
    %global &var; 
    %let &var.= &value ; 
%mend; 

/* Test macro */ 
%macro test; 
%mylet(myvar,2); 
%mylet(myvar2,12); 
%mylet(myvar3,'string'); 

/* see that they are global inside the macro */ 
title "Macro scope inside test macro"; 
proc sql; 
    select * 
     from dictionary.macros 
     where name in('MYVAR','MYVAR2','MYVAR3'); 
quit; 

%mend; 
%test; 

/* Check to see if they are still global outside the macro */ 
title "Macro scope outside test macro"; 
proc sql; 
    select * 
     from dictionary.macros 
     where name in('MYVAR','MYVAR2','MYVAR3'); 
quit; 
+0

Au lieu d'interroger les tables du dictionnaire, vous pouvez simplement faire: % put _global_; ou% put _local_; pour voir la liste des macro vars globales et locales (et leurs valeurs). Vous pouvez aussi faire% put _user_; pour voir seulement les variables de macro définies par l'utilisateur (et les valeurs). –

+1

Très vrai en effet. J'ai choisi d'utiliser la table de dictionnaire dans ce cas car j'ai trouvé que les gens sont moins familiers avec ces tables et j'espérais que cela pourrait donner aux autres de nouvelles choses à explorer. En outre, cela m'a permis d'isoler facilement les trois variables dans la sortie, quelles que soient les autres variables définies. – cmjohns

4

Si vous créez la variable macro du code ouvert la variable macro sera automatiquement ajoutée à la table des symboles global macro:

%let x=1; 
%let y=1; 
%let z=1; 

Ce serait avant vous créez la macro la plus grande:

%macro x; 
    <code here> 
%mend x; 

Une autre alternative serait de créer les variables à l'aide d'une étape de données:

data _null_; 
    set LIB.DSET; 
    x = 1; 
    call symput('x',x); 
run; 
+1

L'utilisation de 'call symputx()' avec le paramètre ''g'' serait une meilleure approche. –

3

Si vous créez des variables macro dans une étape de données et que les données étape est à l'intérieur d'une macro, la Les variables de macro créées seront, par défaut, locales dans la portée de cette macro.

Utilisez

call symputx('macvar',macval,'g'); 

pour créer des variables globales macro.

+0

Est-ce vraiment vrai? Pouvez-vous fournir du code pour le prouver? –