/*

/ Program   : supasort.sas
/ Version   : 1.0
/ Author    : Roland Rashleigh-Berry
/ Date      : 04-May-2011
/ Purpose   : To sort a list of datasets by variables if they exist in the
/             datasets.
/ SubMacros : %dsall %words %varlist %quotelst
/ Notes     : You can use the _all_ notation to refer to all the datasets in a
/             library.
/ Usage     : %supasort(work._all_,date time)
/ 
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ list              (pos) List of datasets. The _all_ notation can be used.
/ by                (pos) List of "by" variables (separated by spaces).
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb  13Feb07         "macro called" message added
/ rrb  04May11         Code 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: supasort v1.0;

%macro supasort(list,by);
  %local byvars varlist i j;
  %dsall(&list)
  %let by=%quotelst(%upcase(&by));

  %do i=1 %to %words(&_dsall_);
    %let byvars=;
    %let varlist=%varlist(%scan(&_dsall_,&i,%str( )));
    %do j=1 %to %words(&varlist);
      %if %index(&by,"%upcase(%scan(&varlist,&j,%str( )))") 
        %then %let byvars=&byvars %scan(&varlist,&j,%str( ));
    %end;
    %if %length(&byvars) %then %do;
      proc sort data=%scan(&_dsall_,&i,%str( ));
        by &byvars;
      run;
    %end;
  %end;
%mend supasort;