La macro opère principalement sur des noms de variables macro passées en paramètre. Pour la suppression optionnelle des macros compilées, elle interroge la vue système `dictionary.catalogs` (faisant partie de SASHELP) et manipule les catalogues SAS du système.
1 Bloc de code
LANGAGE MACRO SAS
Explication : Ce bloc utilise les fonctions du langage macro pour itérer sur une liste de noms de variables (considérées comme des bases de noms pour des tableaux de variables macro). Pour chaque nom, il supprime toutes les variables macro indexées (par exemple, `monTableau1`, `monTableau2`) ainsi que les variables spéciales `LBOUND`, `HBOUND` et `N` qui définissent les limites et la taille du tableau de variables macro. L'option `NOWARN` empêche l'affichage d'avertissements si une variable macro n'existe pas.
Explication : Ce bloc est exécuté si le paramètre `macarray` indique que des macros doivent être supprimées. Il utilise `%sysfunc(dosubl(...))` pour exécuter un bloc de code SAS en mode de soumission. Ce bloc :
1. Utilise `PROC SQL` pour interroger la vue `dictionary.catalogs` afin d'identifier les macros compilées (`objtype = 'MACRO'`) dans la bibliothèque `WORK` dont les noms correspondent à ceux fournis dans `arrs`. Les résultats sont stockés dans une table temporaire.
2. Un `DATA _NULL_` pas à pas avec `CALL EXECUTE` génère dynamiquement des instructions `PROC CATALOG` pour chaque macro identifiée. `PROC CATALOG` est ensuite utilisé avec l'option `force` pour supprimer les entrées de macro correspondantes du catalogue WORK.
3. Enfin, `PROC DELETE` supprime la table temporaire créée par `PROC SQL`.
Copié !
%if %qupcase(&macarray.) in (Y YES) %then
%do;
%let rc = %sysfunc(dosubl(
/*+++++++++++++++++++++++++++++++++++++++++++++*/
options nonotes nosource %str(;)
proc sql noprint %str(;)
create table _%sysfunc(datetime(), hex16.)_ as
select memname %str(,) objname
from dictionary.catalogs
where
objname in (%upcase(
%str(%")%qsysfunc(tranwrd(&arrs., %str( ), %str(%,%"))))%str(%")
))
and objtype = 'MACRO'
and libname = 'WORK'
order by memname %str(,) objname
%str(;)
quit %str(;)
data _null_ %str(;)
do until(last.memname) %str(;)
set _last_ %str(;)
by memname %str(;)
if first.memname then
call execute('proc catalog cat = work.'
!! strip(memname)
!! ' et = macro force;') %str(;)
call execute('delete '
!! strip(objname)
!! '; run;') %str(;)
end %str(;)
call execute('quit;') %str(;)
run %str(;)
proc delete data = _last_ %str(;)
run %str(;)
/*+++++++++++++++++++++++++++++++++++++++++++++*/
));
%end;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.