Opzione DeclareMacros di SAS Submit: trasferimento non riuscito correttamente?Ciao, sto provando ad applicare l'opzione DeclareMacros di SAS Submit. Si suppone che consenta il trasferimento di valori variabili alle macro nel lavoro SAS. Ho fatto questo piccolo snip (funzionerà comunque, ma fallendo):
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));
Il log 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.
e il test del set di dati contiene:

Non riesco a vedere, cosa sto facendo male.
I migliori saluti
Poul Ravn Sørensen
Opzione Re: DeclareMacros di SAS Submit: trasferimento non riuscito correttamente?Stai utilizzando le variabili macro in modo errato.
Se si desidera utilizzarli sul lato destro di un compito nel passaggio dei dati, è necessario citarli.
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));
Dai un'occhiata Utilizzo delle variabili macro per maggiori informazioni.
Opzione Re: DeclareMacros di SAS Submit: trasferimento non riuscito correttamente?Ciao di nuovo, quello che Jeff ha suggerito funziona. Grazie.
Sono ancora alle prese con variabili datetime. Vedi il codice La domanda è: come posso ottenere d_num assegnato il valore della variabile datetime? (Rearragend un bit ma è sempre lo stesso codice, solo la stringa di invio è costruita prima dell'istruzione SAS Submit.)
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));
Cordiali saluti Poul RS
Opzione Re: DeclareMacros di SAS Submit: trasferimento non riuscito correttamente?Trattare le variabili Macro SAS e la loro risoluzione può essere fonte di confusione, specialmente quando si tratta di quotare variabili macro che contengono citazioni. C'è un'intera sezione della documentazione SAS su Citazioni macro .
Permettetemi di iniziare dicendo che ne so abbastanza su questo argomento per iniziare e darvi qualcosa che funzioni, ma non abbastanza da spiegare tutti i dettagli. Probabilmente dovresti iniziare a frequentare il Programmazione SAS bordo nel Comunità di supporto SAS per ottenere una spiegazione e un approfondimento più approfonditi.
Sarebbe meglio per te capire che cosa hai bisogno in SAS da solo e poi capire come far passare JSL a SAS.
Ecco la sintassi SAS per ciò che stai cercando di fare.
%let a = test1;
%let b = test2;
%let c = '15may2019 00:00'dt;
data test;
x = "&a";
y = "&b";
d = &c;
run;
proc print; run;
Nota che & a e & b devono essere tra virgolette (le variabili macro si risolvono solo tra virgolette) perché vuoi usare i loro valori come stringhe letterali e non hanno virgolette nei loro valori.
D'altra parte, hai inserito il tuo valore datetime come costante datetime con virgolette singole e dt per indicare che è una costante datetime. Dato che quel valore macro ha già delle virgolette singole, non è necessario inserirlo tra virgolette sul lato destro di un compito.
Fin qui, tutto bene, ma c'è una grinza. Per ottenere il valore delle tue variabili JSL in variabili macro, JMP usa il % NRBQUOTE funzione per definirli. Se guardi il log SAS da un SAS Submit (..., Declare Macros (...)) vedrai che:
103 %let a=%NRBQUOTE(test1);
104 %let b=%NRBQUOTE(test2);
105 %let c=%NRBQUOTE('15may2019 00:00'dt);
Questo perché JMP non sa se la tua variabile JSL contiene uno dei caratteri speciali ( '"() + - * / <> = ¬ ^ ~;, # blank E O NOT EQ NE LE LT GE GT IN ) che devono essere mascherati in SAS.
Se facciamo la stessa cosa in SAS e inviamo questo codice:
%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;
lo vedremo nel log 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.
[Questo è il punto in cui la mia comprensione si rompe. posso dirti che cosa devi fare per usare una variabile macro con caratteri mascherati ma non di più perché hai bisogno di farlo. Di nuovo, vai al Programmazione SAS consiglio per ottenere maggiori informazioni.]
Quindi, poiché la variabile macro SAS è definita da JMP utilizzando la funzione% NRBQUOTE e, poiché non vogliamo che le virgolette singole vengano mascherate, è necessario utilizzare la funzione% UNQUOTE per ottenerle.
Quindi, in JSL sembra questo:
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 ) );
Altri potrebbero voler sapere cos'altro si impara su questo problema nella tua esplorazione e uso del Comunità di supporto SAS . Quindi, pubblica tutti i link ai thread di discussione che trovi utili.
Opzione Re: DeclareMacros di SAS Submit: trasferimento non riuscito correttamente?Grazie per aver spiegato e fornito una soluzione alternativa, utilizzando "Eval Insert" di JSL. Penso che per il mio scopo sarà sufficiente utilizzare quest'ultima soluzione, poiché tutto ciò che voglio realizzare è trasferire alcune scelte utente sul codice SAS. E, uno non ha bisogno della chiamata DeclareMacros affatto. Funziona senza quello.
I migliori saluti
Poul Ravn Sørensen
Opzione Re: DeclareMacros di SAS Submit: trasferimento non riuscito correttamente?Dovrei anche sottolineare che gli esempi che hai pubblicato non hanno realmente bisogno della potenza delle variabili macro sul lato SAS. Piuttosto, usando Eval Insert () costruire il tuo SAS_sbmt_str può essere utile se il tuo caso reale è similmente semplice.
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 ) );