Question

existe-t-il un moyen rapide de rendre TOUTES les variables de macro créées dans une macro de portée globale?

c'est-à-dire:

%macro x;  
 %global _all_;  * ??? ;  
 %let x=1;  
 %let y=1;  
 %let z=1;  
%mend;
Était-ce utile?

La solution

La seule façon pour moi de le faire sans avoir à déclarer chaque macro comme globale à l'avance, puis à faire une instruction% let est d'utiliser une macro à la place de l'instruction% let.

Dans le code ci-dessous, je crée une macro appelée % mylet dont le seul but est de créer une variable globale avec le nom et la valeur que je transmets en argument. J'utilise ensuite cette macro à la place de% let partout où je veux définir des variables globales.

par exemple.

%global myvar;
%let myvar=2;

deviendrait ...

  

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

Autres conseils

Si vous créez la variable macro dans le code ouvert, celle-ci sera automatiquement ajoutée à la table des symboles macro:

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

Ce serait avant de créer la macro plus grande:

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

Une autre alternative serait de créer les variables à l'aide d'une étape de données:

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

Si vous créez des variables de macro dans une étape de données et que cette étape de données se trouve à l'intérieur d'une macro, les variables de macro créées seront, par défaut, de portée locale par rapport à cette macro.

Utiliser

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

pour créer des variables macro globales.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top