Veröffentlicht am :
Makro CREATION_INTERNE | SASHELP

Löschen von Makrovariablen und Makros

Dieser Code ist auch verfügbar auf: English Español Français
Attention : Dieser Code erfordert Administratorrechte.
Dieses Makro, benannt `bdeleteMacArray`, wurde entwickelt, um die Löschung von SAS©-Elementen zu verwalten. Es nimmt eine Liste von Makrovariablen-Präfixen (`arrs`) entgegen und verwendet diese, um indizierte Makrovariablen (`arr.J`) sowie die mit jedem Makrovariablen-Array verbundenen Grenzvariablen (`LBOUND`, `HBOUND`, `N`) zu löschen. Optional, wenn der Parameter `macarray` auf 'Y' oder 'YES' gesetzt ist, erweitert das Makro seine Funktionalität, um entsprechende kompilierte Makros im WORK-Katalog zu suchen und zu löschen, identifiziert über die Ansicht `dictionary.catalogs` und gelöscht mit `PROC CATALOG`. Dieser Prozess beinhaltet SAS©-Systemadministrationsaufgaben.
Datenanalyse

Type : CREATION_INTERNE | SASHELP


Das Makro operiert hauptsächlich mit Makrovariablennamen, die als Parameter übergeben werden. Für die optionale Löschung kompilierter Makros fragt es die Systemansicht `dictionary.catalogs` (Teil von SASHELP) ab und manipuliert die SAS-Systemkataloge.

1 Codeblock
LANGAGE MACRO SAS
Erklärung :
Dieser Block verwendet Makrosprachfunktionen, um über eine Liste von Variablennamen (als Basisnamen für Makrovariablen-Arrays betrachtet) zu iterieren. Für jeden Namen löscht er alle indizierten Makrovariablen (z.B. `meinArray1`, `meinArray2`) sowie die speziellen Variablen `LBOUND`, `HBOUND` und `N`, die die Grenzen und die Größe des Makrovariablen-Arrays definieren. Die Option `NOWARN` verhindert Warnungen, falls eine Makrovariable nicht existiert.
Kopiert!
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 Codeblock
PROC SQL, DATA STEP, PROC CATALOG, PROC DELETE
Erklärung :
Dieser Block wird ausgeführt, wenn der Parameter `macarray` anzeigt, dass Makros gelöscht werden sollen. Er verwendet `%sysfunc(dosubl(...))`, um einen SAS-Codeblock im Submit-Modus auszuführen. Dieser Block:
1. Verwendet `PROC SQL`, um die Ansicht `dictionary.catalogs` abzufragen, um kompilierte Makros (`objtype = 'MACRO'`) in der Bibliothek `WORK` zu identifizieren, deren Namen mit den in `arrs` angegebenen übereinstimmen. Die Ergebnisse werden in einer temporären Tabelle gespeichert.
2. Ein `DATA _NULL_`-Schritt mit `CALL EXECUTE` generiert dynamisch `PROC CATALOG`-Anweisungen für jedes identifizierte Makro. `PROC CATALOG` wird dann mit der Option `force` verwendet, um die entsprechenden Makroeinträge aus dem WORK-Katalog zu löschen.
3. Schließlich löscht `PROC DELETE` die temporäre Tabelle, die von `PROC SQL` erstellt wurde.
Kopiert!
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;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.