Pregunta

¿hay una forma corta de hacer que TODAS las variables de macro creadas dentro de un macro global en su alcance?

es decir:

%macro x;  
 %global _all_;  * ??? ;  
 %let x=1;  
 %let y=1;  
 %let z=1;  
%mend;
¿Fue útil?

Solución

La única forma en que se me ocurre hacer esto sin tener que declarar cada macro como global con anticipación y luego hacer una declaración% let es usar una macro en lugar de la declaración% let.

En el código a continuación, creo una macro llamada % mylet que tiene como único propósito la tarea de crear una variable global con el nombre y el valor que paso como argumentos. Luego uso esta macro en lugar de% let en todas partes donde quiero que se definan las variables globales.

ej.

%global myvar;
%let myvar=2;

se convertiría en ...

  

%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;

Otros consejos

Si crea la variable macro en código abierto, la variable macro se agregará automáticamente a la tabla de símbolos de macro global:

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

Esto sería antes si creas la macro más grande:

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

Otra alternativa sería crear las variables utilizando un paso de datos:

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

Si crea variables de macro dentro de un paso de datos, y ese paso de datos está dentro de una macro, las variables de macro creadas serán, por defecto, de alcance local para esa macro.

Utilizar

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

para crear variables macro globales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top