2017-11-03 16 views
0

ユーザー入力に基づいて、コードの特定のセクションをオンまたはオフに切り替えるプログラムを作成しようとしています。以下のコードは、prog1変数がYに設定されている場合にのみ実行する必要があります。しかし、私のログは、コードが何であっても実行されていることを示しています。誰が何が起こっているか知っていますか?SASでトグル・ステートメントを使用する

コード:

%let prog1 = Y; 
%let prog2 = N; 

data _null_; 
if "&prog1." = "Y" then do; 
    %findit(&file1.); 
    %findit(&file2); 
end; 
run; 

data _null_; 
if "prog2." = "Y" then do; 
    %findit(&file3.); 
end; 
run; 

ログイン:

Log file showing that the macro runs even when the prog variable is set to N

答えて

1

。マクロ参照とマクロコードが最初に評価されます。マクロが参照するSASコードは、SASによって処理されます。したがって、マクロが生成するSASコードを条件付きでスキップするDATAステップを作成しました。しかし、マクロ自体は常に実行されます。

開いたSASコードではなくマクロとしてメインプログラムをコーディングすると、%IFのようなマクロロジックを追加して条件付きでマクロ呼び出しを生成できます。

また、この簡単な例では、CALL EXECUTE()またはその他のコード生成メソッドを使用して、マクロ呼び出しの生成を制御できます。そうすれば、条件が偽の場合、SASは入力ストリーム内のマクロ呼び出しを決して見ることができません。

data _null_; 
    if "&prog1." = "Y" then do; 
    call execute('%nrstr(%findit)(&file1.)'); 
    call execute('%nrstr(%findit)(&file2.)'); 
    end; 
run; 
0

あなたはあなたのコード内のいくつかの間違いを持っ​​ています。 (データセットへのマクロ関数の使用、マクロ変数の呼び出しで&(ampercent)の悪用)。

1)マクロ変数 を呼び出す場合は、常に&(アペセント)を使用してください。2)&パスのようなポイントを追加してください。必要なときに、&パスマクロ変数の後に別の文字列またはマクロ変数があるかどうかを調べます。 3)%if、%then、ectでマクロ関数を使用してチェックを行うことをお勧めします。

あなたがそのような指向のプログラムは、よりマクロにする必要があります:あなたがすることを告げ何やっている

%let prog1 = Y; 
%let prog2 = Y; 

%macro check(); 

%if "&prog1." = "Y" %then %do; 
    %put execute 1; 
    %findit(&file1); 
    %findit(&file2); 
%end; 

%if "&prog2." = "Y" %then %do; 
    %put execute 2; 
    %findit(&file3); 
%end; 

%mend; 

%check; 

それが今で動作します、

よろしく、

+0

私はこれを試しましたが、%ifステートメントがオープンコードで無効であるというエラーが表示されました。別のマクロを作成して実行すると言っていますか? – theponcer

+0

はい、このソリューションでは、%checkという名前の新しいマクロ関数を作成する必要があります。それ以外の場合は、%if、%を使用することはできません。 – Thogerar

0

2番目のif文で「prog2」がチェックされています。 「& prog2」ではありません。あなたのログにはマクロ変数 "& prog3"があります。 & prog1の代わりに解決されたものです。および& prog2。

これをコードに追加すると、すべてのユーザーマクロ変数がログに出力されます。

%put _user_; 
関連する問題