はSAS

2017-12-19 10 views
1

である私は、リストから複数の値を受け入れ、私の格納されたプロセスに送るという名前_IDのパラメータをした、ことができますはSAS

_ID0 = 4 
_ID1 = 1 
_ID2 = 2 
_ID3 = 3 
_ID4 = 4 
_ID_COUNT = 4 

私が受けたよ、私はのように私の店の過程でそれらを受けるだろう、私はそれに4つの値(1,2,3,4)を送ってきたと言うと、以下のようにそれらをフィルタリング。

%let ID = "&_ID"; 
%let Count = "&_ID_COUNT"; 

%macro IDs; 
%global _ID0; 

/* If more than one ID value was selected then cycle through the values */ 
    %if %eval(&_ID0 ge 2) %then %do; 
      %do i=1 %to &_ID0; 
      &&_ID&i 
      %end; 
    %end; 

/* If only one ID value was selected */ 
    %else &_ID 
%mend; 

****************************; 

%macro filter; 

%if &Count ne "0" %then %do; 

%stpbegin; 
    proc sql noprint; 
    create table users as 
    select * 
    from work.users 
    where id in(%IDs); 
    run; 
%stpend; 

%end; 

%mend; %filter; 

1以上のログにエラーがそこに私のコードですが、それが何をフィルタリングしていないではありません。ユーザテーブルは、IDの値1-10を持っている場合は、列のユーザーは、私が間違って何を知らない私は

user 
id 
    1 
    2 
    3 
    4 

をしたいだけ1,2,3,4-

user 
id 
    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 

フィルタの後に更新する必要がありますし、私はよりよいアプローチを見逃しましたか?

+0

ID変数が数値か確認してください。 – Tom

+0

私のレポートでは文字/文字列である – Azeem112

+0

ログファイルにエラーはありませんが、Weboutファイルのいずれのフィルタデータも表示されません – Azeem112

答えて

1

コードが正しく動作するはずです。 %IDSマクロはより簡潔になり、カウントが2未満のときにマクロ変数がどのように作成されるかの不一致に対処するためにより多くのロジックが必要になる可能性があります。このマクロでは、0および1変数に値が設定されますマクロが実行されています)。あなたの例のデータに基づいて

%macro IDs; 
%local i ; 
%let _id0 = &_id_count ; 
%if &_id0 = 1 %then %let _id1 = &_id ; 
%if &_id0 = 0 %then -99999 ; 
%do i=1 %to &_id0; 
&&_ID&i 
%end; 
%mend IDs; 

それは次のように動作するはずです:

1071 %put (%ids); 
(1 2 3 4) 

あなたは、彼らがどんな値を選択しない場合、放出したいです何値はありますか?私はこの例を-9999を生成するように設定しましたが、あなたの他のマクロはその場合には呼び出しをスキップしていて、問題ではないはずです。

+0

ユーザーが値を選択しなかった場合、フィルターは実行されません – Azeem112

+0

はい、コードは絶対に機能しますが、ユーザーがデータを10,5,8,2,3などとして送信するとどうなりますか? – Azeem112

+0

'%filter'が実行されますが、'&_id0 = 0'の場合は 'COUNT'を' '0" 'に設定し、' PROC SQL'や '%IDS'を呼び出さないでしょう。しかし、%IDSマクロを独立したユーティリティマクロとして作成したので、 '&id0 = 0'が呼び出されたときに何を生成したいのですか? – Tom