/*

/ Program   : dslist.sas
/ Version   : 1.0
/ Author    : Roland Rashleigh-Berry
/ Date      : 13-Feb-2007
/ Purpose   : To list all the datasets in a libref.
/ SubMacros : none
/ Notes     : This is NOT a function-style macro. See usage notes.
/             You can set an option to prefix the dataset names with the libref.
/             The list of datasets will be written to the global macro variable
/             _dslist_.
/ Usage     : %dslist(work);
/             %let dslist=&_dslist_;
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ libref            (pos) Libref name for which all datasets are to be listed
/ prefix            (pos) Set this to anything at all and all dataset names will
/                   be prefixed with the libref name.
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb  13Feb07         "macro called" message added
/===============================================================================
/ 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: dslist v1.0;

%macro dslist(libref,prefix);
%global _dslist_;
%let _dslist_=;
%if not %length(&libref) %then %let libref=%sysfunc(getoption(user));
%if not %length(&libref) %then %let libref=work;
%let libref=%upcase(&libref);

proc sql noprint;
  select distinct memname into :_dslist_ separated by
  %if %length(&prefix) %then %do;
    " &libref.."
  %end;
  %else %do;
    ' '
  %end;
  from dictionary.tables
  where memtype='DATA'
  and libname="&libref";
quit;

%if %length(&prefix) %then %let _dslist_=&libref..&_dslist_;
run;
%mend;