Bonjour, j'essaie d'appliquer l'option DeclareMacros de SAS Submit. Il est supposé permettre le transfert de valeurs de variable vers des macros dans un travail SAS. J'ai fait cette petite coupe (elle fonctionnera bien, mais elle échoue):
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));
Le journal SAS indique:
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.
et le test de jeu de données contient:

Je ne vois pas ce que je fais mal.
Meilleures salutations
Poul Ravn Sørensen
Vous utilisez les variables macro de manière incorrecte.
Si vous souhaitez les utiliser du côté droit d'une affectation dans l'étape de données, vous devez les citer.
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));
Vérifier Utilisation de variables macro pour plus d'informations.
Bonjour, ce que Jeff a suggéré fonctionne. Merci.
Je suis toujours aux prises avec des variables datetime. Voir le code. La question est: Comment puis-je obtenir d_num la valeur de la variable datetime? (Réarrangez un peu mais c'est toujours le même code, seule la chaîne d'envoi est construite avant l'instruction 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));
Cordialement Poul RS
Traiter avec les variables macro SAS et leur résolution peut être source de confusion, en particulier lorsqu'il s'agit de citer des variables macro qui contiennent des guillemets. Il y a toute une section de la documentation SAS sur Macro Citation .
Permettez-moi de commencer en disant que j'en connais assez sur ce sujet pour que vous puissiez commencer et vous donner quelque chose qui fonctionne, mais pas assez pour expliquer tous les détails. Vous devriez probablement commencer à fréquenter le Programmation SAS conseil dans le Communautés de support SAS pour obtenir une explication plus approfondie et un sous-entendu.
Il serait préférable que vous déterminiez ce dont vous avez besoin dans SAS uniquement, puis comment faire en sorte que JSL transmette ces informations à SAS.
Voici la syntaxe SAS de ce que vous essayez de faire.
%let a = test1;
%let b = test2;
%let c = '15may2019 00:00'dt;
data test;
x = "&a";
y = "&b";
d = &c;
run;
proc print; run;
Notez que & a et & b doivent être entre guillemets (les variables de macro ne résolvent que entre guillemets) car vous souhaitez utiliser leurs valeurs en tant que littéraux de chaîne et qu'elles ne comportent pas de guillemets.
D'autre part, vous avez mis votre valeur datetime en tant que constante datetime avec des guillemets simples et le dt pour indiquer qu'il s'agit d'une constante datetime. Étant donné que cette macro-valeur contient déjà des guillemets simples, vous n'avez pas besoin de la mettre entre guillemets à droite d'une affectation.
Jusqu'ici, tout va bien, mais il y a une ride. Pour obtenir la valeur de vos variables JSL en variables de macro, JMP utilise le % NRBQUOTE fonction pour les définir. Si vous consultez le journal SAS d'un SAS Submit (..., déclarez des macros (...)), vous verrez ce qui suit:
103 %let a=%NRBQUOTE(test1);
104 %let b=%NRBQUOTE(test2);
105 %let c=%NRBQUOTE('15may2019 00:00'dt);
JMP ne sait pas si votre variable JSL contient l’un des caractères spéciaux ( '"() + - * / <> = ¬ ^ ~;, # vierge ET OUI PAS EQ NE LLE GE GT IN ) qui doivent être masqués dans SAS.
Si nous faisons la même chose dans SAS et soumettons ce code:
%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;
nous verrons cela dans le journal 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.
[C’est le point où ma compréhension s’effondre. Je peux vous dire quoi vous devez faire pour utiliser une variable macro avec des caractères masqués mais pas plus sur Pourquoi vous devez faire ça. Encore une fois, dirigez-vous vers le Programmation SAS conseil pour obtenir plus d'informations.]
Ainsi, la variable macro SAS étant définie par JMP à l'aide de la fonction% NRBQUOTE, et comme nous ne voulons pas que les guillemets simples soient masqués, nous devons utiliser la fonction% UNQUOTE pour les obtenir.
Donc, en JSL, cela ressemble à ceci:
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 ) );
D’autres voudront peut-être savoir ce que vous en apprendrez davantage sur cette question lors de votre exploration et de votre utilisation du logiciel. Communautés de support SAS . Alors, postez tous les liens vers les discussions que vous trouvez utiles.
Merci d’avoir expliqué et fourni une solution alternative en utilisant «Eval Insert» de JSL. Je pense qu’il suffira d’utiliser cette dernière solution car tout ce que je veux, c’est transférer quelques choix d’utilisateurs dans le code SAS. Et, l'appel DeclareMacros n'est pas du tout nécessaire. Cela fonctionne sans cela.
Meilleures salutations
Poul Ravn Sørensen
Je dois également souligner que les exemples que vous avez publiés ne nécessitent pas vraiment la puissance des variables macro du côté SAS. Plutôt, en utilisant Eval Insert () Construire votre SAS_sbmt_str peut être utile si votre cas réel est aussi 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 ) );