La macro opera principalmente sobre nombres de variables macro pasados como parámetro. Para la eliminación opcional de macros compiladas, consulta la vista del sistema `dictionary.catalogs` (parte de SASHELP) y manipula los catálogos SAS del sistema.
1 Bloque de código
LANGAGE MACRO SAS
Explicación : Este bloque utiliza las funciones del lenguaje macro para iterar sobre una lista de nombres de variables (consideradas como bases de nombres para arreglos de variables macro). Para cada nombre, elimina todas las variables macro indexadas (por ejemplo, `miArreglo1`, `miArreglo2`), así como las variables especiales `LBOUND`, `HBOUND` y `N` que definen los límites y el tamaño del arreglo de variables macro. La opción `NOWARN` evita la visualización de advertencias si una variable macro no existe.
Explicación : Este bloque se ejecuta si el parámetro `macarray` indica que se deben eliminar macros. Utiliza `%sysfunc(dosubl(...))` para ejecutar un bloque de código SAS en modo de envío. Este bloque:
1. Utiliza `PROC SQL` para consultar la vista `dictionary.catalogs` con el fin de identificar las macros compiladas (`objtype = 'MACRO'`) en la biblioteca `WORK` cuyos nombres coinciden con los proporcionados en `arrs`. Los resultados se almacenan en una tabla temporal.
2. Un `DATA _NULL_` paso a paso con `CALL EXECUTE` genera dinámicamente instrucciones `PROC CATALOG` para cada macro identificada. `PROC CATALOG` se utiliza luego con la opción `force` para eliminar las entradas de macro correspondientes del catálogo WORK.
3. Finalmente, `PROC DELETE` elimina la tabla temporal creada por `PROC SQL`.
¡Copiado!
%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;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.