Publié le :
Macro CREATION_INTERNE | SASHELP

Suppression de variables macro et de macros

Ce code est également disponible en : Deutsch English Español
Attention : Ce code nécessite des droits administrateur.
Cette macro, nommée `bdeleteMacArray`, est conçue pour gérer la suppression d'éléments SAS©. Elle prend une liste de préfixes de variables macro (`arrs`) et les utilise pour supprimer les variables macro indexées (`arr.J`) ainsi que les variables de limites (`LBOUND`, `HBOUND`, `N`) associées à chaque 'tableau' de variables macro. De manière optionnelle, si le paramètre `macarray` est défini sur 'Y' ou 'YES', la macro étend sa fonctionnalité pour rechercher et supprimer les macros compilées correspondantes dans le catalogue WORK, identifiées via la vue `dictionary.catalogs` et supprimées à l'aide de `PROC CATALOG`. Ce processus implique des tâches d'administration du système SAS©.
Analyse des données

Type : CREATION_INTERNE | SASHELP


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.
Copié !
1%local I J rc;
2%DO I = 1 %to %sysfunc(countw(&arrs.));
3%let arr = %scan(&arrs., &I., %str( ));
4 %DO J = &&&arr.LBOUND %to &&&arr.HBOUND;
5 /*%put *&arr.&J.*;*/
6 %symdel &arr.&J. / NOWARN;
7 %END;
8 %symdel &arr.LBOUND &arr.HBOUND &arr.N / NOWARN;
9%END;
2 Bloc de code
PROC SQL, DATA STEP, PROC CATALOG, PROC DELETE
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é !
1%IF %qupcase(&macarray.) in (Y YES) %THEN
2 %DO;
3 %let rc = %sysfunc(dosubl(
4 /*+++++++++++++++++++++++++++++++++++++++++++++*/
5 options nonotes nosource %str(;)
6 PROC SQL noprint %str(;)
7 create TABLE _%sysfunc(datetime(), hex16.)_ as
8 select memname %str(,) objname
9 from dictionary.catalogs
10 where
11 objname in (%upcase(
12 %str(%")%qsysfunc(tranwrd(&arrs., %str( ), %str(%,%"))))%str(%")
13 ))
14 and objtype = 'MACRO'
15 and libname = 'WORK'
16 order by memname %str(,) objname
17 %str(;)
18 quit %str(;)
19 data _null_ %str(;)
20 do until(last.memname) %str(;)
21 set _last_ %str(;)
22 by memname %str(;)
23 
24 if first.memname then
25 call execute('PROC CATALOG cat = work.'
26 !! strip(memname)
27 !! ' et = macro force;') %str(;)
28 call execute('delete '
29 !! strip(objname)
30 !! '; RUN;') %str(;)
31 end %str(;)
32 call execute('QUIT;') %str(;)
33 RUN %str(;)
34 PROC DELETE DATA = _last_ %str(;)
35 RUN %str(;)
36 /*+++++++++++++++++++++++++++++++++++++++++++++*/
37 ));
38 %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.