2017-11-07 13 views
2

ファイル名をマクロに渡そうとしています。マクロは月に一度実行されるため、出力ファイルに月プレフィックスを格納しようとしています。現在のコードでは、毎月ファイル名を手動で入力する必要があります(Sep17_Sales、Oct17_Salesなど)。私はこれを自動化して、SASがデータファイルの前に月の名前を付けたファイルを生成するようにします。文字を動的にマクロに渡す

マクロ:

%macro sales (outdata = , dt =); 

現在のコード

%Sales(Outdata = Sep17_Sales, dt = '2017-09-01'); 
%Sales(Outdata =Oct17_Sales, dt ='2017-10-01'); 

私のアプローチ:

私は、パラメータを渡すためにしようとすると、それはエラーをスロー
data _null_; 
current_date = today(); 
current_month = intnx('month', current_date, 0, "Begginning"); 
Name = "_Sales"; 
Result = put(current_month, monyy7.) || name; 
run; 

%Sales(Outdata=Result, dt='2017-10-01'); 

。私は結果を%Let Resultに変更し、参照番号&Resultをマクロに渡そうとしましたが、失敗します。

これを解決する方法を教えてください。すべての助けてくれてありがとう!

+0

マクロで実際にDTパラメータの値に一重引用符が必要ですか?代わりに二重引用符を使用した場合は動作しますか? '%sales(outdata = Oct17_Sales、dt =" 2017-10-01 ");'これは生成する方がずっと簡単です。 – Tom

答えて

1

ここでは、Resultというデータステップ変数に値を割り当てています。 Resultという名前は、そのデータセットのコンテキスト外のものを意味するものではないため、マクロを呼び出すときにをに解決しません。代わりに、あなたの出力ファイルは "結果"と呼ばれるべきであることをあなたのマクロに伝えています。

あなたが効果的に「結果」と呼ばれるマクロ変数を作成しcall symput('Result',put(current_month, monyy7.) || name);、とあなたResult=ラインを交換することにより、そのようにのようなあなたの販売のマクロを呼び出すことを修正することができます: ``%売上高(OUTDATA = &結果、DT = '2017- 10-01 ');

OR、あなたはすべてのことを傷つけて、単にこのようなあなたのマクロを呼び出すことができます。

%sales(outdata=%sysfunc(today(),monyy7.)_Sales, dt='2017-10-01'); 

は、第二引数(dt)は常にフォーマットされた月の最初の日であることを意味すると仮定すると、さらに行きますyyyy-mm-ddとして単一引用符で囲まれた(その場合はが、私はマクロのパラメータとして指定するにはほとんど使用を参照)、通話をよりダイナミックにすることができます:

%sales(outdata=%sysfunc(today(),monyy7.)_Sales, dt=%str(%')%sysfunc(intnx(month,%sysfunc(today()),0,B),E8601DA.)%str(%')); 

その日付を二重引用符で囲むことができれば、少し簡略化することができます。

%sales(outdata=%sysfunc(today(),monyy7.)_Sales, dt="%sysfunc(intnx(month,%sysfunc(today()),0,B),E8601DA.)"); 
関連する問題