macro ejemplos sas sas-macro

ejemplos - Rango de fecha incremental de macro SAS SQL



ejemplos de macros en sas (1)

Actualmente estoy teniendo problemas para usar un rango de datos incremental para generar una tabla que utiliza una tabla llena de correos electrónicos con JobOffers que ya han sido renombrados usando VBA; esto es más para mi propio aprendizaje que para cualquier otra cosa.

Quiero que el código recorra los días que puedo establecer en un comando macro

%EmailDump(''01Jan2015''d,''02Jan2015'')

Y ejecutará la macro en el siguiente código y me permitirá retirar todos los correos electrónicos de ese período y exportarlos (entiendo que estoy escribiendo la tabla cada vez; sin embargo, esto se exportará (cada exportación debe ser diferente porque tiene la macro para EmailStart dentro de ella)

Entonces algunos datos ficticios para esto se verían como

Tema EmailStartDate

Oferta de trabajo 12/01/2015

Oferta de trabajo 25/01/2015

Oferta de trabajo 12/05/2015

El código utilizado es el siguiente

%Macro EmailDump(begindate,endindate); %do EmailStart = &begindate. %to &endindate. %by 1; %end; PROC SQL; CREATE TABLE WORK.EMAILDUMP AS SELECT * FROM WORK.EMAILS WHERE TOPIC = ''JobOffer'' and EmailStartDate = &EmailStart ;QUIT; proc export data=work.EMAILDUMP dbms=XLSX outfile="/p01/Output File &EmailStart " replace; run; %Mend EmailDump; %EmailDump(''01Jan2015''d,''02Jan2015''d);

El mensaje de error se parece al siguiente

ERROR: Se encontró un operando de caracteres en la función% EVAL o en la condición% IF donde se requiere un operando numérico. La condición era: & begindate. ERROR: el valor% FROM del bucle% DO EmailStart no es válido. ERROR: Se encontró un operando de caracteres en la función% EVAL o en la condición% IF donde se requiere un operando numérico. La condición era: & endindate. ERROR: el valor% TO del bucle% DO EmailStart no es válido. ERROR: la macro EmailDump dejará de ejecutarse

¿No estoy seguro si alguien puede ayudarme con esto? ¡Agradecería mucho cualquier ayuda!


A continuación, se simplifica el código para contener exactamente lo que se requiere para reproducir el problema:

%macro emaildump(begindate,endindate); %do emailstart = &begindate %to &endindate; %put &emailstart; %end; %mend emaildump;

Si lo llamamos con literales, obtenemos el mensaje que describes:

%emaildump(''01jan2015''d,''02jan2015''d);

Da:

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: &begindate ERROR: The %FROM value of the %DO EMAILSTART loop is invalid. ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: &endindate ERROR: The %TO value of the %DO EMAILSTART loop is invalid. ERROR: The macro EMAILDUMP will stop executing.

Sin embargo, si pasamos los valores de fecha sin procesar (que solo se representan como enteros), funciona bien. Podemos calcular los valores de fecha sin procesar usando la función mdy() . Como lo estamos haciendo en el lenguaje de macros, tendremos que ajustar mdy() con %sysfunc() :

%let start = %sysfunc(mdy(1,1,2015)); %let end = %sysfunc(mdy(1,2,2015)); %emaildump(&start,&end);

Da el resultado deseado:

20089 20090

Alternativamente, también puede usar %sysevalf() para evaluar los literales y convertirlos a números como este:

%let start = %sysevalf(''01Jan2015''d); %let end = %sysevalf(''02Jan2015''d); %emaildump(&start,&end);

Como señala Quentin en los comentarios a continuación ... la razón por la que esto ocurre es porque:

es una limitación del hecho de que la declaración %DO llama implícitamente %EVAL y %EVAL no puede manejar literales de fecha.