Hola Roberto
En el primer paso DATA envía resultados porque la variable macro &valor ya tenía el valor asignado ANTES de la ejecución del paso DATA.
La sentencia dentro del paso DATA
valor = today();
No asigna un valor a la variable macro, sino que crea una variable dentro del data set "tmp" llamada "valor" y le asigna el resultado de la ejecución de la función today().
En cuanto se hace el cambio del nombre de la variable dentro del paso DATA, sólo se cambia el nombre de la variable del data set de salida, sin embargo esta acción no genera la variable macro &fecha_hoy ni le asigna valor alguno.
Las sentencias macros como el %LET y el %PUT dentro del paso DATA se ejecutan en tiempo de compilación por el procesador de macros y posteriormente ya no se ejecuta en el compilador.
Para poder manejar los valores de las variables macros dentro del paso DATA se usan las rutinas
Call SymPutX()
Call SymGet()
Call SymPutX() tiene la misma función que %LET, es decir, asigna un valor a una variable macro por el compilador durante la ejecución del paso DATA.
Call SymGet() sirve para obtener el valor almacenado en una variable macro durante la ejecución del paso DATA.
Por lo tanto, para manejar los valores de las variables macros dentro del paso DATA, el primer paso DATA el ejemplo que mandaste, hay que reemplazar el %LET por la rutina Call SymputX() y el %PUT hay que ponerlo fuera del paso data ya que lo ejecuta el procesador de macros:
DATA tmp;
valor = today();
Call SymPutX( 'miMacroVariable', CatS( 'Archivo', valor ) );
RUN;
%Put La macrovariable es &miMacroVariable;
Con esto, si se cambia el nombre de la variable "valor" por "fecha_hoy", el paso DATA quedaría de la siguiente manera.
DATA tmp;
fecha_hoy = today();
Call SymPutX( 'miMacroVariable', CatS( 'Archivo', fecha_hoy ) );
RUN;
%Put La macrovariable es &miMacroVariable;
Saludos.
... View more