Question

Dans mon code que j'ai plusieurs macros. Macro A est la macro principale. Macro appelle ensuite macro B qui appelle à son tour macro C.

SAS, dois-je les définir dans l'ordre inverse? En d'autres termes, dois-je d'abord définir macro C, puis macro B, puis macro Une dernière? Ou est-ce important depuis SAS lit tout le code avant qu'il frappe réellement la commande pour exécuter les macros? Pour cette question, puis-je utiliser la commande pour exécuter la macro comme la première déclaration dans mon code, puis définir les macros ci-dessous la commande?

Merci!

Était-ce utile?

La solution

D'abord, vous devez définir une macro avant qu'il ne soit appelé.

En second lieu, peu importe où la macro est invoquée aussi longtemps que vous avez chargé avant de la main.

Pour des détails sur votre problème: La bibliothèque autocall est votre ami. Si vous administrateur SAS ne vous permettra pas de mettre vos macros dans la bibliothèque de autocall, vous pouvez ajouter l'autocall comme ceci:

filename mymacros 'c:\mysas'; 
/*this defines the directory you have stored your macros*/

options sasautos=(sasautos mymacros) mautosource; 

Autres conseils

une macro doit être défini avant l'appel. pour des raisons de performance, il est préférable de ne pas définir une macro dans un autre - si vous le faites, il sera redéfinie chaque fois que vous appelez la macro externe. les travaux suivants fins:

%macro a;
  %put a;
  %b
%mend a;

%macro b;
  %put b;
  %c
%mend b;

%macro c;
  %put c;
%mend c;

%*-- %a is main --*;
%a
/* on log
a
b
c
*/

Vous devez définir une macro avant d'être appelé, si la ligne avec « % A » aurait besoin de suivre la définition de macro A. L'ordre des autres définitions macro n'a pas d'importance, tant qu'ils sont définis avant sont appelés. En général, dans mes programmes je mis en place une macro principale comme vous décrivez, alors la dernière ligne du programme appelle cette macro.

Une autre option à considérer est de mettre en place une bibliothèque de macro autocall, qui contient les définitions de plusieurs macros. Cela fonctionne mieux pour les macros réutilisables, de sorte que vous n'avez pas à les redéfinir dans chaque programme.

Il y a deux aspects de code macro SAS à définir: le code macro qui est compilée et les paramètres macro:

Code Macro:

Le code de macro lui-même est très simple en ce que lorsque le jeton est %macro rencontré le système SAS commence à compiler une macro SAS et maintient la compilation jusqu'à ce qu'il frappe un jeton %mend. Les seuls problèmes réels que vous pouvez venir contre est si vous mis à jour le code macro et ne recompilez pas avant de l'exécuter - dans ces situations, il continue à fonctionner l'ancienne version, il a dans la bibliothèque macro. Par extension, si vous essayez de compiler une macro qui appelle une autre macro qui n'a pas encore été défini, vous obtiendrez une erreur. Pour ces raisons, ils doivent être programmés dans l'ordre dans lequel ils sont appelés (comme indiqué dans l'exemple ci-dessous:% level3 est avant% niveau 2, ce qui est avant% niveau1)

Les variables de macro: Lors de la définition macro Variables il y a deux champs d'application: globale et locale. Une fois défini, les variables globales sont accessibles en tout lieu et à tout moment. Cependant, les variables locales existent uniquement au niveau local lors de l'exécution de la macro dans laquelle il a été défini. Par extension, si la macro où la variable locale a été définie appelle toutes les autres macros, la variable macro locale sera toujours accessible:

Exemple de:

Dans l'exemple suivant, les macros sont définie dans l'ordre inverse pour éviter SAS retour d'un invocation apparente de macro avertissement .

Le schéma ci-dessous illustre la structure des macros suivantes dans l'exemple suivant:

|-----------------------------|
|GLOBAL                       |
|  |------------------------| |
|  |LEVEL1                  | |
|  |  |-------------------| | |
|  |  |LEVEL2             | | |
|  |  |  |--------------| | | |
|  |  |  |  LEVEL3      | | | |
|  |  |  |--------------| | | |
|  |  |-------------------| | |
|  |------------------------| |
|-----------------------------|

Compiler les macros imbriquées:

 %macro level3 ;
  %put **** START LEVEL3 **** ;
  %local G1;
  %let G1=Local ;

  %do i=1 %to 2 ;
    %put In the macro do loop I=&i ;
  %end ;

  %put The value of I at level3 is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL3 ****;
%mend level3 ;


 %macro level2 ;
  %put **** START LEVEL2 **** ;
  %*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level3 ;

  %put The value of I in level2 is: &I ;
  %put **** END LEVEL2 ****;
%mend level2 ;

Compiler la macro de haut niveau (qui appelle à son tour les deux macros ci-dessus) et exécutez-le:

%let G1=Global;
%macro level1 ;
  %put **** START LEVEL1 **** ;
  %let L1=Yes;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level2 ;

  %put The value of I outside of the local macro is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL1 ****;
%mend level1 ;
%level1 ;

Points à noter lors de l'examen du journal:

  • En dehors de% Level3, et je retourne un avertissement que la variable macro ne ne pas exister
  • Dans% Level3, quand et G1 est appelée, elle retourne la valeur stockée dans la portée locale de level3.Once% à l'extérieur de level3%, la valeur revient à la valeur stockée à l'échelle mondiale
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top