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 Le code de macro lui-même est très simple car lorsque le jeton %macro
est rencontré, le système SAS commence à compiler une macro SAS et continue de compiler jusqu'à ce qu'il atteigne un jeton %mend
. Les seuls vrais problèmes que vous pouvez rencontrer sont les suivants: si vous avez mis à jour le code de macro et ne le recompilez pas avant de l'exécuter, dans ces situations, il exécutera toujours l'ancienne version dans la bibliothèque de macros. Par extension, si vous essayez de compiler une macro qui appelle une autre macro qui n'a pas encore été définie, 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 macro: Lors de la définition macro variables Il existe deux étendues: globale et locale. Une fois définies, les variables globales peuvent être accédées n'importe où et à n'importe quel moment. Cependant, les variables locales n'existent que localement lors de l'exécution de la macro dans laquelle elle a été définie.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 travail:
Dans l'exemple suivant, les macros sont défini dans l'ordre inverse pour empêcher le retour de SAS un Invocation apparente de l'avertissement de macro.
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 ;
Compile la macro de haut niveau (qui appelle à son tour ci-dessus deux macros) et l'exécuter:
%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 e e journal:
- En dehors de% Level3, & je retourne un avertissement que la variable macro ne existe pas
- Dans% Level3, lorsque & G1 est appelée, elle retourne la valeur stockée dans la portée locale de% level3.Une fois en dehors de% level3, la valeur renvoie à la valeur stockée globalement
Techniquement parlant, la bibliothèque autocall ne charge pas les macros 'en amont'. Si l'utilisateur essaie d'exécuter une macro et que cette macro n'a pas déjà été définie, SAS commencera à la rechercher dans la bibliothèque autocall. S'il trouve avec succès un nom de fichier correspondant à l'appel, et que ce fichier contient un nom de macro correspondant à l'appel, alors il compilera la macro. Si vous apportez ensuite des modifications à ce fichier dans la bibliothèque autocall, vous devrez renvoyer le code manuellement pour que ces modifications soient disponibles dans une session SAS interactive. –