%let _ODSStyle=Seaside; %STPBEGIN; options urlencoding='UTF8'; data dsnvar; length name $32. varnum 8. label $100. ; name = 'Make'; label = 'Make'; varnum = 1; output; name = 'Type'; label = 'Type'; varnum = 2; output; name = 'DriveTrain'; label = 'DriveTrain'; varnum = 4; output; run; data dsnvar; length varnames $600. md5content $600. md5function $600. md5label $600. htmlurl $600.; set dsnvar; retain /* varnames */ md5content; /* varnames = strip(name)!!ifc(_N_=1,'','¤')!!strip(varnames);*/ md5content = 'strip('!!strip(name)!!')'!!ifc(_N_=1,'','!!')!!strip(md5content); md5function = strip(name)!!'_md5=put(md5('!!strip(md5content)!!'),hex32.);'; md5label = 'label '!!strip(name)!!'_md5='!!"'"!!strip(label)!!"';"; urlfilter=strip("!!'%nrstr(&)_"!!strip(name)!!"_md5='!!strip("!!strip(name)!!"_md5)"); htmlurl=tranwrd(tranwrd("label='$!!strip("!!strip(name)!!")!!$';",'¤','"'),'$',"'"); run; data _NULL_; length codeline $600.; set dsnvar end=last; if _N_=1 then do; codeline = 'data work.dsnmd5 /view=work.dsnmd5; set sashelp.cars;'; call execute(codeline); end; codeline = strip(md5function); call execute(codeline); codeline = strip(md5label); call execute(codeline); if last then do; codeline = 'run;'; call execute(codeline); end; run; data _NULL_; length codeline $600.; set dsnvar end=last; codeline = 'proc sort data=work.dsnmd5 (keep='!!strip(name)!!' '!!strip(name)!!'_md5) out=work.fmt_'!!strip(name)!!' nodupkey;'; call execute(codeline); codeline = 'by '!!strip(name)!!' '!!strip(name)!!'_md5;'; call execute(codeline); codeline = 'run;'; call execute(codeline); codeline = 'data work.fmt_'!!strip(name)!!';'; call execute(codeline); codeline = ' length fmtname $32. start $32. label $600.;'; call execute(codeline); codeline = ' set work.fmt_'!!strip(name)!!' end=last;'; call execute(codeline); codeline = ' fmtname = "$'!!strip(name)!!'";'; call execute(codeline); codeline = ' start = '!!strip(name)!!'_md5;'; call execute(codeline); codeline = ' '!!strip(htmlurl); call execute(codeline); codeline = 'run;'; call execute(codeline); run; options urlencoding='SESSION'; data format (keep=fmtname start label); set fmt_:; run; proc datasets lib=work nolist; delete fmt_:; delete dsnvar:; run;quit; proc format library=work cntlin=format; run; proc tabulate data=dsnmd5; where Make in("Audi" "BMW" "Mercedes"); class Make_md5 Type_md5 DriveTrain_md5; var Weight Length; table (Make_md5="" all="I alt")*(Type_md5="")*(DriveTrain_md5="") all="Total" , (Weight*mean="") (Length*mean=""); format Make_md5 $Make. Type_md5 $Type. DriveTrain_md5 $DriveTrain.; run;quit; %STPEND;