Publicado el :
Utilidad CREACIÓN_INTERNA

Generar un libref SAS único

Este código también está disponible en: Deutsch English Français Español
La macro `%mf_getuniquelibref` busca un libref SAS© no utilizado iterando sufijos numéricos (comenzando por 0) añadidos a un `prefix` especificado (por defecto 'mc'). Valida la longitud del prefijo (máximo 7 caracteres) y su conformidad con las reglas de nombres SAS©. El valor `maxtries` se ajusta dinámicamente en función de la longitud del prefijo para cubrir todas las combinaciones posibles (hasta 8 caracteres para un libref). La función `SYSFUNC(LIBREF())` se utiliza para verificar la existencia de cada libref potencial. Se devuelve el primer libref no asignado. En caso de fallo (todos los librefs posibles están ocupados), se escriben mensajes de error en el registro SAS© y la macro devuelve `0`.
Análisis de datos

Type : CREACIÓN_INTERNA


La macro no consume ni produce conjuntos de datos SAS. Manipula cadenas de caracteres (prefijos de librefs) e interactúa con el sistema SAS a través de funciones de metadatos para encontrar un nombre de libref disponible. No depende de ningún dato externo o interno específico (como SASHELP) para su funcionamiento principal.

1 Bloque de código
Macro
Explicación :
Este bloque define la macro `%mf_getuniquelibref`. Inicializa una variable local `x`. Las primeras instrucciones `%if` validan el parámetro `prefix`: no debe exceder los 7 caracteres y debe ser un nombre SAS válido (`V7`). La variable `maxtries` se calcula a continuación para determinar el rango de búsqueda. Un bucle (`%do x = 0 %to &maxtries;`) itera para generar librefs potenciales (por ejemplo, `mc0`, `mc1`, ...). `%sysfunc(libref(&prefix&x))` verifica si el libref generado ya está asignado. Si `libref()` devuelve un valor no nulo, el libref no se utiliza y es devuelto por la macro. Si el bucle termina sin encontrar un libref único, se escriben mensajes de error en el registro SAS y la macro devuelve `0`.
¡Copiado!
1%macro mf_getuniquelibref(prefix=mc,maxtries=1000);
2 %local x;
3 
4 %IF ( %LENGTH(&prefix) gt 7 ) %THEN %DO;
5 %put %str(ERR)OR: The prefix parameter cannot exceed 7 characters.;
6 0
7 %return;
8 %END;
9 %ELSE %IF (%sysfunc(NVALID(&prefix,v7))=0) %THEN %DO;
10 %put %str(ERR)OR: Invalid prefix (&prefix);
11 0
12 %return;
13 %END;
14 
15 /* Set maxtries equal to '10 to the power of [# unused characters] - 1' */
16 %let maxtries=%eval(10**(8-%LENGTH(&prefix))-1);
17 
18 %DO x = 0 %to &maxtries;
19 %IF %sysfunc(libref(&prefix&x)) ne 0 %THEN %DO;
20 &prefix&x
21 %return;
22 %END;
23 %let x = %eval(&x + 1);
24 %END;
25 
26 %put %str(ERR)OR: No usable libref in range &prefix.0-&maxtries;
27 %put %str(ERR)OR- Try reducing the prefix or deleting some libraries!;
28 0
29%mend mf_getuniquelibref;
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.
Información de copyright : Mencionado en el bloque de ayuda: Allan Bowe. Un copyright más detallado encontrado en un archivo relacionado (`_version.sas`) indica: Copyright (c) 2001-2006 Rodney Sparapani. Este archivo es software libre; puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU tal como fue publicada por la Free Software Foundation.