0

リモート サーバーに接続し、それにいくつかの変数を渡し、サーバー上でデータをクエリして操作するコード ブロックがあります。このコードは期待どおりに機能し、必要なデータを生成します。

ただし、マクロ ループでコードを実行する必要があります。ここですべてが崩壊します。問題が何であるかはわかりませんが、ある種の変数スコープの問題であると思われます。私はこれをオンラインで調査しようとしましたが、それを理解することはできません。

問題は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また、 、ipriceoprice、およびで同様のエラーが発生する場合があることにも注意してください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 &yend;

            (...)
            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;
(...)
4

2 に答える 2

1

コードは実行する必要があるように見えますが、同様のことを試してみましたが、同じ問題がありました。LET などのマクロ ステートメントがローカルで実行されるように、ローカル マクロを作成します。datastep ステートメントがリモート SAS によって実行されている間。解決策は、リモート セッションでマクロを定義することです。

以下でコンパイルされた where is マクロの効果を参照してください。

1) ローカル マクロ:

%macro local_macro;
    rsubmit;
        %put %sysget(COMPUTERNAME);
    endrsubmit;
%mend;

%local_macro

2) リモートマクロ

rsubmit;
    %macro remote_macro;
        %put %sysget(COMPUTERNAME);
    %mend;
endrsubmit;

rsubmit;
%remote_macro
;
endrsubmit;
于 2013-08-23T14:32:34.953 に答える