BookmarkSubscribeRSS Feed
Tip Semanal 023: Crear variables macro
Berenice25
SAS Employee

Lenguaje de macros 


SAS tiene una poderosa herramienta de programación llamada 'Lenguaje de Macros' que nos permite ampliar nuestra capacidad de programación. 

¿Para qué se puede utilizar este lenguaje? Por ejemplo para: 

1) Evitar secciones repetitivas de código 
2) Personalizar las salidas y resultados ya que pueden tomar diferentes valores para diferentes instancias de ejecución del mismo código. 
3) ¡Mucho más! 

Es muy importante señalar que el uso del lenguaje de Macros no acelera la ejecución del código. No, no y no. Sirve para simplificar la programación y hacerla más dinámica. 

En el Lenguaje de Macros podemos distinguir: 
1) Variables macro 
2) Funciones macro 
3) Programas macro (o directamente 'macros') 

 

En este Tip veremos una clase especial de variables macro: las variables macro generadas por el usuario. 
Cabe mencionar que este es el tip inicial de varios en que trabajaremos con macros. Esperamos que les sean de utilidad.

 

Vayamos entonces a nuestro tema...

 

Variables macro generadas por el usuario:
Son las variables que guardan un valor que será utilizado por un programa SAS. 

Lo usual es declararlas (darles un nombre y un valor) al principio de un programa e invocarlas  (o 'llamarlas' si utilizamos un lenguaje más coloquial) más tarde en el cuerpo del programa.

Es muy importante tener en cuenta que las variables macro siempre guardan texto. 

 

 


/*-------------------*/
/* inicio del código */
/*-------------------*/

/****************************************************************************/
/* Atención! 																*/
/* Como vamos a trabajar con variables macro, es fundamental recordar que	*/
/* esta clase de variables guardan texto; siempre texto, por más que a		*/
/* veces veamos números o cálculos. A no dejarse engañar!					*/
/****************************************************************************/




/*------------------------------*/
/* Primera parte:	 			*/
/* Creación de variables macro	*/
/*------------------------------*/

/* La forma elemental de crear variables macro es utilizando '%let' */
%Let pruebatxt01 = esto es una prueba;
%Let pruebatxt02 = esta es la última prueba;

/* Las variables macro también guardan comillas simples y dobles */
%Let pruebatxt03 = ' Esto también es una prueba ';
%Let pruebatxt04 = " Esta es otra prueba más @macro #macro "; 

/* Las variables macro no guardan espacios al principio o al final del texto */
%Let pruebatxt05 =           Probamos espacios al principio y al final            ;


/****************************************************************************/
/* Los resultados de todas estas variables macro los vemos en el Log		*/
/* Para esto utilizamos: 													*/
/* %put (que nos permite ver cosas en el Log)								*/
/* _user_ (para ver las macros del usuario)									*/
/****************************************************************************/

%Put _user_;  /* Pueden ver, por ejemplo, cómo la variable macro 'pruebatxt05' no guardó
				 los espacios anteriores y posteriores al texto */




/*------------------------------------------*/
/* Segunda parte:	 						*/
/* Creación de variables macro con números	*/
/*------------------------------------------*/

%Let num01 = 3;
%Let num02 = 4;
%Let num03 = 1+2; /* no me digan que pensaron automáticamente en "3"... siempre es texto! */


/****************************************************************************/
/* Vemos los resultados actualizados en el Log								*/
/****************************************************************************/

%Put _user_; /* van a figurar todas las variables macro, incluso las que generamos antes */




/*----------------------------------*/
/* Tercera parte:	 				*/
/* Sobreescribir variables macro	*/
/*----------------------------------*/

/****************************************************************************/
/* Las variables macro se sobreescriben (o se 'pisan', como prefieran 		*/
/* decirlo). Cuidado con esto.												*/
/****************************************************************************/

%Let num03 = 3.14; 
%Let pruebatxt04 = ¡cambié el contenido de la variable macro! ;

/****************************************************************************/
/* Comprobamos si cambiaron los valores de estas 2 variables macro			*/
/****************************************************************************/

%Put _user_;




/*--------------------------*/
/* Cuarta parte:	 	 	*/
/* Utilizar variables macro	*/
/*--------------------------*/

/* Cómo invocamos a las variables macro? Utilizando '&<nombre de la variable>' */
/* Por ejemplo, combinamos 2 variables macro en una nueva */
%Let prueba_x_2 = &pruebatxt01 y &pruebatxt02;
%Let num_suma = &num01 + &num02;  /* es texto! */

