Domanda

c'è un modo breve per rendere TUTTE le variabili macro create all'interno di una macro di portata globale?

vale a dire:

%macro x;  
 %global _all_;  * ??? ;  
 %let x=1;  
 %let y=1;  
 %let z=1;  
%mend;
È stato utile?

Soluzione

L'unico modo in cui posso pensare di farlo senza dover dichiarare ogni macro come globale in anticipo e quindi fare un'istruzione% let è utilizzare una macro al posto di l'istruzione% let.

Nel codice seguente, creo una macro chiamata % mylet che ha come unico scopo il compito di creare una variabile globale con il nome e il valore che passo come argomenti. Quindi uso questa macro al posto di% let ovunque voglio che vengano definite le variabili globali.

ad es.

%global myvar;
%let myvar=2;

diventerebbe ...

  

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

Altri suggerimenti

Se crei la variabile macro all'interno del codice aperto, la variabile macro verrà automaticamente aggiunta alla tabella dei simboli macro globali:

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

Questo sarebbe prima di creare la macro più grande:

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

Un'altra alternativa sarebbe quella di creare le variabili usando un passaggio di dati:

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

Se crei variabili macro in un passaggio di dati e tale passaggio di dati si trova all'interno di una macro, le variabili di macro create saranno, per impostazione predefinita, di portata locale per quella macro.

Usa

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

per creare variabili macro globali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top