2016-11-16 20 views
1

自分のプログラムで同じ定数変数を何度も再利用するので、マクロ内でそれらをすべて宣言し、そのマクロを自分の関数として呼び出す必要がありました。SASのマクロで使用する複数の変数を宣言しますか?

私はこれにRUN_マクロを変更した場合

%macro vars(); 
    %let trans_1 = ever_30_ct; 
    %let trans_2 = ever_60_ct; 
%mend vars; 

%macro run_(); 
    %vars(); 
    proc sql; 
    select &trans_1 from va_purchase_fico_cts; 
    run; 
%mend run_; 

%run_(); 

は、しかし、それはもう動作しません動作します。このような例があります。

%macro run_(); 
    %vars(); 
    proc sql; 
    select &trans_1 , &trans_2 from va_purchase_fico_cts; 
    run; 
%mend run_; 

& trans_2は解決できません。誰も私がこれをすることができない理由を理解していますか?

答えて

2

マクロ変数スコープ。それはどちらの時間にも働くべきではありません。ほとんどの場合、ある時点でテストで変数trans_1が宣言されている可能性があります。

基本的に、マクロは、マクロが終了するともはや存在しないローカルマクロ変数を作成しています。それらをグローバルマクロ変数として宣言すれば、それらをマクロの外で使用することができます。

%macro vars(); 
    %global trans_1; 
    %global trans_2; 
    %let trans_1 = ever_30_ct; 
    %let trans_2 = ever_60_ct; 
%mend vars; 
+0

パーフェクト。ありがとう。 –

1

%globalが最も簡単な解決策です。

私は複数のプロジェクトを同時に処理しているので、グローバル変数を避けようとしています。私は、私が取り組んでいるプロジェクトごとにエントリーポイントマクロを書くことを好みます。それから私はそこから他のマクロを呼び出します。これにより、そのエントリポイントに必要な数だけ、%localの変数を宣言できます。これらの変数は、タスクが完了すると消えます。以下のように:あなたは、パラメトリックな方法で変数を初期化する必要がある場合は

%macro wrap_foo/des='Entry point for task foo'; 
    %local _trans1 _trans2; 
    %foo; 
%mend; 

、あなたは変数の名前を使用するマクロを作成することができます。私はしばしばカスタムログメッセージを作成するためにこれを使います:

%macro init_constants(varname1, varname2, project) 
/des='Parameterized constant initializer.'; 
    %let &varname1 = &project.1; 
    %let &varname2 = &project.2; 
%mend; 

%macro foo/des='Actual task foo'; 
    %init_constants(_trans1, _trans2, bar); 
    %put &=_trans1 &=_trans2; 
%mend; 

%wrap_foo; 
関連する問題