/****************************************************************************/
/* Nuevamente comprobamos los resultados actualizados en el Log				*/
/****************************************************************************/

%Put _user_;




/*--------------------------*/
/* Quinta parte:	 	 	*/
/* Borrar variables macro	*/
/*--------------------------*/

/****************************************************************************/
/* Para borrar algunas variables macro utilizamos '%symdel'					*/
/****************************************************************************/

%Symdel num_suma num03; /* eliminamos 2 variables macro */

/****************************************************************************/
/* Vemos la actualización en el Log											*/
/* Las 2 variables macro fueron eliminadas									*/
/****************************************************************************/

%Put _user_;




/*-------------------*/
/* Sexta parte:	 	 */
/* Ejemplos de uso 	 */
/*-------------------*/

/****************************************************************************/
/* Ejemplos que utilizan variables macro. 									*/
/* Ante todo, debemos aclarar que estos ejemplos son elementales. Siven		*/
/* para tener una idea de sus posibilidades.								*/
/* Además, les comentamos que existe la costumbre de agregar un punto al 	*/
/* final de las variables macro al utilizarlas (por ejemplo '&pruebatxt01.'	*/
/* en vez de '&pruebatxt01'. 												*/
/* ¿Con qué propósito? Para resolver ambigüedades (ver el ejemplo 3).		*/
/****************************************************************************/

/****************************************************************************/
/* Ejemplo 1:							 									*/
/* Títulos dinámicos con variables macro 									*/
/****************************************************************************/

/****************************************************************************/
/* ¡Atención!							 									*/
/* Las comillas dobles se comportan diferente que las comillas simples en	*/
/* presencia de variables macro. El resultado será distinto!				*/
/****************************************************************************/

%Let lib = SASHELP;
%Let tabla = CARS;
Proc Print data = sashelp.cars;
	Title "Filas y columnas de la tabla &tabla de la librería &lib";
Run;


/****************************************************************************/
/* Ejemplo 2:							 									*/
/* Títulos y filtros dinámicos												*/
/****************************************************************************/

%Let cil = 6;
*%Let tabla = CARS;   /* las variables macro 'tabla' y 'lib' están comentadas porque.. */
*%Let lib = SASHELP;  /* ..ya fueron creadas. No son necesarias si ejecutaron/corrieron el Ejemplo 1 */
Proc Print data = sashelp.cars;
	where Cylinders<6;
	Title "Filas y columnas de la tabla &tabla de la librería &lib, con cilindros menores a &cil";
Run;


/****************************************************************************/
/* Ejemplo 3:							 									*/
/* Variables macro en varios procedimientos									*/
/****************************************************************************/

%Let cil = 5;
*%Let lib = SASHELP; /* 'tabla' y 'lib' están comentadas porque... ya saben porqué! */
*%Let tabla = CARS;

Proc Contents data=&lib..&tabla;  /* necesitamos 2 puntos: uno para poder delimitar la variable
									macro y el otro para separar la librería de la tabla */
	Title "Descripción de &lib..&tabla";
Run;

Proc Print data = &lib..&tabla; /* nuevamente los 2 puntos */
	where Cylinders<6;
	Title "Filas y columnas de la tabla &tabla de la librería &lib, con menos de &cil cilindros";
Run;

Proc Means data = &lib..&tabla; /* nuevamente los 2 puntos */
	Title "Estadística descriptiva de las variables numéricas de &lib..&tabla";
Run;



/*----------------*/
/* fin del código */
/*----------------*/

 

Si después de todo esto piensan que utilizar variables macro es lo mismo que 'buscar y reemplazar' (o sea 'search and replace') es que fallé con las explicaciones y los ejemplos. 

Esta pregunta es para las personas que lograron llegar hasta acá: 
Existirá alguna forma de borrar todas las variables macro? 

  • Tal vez %symdel _user_? 
  •  Tal vez %symdel _all_? 
  •  Tal vez %symdel _killeverything_? 

 

2 Comments
MikeArrieta
Calcite | Level 5

¿Hay algún seminario web de Macros?

_ximena25_
Calcite | Level 5

Hola Mike, si tenemos un Seminario Web en formato On- Demand 

Accede al siguiente link --> https://www.sas.com/es_mx/webinars/2022/q1/customer-success-feb.html.

Registrate por favor y en automático podrás ver la grabación 

Suerte 🍀

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

Article Labels
Contributors