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.