2009-03-05 6 views
3

Gibt es eine kurze Möglichkeit, alle Makrovariablen, die innerhalb eines Makros erstellt werden, global zu erweitern?SAS Macro GLOBAL scope

dh:

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

Wollen Sie das wirklich tun? Sie können bereits vorhandene globale Makrovariablen mit Ihren lokalen Variablen überlisten. Und Sie fragen nach einer Möglichkeit, dies implizit zu tun! Es wird empfohlen,% LOCAL (nie% GLOBAL) für alle Variablen zu deklarieren, die Sie in einem Makro verwenden. –

+3

Ich stimme Chang Chung absolut zu. Sie können leicht Probleme für sich selbst oder andere verursachen, wenn Sie dies zum Standard machen. Wenn Sie es unbedingt tun müssen, versuchen Sie sicherzustellen, dass sie mit einem Präfix benannt sind, so dass sie nicht versehentlich überschrieben werden. –

Antwort

5

Die einzige Art, wie ich dies zu tun, ohne denken kann jedes Makro als globale vor der Zeit zu erklären, und dann ein% vermietet Anweisung tun ist ein Makro zu verwenden anstelle von die Anweisung% let.

Im folgenden Code erstelle ich ein Makro mit dem Namen % mylet, dessen einzige Aufgabe es ist, eine globale Variable mit dem Namen und dem Wert zu erstellen, den ich als Argumente übergebe. Ich benutze dann dieses Makro anstelle von% let überall wo ich globale Variablen definieren möchte.

z.

%global myvar; 
%let myvar=2; 

würde ...

%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

Anstatt die Dictionary-Tabellen abzufragen, können Sie einfach folgendes tun: % put _global_; oder% put _local_; um die Liste der globalen und lokalen Makrovariablen (und ihrer Werte) zu sehen. Sie können auch% put _user_; um nur die benutzerdefinierten Makrovariablen (und die Werte) anzuzeigen. –

+1

Sehr wahr in der Tat. Ich entschied mich in diesem Fall dafür, die Wörterbuch-Tabelle zu verwenden, da ich festgestellt habe, dass die Leute mit diesen Tabellen weniger vertraut sind und ich hoffte, dass es anderen neue Dinge zum Erkunden geben könnte. Auch ließ es mich leicht die drei Variablen in der Ausgabe isolieren, egal welche anderen Variablen definiert wurden. – cmjohns

4

Wenn Sie die Makrovariablen innerhalb offenen Code der Makrovariablen erstellen automatisch auf die globale Makro Symboltabelle hinzugefügt:

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

Diese vor würden Sie Erstellen Sie das größere Makro:

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

Eine weitere Alternative wäre es, die Variablen erstellen einen Datum Schritt mit:

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

Die Verwendung von 'sympputx()' 'mit dem Parameter' 'g'' wäre ein besserer Ansatz. –

3

Wenn Sie Makrovariablen innerhalb eines Daten-Schritt erstellen und die Daten-Schritt ist in einem Makro, das erstellte Makrovariablen sind standardmäßig lokal im Bereich dieses Makros.

Verwenden

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

globalen Makrovariablen zu erstellen.

+0

Ist das wirklich wahr? Können Sie Code zum Nachweis bereitstellen? –