Pergunta

existe uma maneira curta de tornar TODAS as variáveis ​​​​de macro criadas dentro de uma macro com escopo global?

ou seja:

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

Solução

A única maneira que consigo pensar em fazer isso sem ter que declarar cada macro como global antecipadamente e depois fazer uma instrução %let é usar uma macro no lugar de a instrução% let.

No código abaixo, eu crio uma macro chamada % mylet que tem como único objetivo a tarefa de criar uma variável global com o nome e o valor que passo como argumentos.Em seguida, uso essa macro no lugar de %let em todos os lugares onde desejo que variáveis ​​globais sejam definidas.

por exemplo.

%global myvar;
%let myvar=2;

se tornaria...

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

Outras dicas

Se você criar a variável macro dentro do código aberto, a variável macro será automaticamente adicionada à tabela global de símbolos de macro:

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

Este seria antes você cria a macro maior:

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

Outra alternativa seria criar as variáveis ​​usando uma etapa de dados:

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

Se você criar variáveis ​​de macro em uma etapa de dados, e essa etapa de dados estiver dentro de uma macro, as variáveis ​​de macro criadas terão, por padrão, escopo local para essa macro.

Usar

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

para criar variáveis ​​macro globais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top