2016-12-26 8 views
0

試みています - > &のvarnumが0より小さい場合varnumが0より大きい場合に変数がDSに存在しないことを意味します。しかし、エラーは、varnumステートメントで複数の引数が発生します。どのように単一のステートメントをチェックするコード&は、これらの変数を持っているvarsマクロ変数BRTHDTC DMDTC RFENDTC RFSTDTCはdsにあるかどうか.. ..?varnumの複数引数でエラーが発生しました

%macro drpchk (lib,dsn); 
%local dsid result; 
proc sql noprint; 
    select distinct catx(".",libname,memname), name 
    into :DS separated by " ", :vars separated by " " 
    from dictionary.columns 
    where libname = upcase("&lib") and format=('YYMMDD10.'); 
quit; 

data &dsn(keep=&vars); 
set &DS; 
run; 
    %let dsid=%SYSFUNC(open(&dsn)); 
    %IF %SYSFUNC(varnum(&dsid,&vars)) < 0 %THEN %DO; 
result=pass; 
else result=fail; 
end; 
run; 
%mend; 
%drp_chk(dtelib,dte); 
+0

データステップでマクロロジックを使用しないでください。ここでは、マクロとデータステップロジックが混在しています。 – Reeza

+0

それはそれを行う方法ではありません。 Varnumは決して正しく解決されず、一度にそれを行う機能はありません。これは意味をなさない。 DICTIONARYテーブルから直接サマリーを作成しないでください。データセットを操作する必要はありません。 – Reeza

+0

特定の変数が存在するかどうかをチェックした結果をどのように表現したいですか?それらのすべてが存在するか、その間に存在するものよりも存在する必要がありますか? – Tom

答えて

0

私はこのプロセスの目的が何であるか分かりませんが、マクロが何をしているのかを単純化するのに役立ちます。入力データセットと変数名のリストを取得し、そのデータセットで見つかった変数のリストを返すマクロを作成しましょう。

%macro drpchk(dsn,varlist,mvar=droplist); 
%local lib qlist ; 
%if not %symexist(&mvar) %then %global &mvar ; 
%if %index(&dsn,.) %then %let lib=%upcase(%scan(&dsn,1,.)); 
%else %let lib=WORK ; 
%let dsn=%upcase(%scan(&dsn,-1,.)); 
%let qlist="%sysfunc(tranwrd(%sysfunc(compbl(%upcase(&varlist))),%str()," "))"; 
%let &mvar=; 
proc sql noprint; 
    select name 
    into :&mvar separated by ' ' 
    from dictionary.columns 
    where libname = "&lib" 
    and memname= "&dsn" 
    and upcase(name) in (&qlist) 
    ; 
quit; 
%mend; 

次に、このリストを使用してdrop文を生成できます。

data test; 
    length SUBJID $10 BRTHDTC DMDTC RFENDTC RFSTDTC 8; 
run; 

%drpchk(test,BRTHDTC DMDTC RFENDTC RFSTDTC); 
data want ; 
    set test; 
    drop &droplist; 
run; 
0

ここでは、変数を含むデータセットのリストを生成するための少しの方法があります。このプログラムは、すべての変数を調べ、選択リストに制限し、コメントを介して変更するコード行を見ます。

方法は似ていますが、マクロはありません。

/*Generate fake data to work with*/ 
data class1; 
    set sashelp.class; 
    drop age sex; 
run; 

data class2; 
    set sashelp.class; 
    drop weight height; 
run; 

data class3; 
    set sashelp.class; 
    Order=1; 
run; 

data class4; 
    set sashelp.class; 
    keep name; 
run; 

data class5; 
    set sashelp.class; 
run; 

/*Extract metadata from dictionary tables*/ 
proc sql noprint; 
    create table column_list as select memname, libname, name, type, 1 as count 
     from dictionary.columns where libname='WORK' and memname like 'CLASS%' 
     /*ADD THE VARIABLE LIST HERE*/ 
     order by memname, name; 
quit; 

/*Transpose results to a more user friendly format*/ 
proc transpose data=column_list out=flipped; 
    by memname; 
    id name; 
    idlabel name; 
    var count; 
run; 

/*Format output*/ 
data want; 
    retain memname; 
    set flipped; 
    array class(*) _NUMERIC_; 

    do i=1 to dim(class); 

     if class(i)=. then 
      class(i)=0; 
    end; 
    All_Variables=sum(of _numeric_)-I; 
    DROP I _NAME_; 
run; 
関連する問題