2017-03-09 3 views
0

にマクロに変数を介して値を渡すかは、ここに私のコードはどのように私は、SAS

%macro redemptions1(startdate, enddate, sd, ed, sunday1, sunday2); 
data _null_; 
%put &startdate; 
run; 

%mend redemptions1; 
data _null_; 
format tday date9.; 
format sd date9.; 
format ed date9.; 
tday=today(); 
if weekday(tday) = 1 then do; ed = intnx('day',tday,-9); sd = intnx('day',tday,-15);end; 
if weekday(tday) = 2 then do; ed = intnx('day',tday,-3); sd = intnx('day',tday,-9);end; 
if weekday(tday) = 3 then do; ed = intnx('day',tday,-4); sd = intnx('day',tday,-10);end; 
if weekday(tday) = 4 then do; ed = intnx('day',tday,-5); sd = intnx('day',tday,-11);end; 
if weekday(tday) = 5 then do; ed = intnx('day',tday,-6); sd = intnx('day',tday,-12);end; 
if weekday(tday) = 6 then do; ed = intnx('day',tday,-7); sd = intnx('day',tday,-13);end; 
if weekday(tday) = 7 then do; ed = intnx('day',tday,-8); sd = intnx('day',tday,-14);end; 
startdate = (year(sd) - 1900) * 10000 + month(sd) * 100 + day(sd); 
enddate = (year(ed) - 1900) * 10000 + month(ed) * 100 + day(ed); 
sunday1 = year(intnx('day',sd,-6))*10000+month(intnx('day',sd,-6))*100+day(intnx('day',sd,-6)); 
sunday2 = year(intnx('day',sd,1))*10000+month(intnx('day',sd,1))*100+day(intnx('day',sd,1)); 
%redemptions1(startdate,enddate,sd,ed,sunday1,sunday2); 
run; 

で終了日など、redemeptions1マクロちょうど版画「STARTDATE」の代わりに実際に印刷startdateの値変数に含まれる値を印刷するにはどうすればよいですか?

ありがとうございます!

答えて

0

マクロへの呼び出しをテキスト文字列として構築し、CALL EXECUTEまたはDOSUBL関数を使用してSASに実行させる必要があります。

マクロ呼び出しのパラメータは、必要な値を与えるリテラルテキストである必要があります。データステップでの呼び出しは%redemptions1(startdate,...で始まり、最初のパラメータはリテラルテキストstartdateで、これがマクロの印刷内容です。代わりに、あなたが何かを行うことができます: - %redemptions1(09MAR2017)のようなもの -

myCall = '%redemptions1(' || startdate || ')'; 
call execute(myCall); 

をこれが必要なコールを構築し、それを実行します。もちろん、1行でこれを行うことができます:

call execute('%redemptions1(' || startdate || ')'); 

もちろん、他のパラメータの値を入力する必要があります。

あなたの日付計算は少しばかりかかります。ちなみに、startdateenddateには、あなたが思うような値が入っていないかもしれません。その可能性があるかどうか確認するには、dhms関数を参照してください。今日の日付は「1170309」のような数字を作成しています(100万、170万、300、および9)。年の値は非常に奇妙です。本当に117(2017-1900)が必要ですか? SASにその値を日付として扱うように依頼すると、それは将来の日付方法である01JAN1960からの日数として扱われます。

+0

あなたのお返事ありがとうございます。私は上記のアプローチを試して、それは変数が初期化されていないと言います。私はマクロを使ってcallを実行してstartdateを実行しようとしましたが、 "変数が初期化されていません"というエラーが表示されました。 W.r.tの日付、はい私はデータセットがそれを要求するので、その特定のフォーマットを探しています。 – bhavya

+0

「変数は初期化されていません」とは何ですか? CALL EXECUTEがデータステップの一部であることを確認してください。つまり、最後の実行前です。マクロでは、 'data _null_;'を削除できます。と '実行; '%put 'ステートメントはそのままにしておきますが、他のメッセージは期待しません。 CALL EXECUTEの2行バージョンを試して、 'put myCall =;'を追加してください。何が実行されているかを確認するための行。オプションの設定MPRINT SYMBOLGENは、問題の診断にも役立ちます。 –

+0

Chrisさん、ありがとうございました。 – bhavya