/*

/ Program   : zerogrid.sas
/ Version   : 1.0
/ Author    : Roland Rashleigh-Berry
/ Date      : 13-Feb-2007
/ Purpose   : To create a "grid" of combined values with a variable set to zero
/             for all combinations of values.
/ SubMacros : %commas
/ Notes     : Output sort order will be by supplied variable name if nothing is
/             specified.
/ Usage     : %zerogrid(dsout=grid,var1=subject,ds1=demog,var2=tmtarm,
/             ds2=demog,zerovar=count,sortby=tmtarm subject)
/             %zerogrid(zerovar=str,zero="  0 (  0.0)",var1=trtrand ddose,
/                       ds1=period1,var2=day,ds2=period1)
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ dsout=zerogrid    Output dataset name (defaults to "zerogrid")
/ zero=0            By default, the zero setting is numeric 0
/ zerovar           Name of variable to receive zero setting for all obs
/ sortby            Variable list to sort output dataset by (defaults to
/                   supplied variable order)
/ var1              First variable(s) for extracting distinct values
/ ds1               Dataset source of first variable
/ var2              Second variable(s) for extracting distinct values
/ ds2               Dataset source of second variable
/ var3              Third variable(s) for extracting distinct values
/ ds3               Dataset source of third variable
/ var4              Fourth variable(s) for extracting distinct values
/ ds4               Dataset source of fourth variable
/ var5              Fifth variable(s) for extracting distinct values
/ ds5               Dataset source of fifth variable
/ (9 of these)
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb  29Apr05         Ability to change zero setting added
/ 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: zerogrid v1.0;

%macro zerogrid(dsout=zerogrid,
               sortby=,
                 zero=0,
              zerovar=,
                 var1=,
                  ds1=,
                 var2=,
                  ds2=,
                 var3=,
                  ds3=,
                 var4=,
                  ds4=,
                 var5=,
                  ds5=,
                 var6=,
                  ds6=,
                 var7=,
                  ds7=,
                 var8=,
                  ds8=,
                 var9=,
                  ds9=,
                  ); 

%local error i;
%let error=0;

%if not %length(&zero) %then %let zero=0;

%if not %length(&dsout) %then %do;
  %let error=1;
  %put ERROR: (zerogrid) Output dataset dsout= not given a name;
%end;

%if not %length(&zerovar) %then %do;
  %let error=1;
  %put ERROR: (zerogrid) Zero value variable zerovar= not given a name;
%end;

%do i=1 %to 9;
  %if %length(&&var&i) and not %length(&&ds&i) %then %do;
    %let error=1;
    %put ERROR: (zerogrid) Variable name supplied as var&i=&&var&i but no ds&i=;
  %end;
  %if %length(&&ds&i) and not %length(&&var&i) %then %do;
    %let error=1;
    %put ERROR: (zerogrid) Dataset name supplied as ds&i=&&ds&i but no var&i=;
  %end;
%end;

%if not %length(&sortby) %then %let sortby=&var1 &var2 &var3 &var4 &var5 &var6
&var7 &var8 &var9;

%if &error %then %goto error;


proc sql noprint;
  create table &dsout as 
  select &zero as &zerovar, * from
  %if %length(&var1) and %length(&ds1) %then %do;
  (select distinct %commas(&var1) from &ds1)
  %end;
  %if %length(&var2) and %length(&ds2) %then %do;
  , (select distinct %commas(&var2) from &ds2)
  %end;
  %if %length(&var3) and %length(&ds3) %then %do;
  , (select distinct %commas(&var3) from &ds3)
  %end;
  %if %length(&var4) and %length(&ds4) %then %do;
  , (select distinct %commas(&var4) from &ds4)
  %end;
  %if %length(&var5) and %length(&ds5) %then %do;
  , (select distinct %commas(&var5) from &ds5)
  %end;
  %if %length(&var6) and %length(&ds6) %then %do;
  , (select distinct %commas(&var6) from &ds6)
  %end;
  %if %length(&var7) and %length(&ds7) %then %do;
  , (select distinct %commas(&var7) from &ds7)
  %end;
  %if %length(&var8) and %length(&ds8) %then %do;
  , (select distinct %commas(&var8) from &ds8)
  %end;
  %if %length(&var9) and %length(&ds9) %then %do;
  , (select distinct %commas(&var9) from &ds9)
  %end;
  order by %commas(&sortby);
quit;

%goto skip;
%error:
%put ERROR: (zerogrid) Leaving zerogrid macro due to error(s) listed;
%skip:
%mend;