2016-04-22 9 views
1

特定の条件が満たされている場合、後でマクロで使用されるユーザー定義の形式を作成します。ただし、このユーザー形式は必ずしも作成されません。したがって、sasがマクロを呼び出すときに構文を検証すると、条件が満たされていないときにユーザー定義の形式がわからないため、エラーが発生します。ユーザー定義の形式を使用するステートメントは、満たされていないif条件でラップされますが、マクロはまだエラーです。sas形式は必ずしもマクロで作成されません。構文チェックに失敗します。

この問題を解決するためのアドバイスは非常に受け取りました。

+2

問題を示すサンプルマクロを追加することをお勧めします。これは、データステップIFまたはマクロ%IFのどちらを使用しているかを明確にします。その他の潜在的な問題や解決策についても説明します。 – Quentin

答えて

1

これを処理する良い方法の1つは、条件付き作成の前に、実際には何もしないダミーフォーマットを作成することです。そうすれば、あなたは何かエラーを防ぐことができます。

%macro fizz_buzz(format=0); 
*Format that does nothing; 
proc format; 
    value FIZZBUZZF 
    other=[best.] 
    ; 
quit; 

*Conditionally created same format; 
%if &format=1 %then %do; 
    proc format; 
    value FIZZBUZZF 
     3,6,9,12='FIZZ' 
     5,10='BUZZ' 
     15='FIZZBUZZ' 
     other=[2.] 
    ; 
    quit; 
%end; 

data _null_; 
    do _i = 1 to 15; 
    put _i fizzbuzzf.; 
    end; 
run; 
%mend fizz_buzz; 

%fizz_buzz(format=0); 
1

IFはどういう意味ですか? SASは、実行を開始する前にDATAステップの構文をチェックします。したがって、IFまたは同様の実行タイムコードを使用して、データステップの書式設定の参照を防ぐことはできません。 IF文の条件が決して真ではない場合でも、このコードはエラーを生成します。

data bad; 
    if 0=1 then format x $1XYZ.; 
run; 

フォーマットへの参照は、マクロは、あなたが任意のエラーを持っていないはず作成SASコードで生成されることはありませんように、あなたがマクロ%IF文を使用している場合。したがって、マクロによって同様のデータステップが生成され、%IFを使用してマクロが無効なフォーマット名を生成しないようにすると、コードはエラーなく実行されます。

マクロ変数を使用してフォーマット名を保持し、フォーマットが作成されていない場合は空にすることが最も一般的です。

data good; 
    format x &format_name ; 
run; 
関連する問題