/*
/ Program : alluniq.sas
/ Version : 1.0
/ Author : Roland Rashleigh-Berry
/ Date : 31-Jul-2007
/ Purpose : To create a dataset with all unique occurences of a variable
/ throughout a library.
/ SubMacros : %hasvars
/ Notes : The output dataset will be in sorted order if valid
/ Usage : %alluniq(in,subject,allsubj)
/
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ libref (pos) Libref
/ variable (pos) Variable name
/ dsout (pos) Output dataset name (defaults to "alluniq")
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb 16Jun03 Create null output dataset and use %hasvars
/ rrb 29Mar07 Put out "macro called" message plus header tidy
/ rrb 31Jul07 Header tidy
/===============================================================================
/ This is public domain software. No guarantee as to suitability or accuracy is
/ given or implied. User uses this code entirely at their own risk.
/=============================================================================*/
%put MACRO CALLED: alluniq v1.0;
%macro alluniq(libref,variable,dsout);
%if not %length(&libref) %then %let libref=%sysfunc(getoption(user));
%if not %length(&libref) %then %let libref=work;
%if not %length(&variable) %then %do;
%put ERROR: (alluniq) No variable name specified;
%goto skip;
%end;
%if not %length(&dsout) %then %let dsout=alluniq;
*- create null output dataset -;
data &dsout;
_u_m_b_j=.;
run;
data _null_;
set sashelp.vcolumn(where=(libname="%upcase(&libref)"
and upcase(name)="%upcase(&variable)"));
if _n_=1 then do;
call execute('proc sort nodupkey data='||trim(libname)||'.'||trim(memname)||
"(keep=&variable) out=&dsout;by &variable;run;");
end;
else do;
call execute('proc sort nodupkey data='||trim(libname)||'.'||trim(memname)||
"(keep=&variable) out=_alluniq;by &variable;");
call execute('proc append base=&dsout data=_alluniq;run;');
end;
run;
%if %hasvars(&dsout,&variable) %then %do;
proc sort nodupkey data=&dsout;
by &variable;
run;
%end;
%else %put ERROR: (alluniq) Library &libref has no instances of variable &variable;
proc datasets nolist;
delete _alluniq;
run;
quit;
%skip:
%mend;