2016-04-10 18 views
1

データセット名はerror_tableです。すべての変数が文字条件に基づいて別のsasプログラムを実行するためのSAS条件ロジック

Errorno Error  Resolution 
001  login  check 
002  datacheck check 

ある私はErrorno001002にない場合sasプログラムを実行ロジックを望んでいました。それ以外の場合は実行を停止し、error_tableを表示します。

私はそれがエラーを投げている、以下の

%macro test(); 
    proc sql; 
     select trim(Error_No) into: num from error_table; 
    quit; 

    %if &num. not in ("001","002") %then %do; 
     %include "/path/dev/program.sas"; 
    %end; 
    %else %do; 
     proc print data = error_table; 
     run; 
    %end; 
%mend; 
%test; 

を試してみました。しかし。

誰でもロジックを修正してください。

+0

どのようなエラーが投げられますか? – Quentin

+1

あなたのロジックについて興味があります。つまり、error_tableにerrorno( "001" "002")以外のレコードがある場合は、プログラムを実行します。それ以外の場合はerror_tableを出力しますか? – Quentin

答えて

0

SELECTがゼロ行を返す場合に注意する必要があります。デフォルト値をマクロ変数NUMに設定する必要があります。

データセットの変数は数値か文字ですか? TRIM()関数の代わりにTRIMMEDまたはSEPARATED BY句を使用して、INTO句によって生成されたマクロ変数の空白を防止します。

%let num=NONE; 
select Error_No into: num trimmed from error_table; 

マクロプロセッサにすべてのものは、彼らが実際に価値の一部でない限り、あなたが一致しようとしている値の周りではないが、引用符を行う文字列であることを忘れないでください。また

%if NOT (&num. in (001,002)) %then %do; 

あなたがMINDELIMITERオプションを設定していることを確認する必要があり、マクロコードでIN演算子を使用します。

+0

あなたは「MINOPERATOR」を意味すると思います。また、 'in'演算子は'( '、') 'と'、 'を必要としません。 – fl0r3k

0

エラーコードのある移動条件をproc sqlにします。

proc sql; 
    select count(*) into :num_errors 
    from error_table 
    where Errorno in ("001", "002"); 
quit; 

次にmacrovariableにあなたが001または002あるエラーの数を持っています。 次のステップはマクロ条件をチェックすることです:

%if &num_errors. > 0 %then %do; 
    %include "/path/dev/program.sas"; 
%end; 
%else %do; 
    proc print data = error_table; 
    run; 
%end; 
%mend;