Frage
Gibt es eine kurze Möglichkeit, alle Makrovariablen in einem Makro -globalen Umfang erstellt zu haben?
dh:
%macro x;
%global _all_; * ??? ;
%let x=1;
%let y=1;
%let z=1;
%mend;
Lösung
Ich kann mir nur vorstellen, dass ich dies tun kann, ohne jedes Makro als global im Voraus deklarieren zu müssen, und dann eine % -LET -Aussage besteht darin, ein Makro zu verwenden anstelle von Die %let Erklärung.
Im folgenden Code erstelle ich ein Makro auf dem Namen %mylet Dies hat als einziger Zweck die Aufgabe, eine globale Variable mit dem Namen und dem Wert zu erstellen, den ich als Argumente verabschiedet. Ich verwende dieses Makro anstelle von %let überall, wo ich globale Variablen definieren möchte.
z.B.
%global myvar;
%let myvar=2;
würde werden...
%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;
Andere Tipps
Wenn Sie die Makrovariable in offenem Code erstellen, wird die Makrovariable automatisch zur globalen Makrosymbol -Tabelle hinzugefügt:
%let x=1;
%let y=1;
%let z=1;
Das wäre Vor Sie erstellen das größere Makro:
%macro x;
<code here>
%mend x;
Eine andere Alternative wäre, die Variablen mit einem Datenschritt zu erstellen:
data _null_;
set LIB.DSET;
x = 1;
call symput('x',x);
run;
Wenn Sie Makrovariablen innerhalb eines Datenschritts erstellen und dieser Datenschritt in einem Makro befindet, sind die erstellten Makrovariablen standardmäßig lokal im Bereich dieses Makros.
Verwenden
call symputx('macvar',macval,'g');
So erstellen Sie globale Makrovariablen.