Opción DeclareMacros de SAS Enviar: ¿No se transfiere correctamente?Hola, estoy tratando de aplicar la opción DeclareMacros de SAS Submit. Se supone que permite la transferencia de valores variables a macros en trabajos SAS. Hice este pequeño recorte (se ejecutará aunque, pero falla):
a = "test1";
b = "test2";
Meta Connect( "sas.radiometer.dk", 8561, "", ProfileLookup );
_importsasconn = SAS Connect( "SASApp" );
SAS Submit("
data test;
x = &a;
y = &b;
run;
",
declaremacros(a,b),GetSASLog(true));
El registro SAS dice:
768 %let a=%NRBQUOTE(test1);
769 %let b=%NRBQUOTE(test2);
770
771 data test;
772 x = &a;
773 y = &b;
774 run;
NOTE: Variable test1 is uninitialized.
NOTE: Variable test2 is uninitialized.
NOTE: The data set WORK.TEST has 1 observations and 4 variables.
y la prueba de conjunto de datos contiene:

No veo lo que estoy haciendo mal.
Atentamente
Poul Ravn Sørensen
Re: DeclareMacros opción de SAS Enviar: ¿No se transfiere correctamente?Estás utilizando las variables de macro incorrectamente.
Si desea utilizarlos en el lado derecho de una asignación en el paso de datos, deberá citarlos.
a = "test1";
b = "test2";
Meta Connect( "sas.radiometer.dk", 8561, "", ProfileLookup );
_importsasconn = SAS Connect( "SASApp" );
SAS Submit("
data test;
x = \!"&a\!";
y = \!"&b\!";
run;
proc print;
run;
",
declaremacros(a,b),GetSASLog(true));
Comprobar Uso de variables macro para más información.
Re: DeclareMacros opción de SAS Enviar: ¿No se transfiere correctamente?Hola de nuevo, lo que sugirió Jeff funciona. Gracias.
Todavía estoy luchando con las variables de fecha y hora. Ver codigo La pregunta es: ¿Cómo se asigna a d_num el valor de la variable datetime? (Reorganice un poco, pero sigue siendo el mismo código, solo la cadena de envío se crea antes de la declaración de SAS).
a = "test1";
b = "test2";
c = "'15may2019 00:00'dt";
Meta Connect( "sas.radiometer.dk", 8561, "", ProfileLookup );
_importsasconn = SAS Connect( "SASApp" );
SAS_sbmt_str =
"data test;
x = \!"&a\!";
y = \!"&b\!";
d = \!"&c\!";
d_num = ???;
run;
proc print; run;";
SAS Submit(SAS_sbmt_str, declaremacros(a,b,c),GetSASLog(true));
Saludos cordiales Poul RS
Re: DeclareMacros opción de SAS Enviar: ¿No se transfiere correctamente?Tratar con las variables de macro de SAS y su resolución puede ser confuso, especialmente cuando se trata de citar variables de macro que tienen comillas. Hay una sección completa de la documentación de SAS en Macro cotización .
Permítanme comenzar diciendo que sé lo suficiente sobre este tema para que comience y le dé algo que funciona, pero no lo suficiente como para explicar todos los detalles. Probablemente debería comenzar a frecuentar el Programación SAS tablero en el Comunidades de Soporte SAS Para obtener una explicación más completa y comprensión.
Sería mejor para ti descubrir lo que necesitas solo en SAS y luego descubrir cómo hacer que JSL lo transmita a SAS.
Aquí está la sintaxis de SAS para lo que estás tratando de hacer.
%let a = test1;
%let b = test2;
%let c = '15may2019 00:00'dt;
data test;
x = "&a";
y = "&b";
d = &c;
run;
proc print; run;
Tenga en cuenta que & a y & b deben estar entre comillas dobles (las variables de macro solo se resuelven entre comillas dobles) porque desea usar sus valores como literales de cadena y no tienen comillas en sus valores.
Por otro lado, ha puesto su valor de fecha y hora como una constante de fecha y hora con comillas simples y la dt para indicar que es una constante de fecha y hora. Dado que ese valor de macro ya tiene comillas simples, no es necesario que lo ponga entre comillas en el lado derecho de una tarea.
Hasta ahora, todo bien, pero hay una arruga. Para obtener el valor de sus variables JSL en variables macro, JMP usa el % NRBQUOTE Función para definirlos. Si observa el registro de SAS desde un envío de SAS (..., Declarar macros (...)) verá que:
103 %let a=%NRBQUOTE(test1);
104 %let b=%NRBQUOTE(test2);
105 %let c=%NRBQUOTE('15may2019 00:00'dt);
Esto se debe a que JMP no sabe si su variable JSL contiene alguno de los caracteres especiales ( '"() + - * / <> = ¬ ^ ~;, # en blanco Y O NO EQ NE LE LT GE GT IN ) que necesitan ser enmascarados en SAS.
Si hacemos lo mismo en SAS y enviamos este código:
%let a=%NRBQUOTE(test1);
%let b=%NRBQUOTE(test2);
%let c=%NRBQUOTE('15may2019 00:00'dt);
data test;
x = "&a";
y = "&b";
d = &c;
run;
proc print; run;
Veremos esto en el registro de SAS:
150 %let a=%NRBQUOTE(test1);
151 %let b=%NRBQUOTE(test2);
152 %let c=%NRBQUOTE('15may2019 00:00'dt);
153
154 data test;
155 x = "&a";
156 y = "&b";
157 d = &c;
NOTE: Line generated by the macro variable "C".
157 '15may2019 00:00'dt
_
386
_
76
ERROR 386-185: Expecting an arithmetic expression.
ERROR 76-322: Syntax error, statement will be ignored.
158 run;
NOTE: The SAS System stopped processing this step because of errors.
[Este es el punto donde mi comprensión se rompe. te puedo decir qué tienes que hacer para usar una variable de macro con caracteres enmascarados pero no más sobre por qué Necesitas hacer eso. Una vez más, dirígete a la Programación SAS junta para obtener más información.]
Entonces, debido a que la variable de macro SAS está definida por JMP usando la función% NRBQUOTE, y debido a que no queremos las comillas simples enmascaradas, necesitamos usar la función% UNQUOTE para obtenerlas.
Entonces, en JSL se ve así:
a = "test1";
b = "test2";
c = "'15may2019 00:00'dt";
SAS_sbmt_str =
"data test;
x = \!"&a\!";
y = \!"&b\!";
d = %UNQUOTE(&c);
run;
proc print; run;";
SAS Submit( SAS_sbmt_str, declaremacros( a, b, c ), GetSASLog( true ) );
Otros pueden querer saber qué más aprenden sobre este tema en su exploración y uso de la Comunidades de Soporte SAS . Por lo tanto, publique los enlaces a los hilos de discusión que encuentre útiles.
Re: DeclareMacros opción de SAS Enviar: ¿No se transfiere correctamente?Gracias por explicar y proporcionar una solución alternativa, utilizando 'Eval Insert' de JSL. Creo que para mi propósito será suficiente usar la última solución, ya que todo lo que quiero lograr es transferir algunas opciones de usuario al Código SAS. Y, uno no necesita la llamada DeclareMacros en absoluto. Funciona sin eso.
Atentamente
Poul Ravn Sørensen
Re: DeclareMacros opción de SAS Enviar: ¿No se transfiere correctamente?También debo señalar que los ejemplos que ha publicado realmente no necesitan el poder de las variables macro en el lado de SAS. Más bien, utilizando Eval Insert () para construir su SAS_sbmt_str puede ser útil si su caso real es igualmente simple.
a = "test1";
b = "test2";
c = "'15may2019 00:00'dt";
SAS_sbmt_str = Eval Insert( "data test;
x = '^a^';
y = '^b^';
d = ^c^;
run;
proc print; run;" );
SAS Submit( SAS_sbmt_str, GetSASLog( true ) );