リモート サーバーに接続し、それにいくつかの変数を渡し、サーバー上でデータをクエリして操作するコード ブロックがあります。このコードは期待どおりに機能し、必要なデータを生成します。
ただし、マクロ ループでコードを実行する必要があります。ここですべてが崩壊します。問題が何であるかはわかりませんが、ある種の変数スコープの問題であると思われます。私はこれをオンラインで調査しようとしましたが、それを理解することはできません。
問題はdata xtemp2
ブロックで発生します。これを実行しようとすると、次のエラーが発生します。
WARNING: Apparent symbolic reference INTERVAL_SECONDS not resolved.
ERROR 22-322: Syntax error, expecting one of the following: a name,
a quoted string, a numeric constant, a datetime constant,
a missing value, INPUT, PUT.
と
WARNING: Apparent symbolic reference START_TIME not resolved.
ERROR 22-322: Syntax error, expecting one of the following: a name,
a quoted string, a numeric constant, a datetime constant,
a missing value, INPUT, PUT.
rtime
また、 、iprice
、oprice
、およびで同様のエラーが発生する場合があることにも注意してくださいitime
。繰り返しますが、このコードは、単独で実行すると完全に機能します。ループでマクロに入れると、これらの問題が発生するようで、これらの変数を適切に初期化していないと思います。あなたが提供できる洞察とヒントを本当に感謝します。
%macro getthedata(nrows,ystart,yend); *nrows is the number of rows in the text file;
%do i=1 %to &nrows;
%do m=&ystart %to ¥d;
(...)
signon username=_prompt_;
%syslput VAR1 = &var1;
%syslput M = &m;
rsubmit;
libname abc'/data/sasdata'; *Thisis where the datasets are located;
%let start_time = '9:30:00't; * starting time;
%let interval_seconds =15*60; * interval is 15*60 seconds, 15min;
data all2009;
set sas.a_&M.01:;
by symbol date time;
where symbol = &VAR1 and time between '9:30:00't and '16:00:00't;
run;
data xtemp2;
set all2009;
by symbol date time;
format itime rtime time12.;
if first.symbol=1 or first.date=1 then do;
*Initialize time and price when new symbol or date starts;
rtime=time;
iprice=bid;
oprice=ofr;
itime=&start_time;
end;
if time >= itime then do; *Intervalreached;
output; *rtime and iprice hold the last observation values;
itime = itime +&interval_seconds;
do while(time >= itime); *need to fill in alltime intervals;
output;
itime = itime +&interval_seconds;
end;
end;
rtime=time;
iprice=bid;
oprice=ofr;
retain itime rtime iprice oprice; *Carry time and price valuesforward;
*keep symbol date itime iprice rtime;
run;
proc download data=all2009 out=local.all30 (keep=SYMBOL DATE PRICE SIZE itime);
run;
endrsubmit;
(...)
%end;
%end;
%mend getthedata;
Options MPRINT;
%getthedata(3,2007,2007)
解決策(ジョーの回答による)
Joe が投稿したソリューションを使用して、変数interval_seconds
と変数を正常に作成できました。start_time
%NRSTR
関連する変更されたコードセクションは次のとおりです。
(...)
signon username=_prompt_;
%syslput VAR1 = &var1;
%syslput M = &m;
rsubmit;
libname abc'/data/sasdata'; *Thisis where the datasets are located;
%nrstr(%%)let start_time = '9:30:00't; * CHANGED LINE;
%nrstr(%%)let interval_seconds =15*60; * CHANGED LINE;
data all2009;
set sas.a_&M.01:;
by symbol date time;
where symbol = &VAR1 and time between '9:30:00't and '16:00:00't;
run;
(...)