generate.sas

Go to the documentation of this file.
00001  
00021 /* Änderungshistorie
00022    05.02.2008 AM Neuerstellung
00023 */ 
00024 
00025 %MACRO generate(
00026    data   =
00027   ,by     =
00028   ,out    =
00029 );
00030 
00031 /*-- create local data sets and symbols --------------------------------------*/
00032 %local d_temp1 d_temp2;
00033 data; run; %let d_temp1=&syslast;
00034 data; run; %let d_temp2=&syslast;
00035 %local i count bycount;
00036 
00037 /*-- sort input data set and check parameters --------------------------------*/
00038 proc sort data=&data out=&d_temp1;
00039    by &by;
00040 run;
00041 %if &syserr %then %do;
00042    %put ERROR: Macro Generate: data= or by= specified incorrectly;
00043    %return;
00044 %end;
00045 
00046 /*-- determine groups --------------------------------------------------------*/
00047 proc means noprint data=&d_temp1(keep=&by);
00048    by &by;
00049    output out=&d_temp2;
00050 run;
00051 
00052 data _null_;
00053    set &d_temp2 nobs=count;
00054    call symput ("count", compress(put(count,8.)));
00055    stop;
00056 run;
00057 %do i=1 %to &count;
00058    %local label&i;
00059 %end;
00060 
00061 /*-- create data set labels --------------------------------------------------*/
00062 data _null_;
00063    set &d_temp2 end=eof;
00064    array t(1) $ 200 _temporary_;
00065    t(1) = 'Dataset for';
00066 %let i=1;
00067 %do %while(%scan(&by,&i) ne %str());
00068    %if &i>1 %then %do;
00069    t(1) = trim(t(1)) !! ',';
00070    %end;
00071    t(1) = trim(t(1)) !! " %scan(&by,&i)=" !! trim(left(vvalue(%scan(&by,&i))));
00072    %let i = %eval(&i+1);
00073 %end;
00074 %let bycount=%eval(&i-1);
00075    t(1) = trim(t(1)) !! ' (' !! compress(put(_freq_,8.)) !! ' observations)';
00076    call symput ('label' !! compress(put(_n_,8.)), trim(t(1)));
00077 run;
00078 
00079 /*-- create output data sets -------------------------------------------------*/
00080 data %do i=1 %to &count; &out&i (label="&&label&i") %end; ;
00081    set &d_temp1;
00082    by &by;
00083    array t(1) _temporary_;
00084    if first.%scan(&by,&bycount) then t(1)+1;
00085    select(t(1));
00086 %do i=1 %to &count;
00087       when(&i) output &out&i;
00088 %end;
00089    end;
00090 run;
00091 
00092 proc datasets lib=work nolist;
00093    delete %scan(&d_temp1,2,.) %scan(&d_temp2,2,.);
00094 quit;
00095 %MEND generate;

Generated on Sun Oct 10 14:10:15 2010 for SASUnit Examples by  doxygen 1.5.3