On Aug 3, 1:45=A0am, Gene Hart <geneh...@gmail.com> wrote:
> On Wednesday, August 1, 2012 4:11:04 PM UTC-7, Gene =A0Hart wrote:
> > I am trying to write a macro to create a whole bunch of macros. Is this=
possible? =A0 The error I get is "Invalid macro name &". =A0SAS 9.2 on Win=
dows. =A0The code follows. =A0I think that I somehow need to stop the %macr=
o from resolving before the &macname does.
>
> > Thanks much,
>
> > gene
>
> > %macro createmac(macname,theview,sex,startage,endage) ;
>
> > =A0 =A0%macro &macname. ;
>
> > =A0 =A0proc sql;
>
> > =A0 =A0create view &macname._VW as
>
> > =A0 =A0select distinct e.*
>
> > =A0 =A0from wviews.&theview as e inner join &_vdw_demographic as d
>
> > =A0 =A0on e.mrn =3D d.mrn
>
> > =A0 =A0where (("01jan2011"d - birth_Date) / 364.25 ) between &startage =
and &endage and
>
> > =A0 =A0 =A0 =A0 =A0gender =3D "&sex."
>
> > =A0 =A0;
>
> > %let _vdw_enroll=3D&macname._VW;
>
> > =A0 %let _SiteAbbr =3D &macname;
>
> > title3 "Enrollment view is &_vdw_enroll ";
>
> > %mend &macname;
>
> > %mend createmac ;
>
> > %createmac(VDW_GpdWestWomen50to75,enroll_west_Gpd_vw,F,50,70);
>
> > %createmac(VDW_GpdWestMen50to75 =A0,enroll_west_Gpd_vw,M,50,70);
>
> > %createmac(VDW_GpdEastWomen50to75,enroll_East_Gpd_vw,F,50,70);
>
> > %createmac(VDW_GpdEastMen50to75 =A0,enroll_East_Gpd_vw,M,50,70);
>
> > %createmac(VDW_NetWestWomen50to75,enroll_west_Net_vw,F,50,70);
>
> > %createmac(VDW_NetWestMen50to75 =A0,enroll_west_Net_vw,M,50,70);
>
> > %createmac(VDW_NetEastWomen50to75,enroll_East_Net_vw,F,50,70);
>
> > %createmac(VDW_NetEastMen50to75 =A0,enroll_East_Net_vw,M,50,70);
>
> This solution is ugly, but it works. =A0Write the macro code to a tempora=
ry file, then %include it.
>
> filename ifile temp;
> %macro createmac(macname,theview,sex,startage,endage) ;
> data _null_;
> file ifile mod;
> put '%macro ' "&macname. ; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 ";
> put " =A0 =A0 =A0proc sql; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 =A0 =A0 =A0 =A0 =A0";
> put " =A0 =A0 =A0create view &macname._VW as =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0";
> put " =A0 =A0 =A0select distinct e.* =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 =A0 =A0";
> put " =A0 =A0 =A0from wviews.&theview as e inner join &_vdw_demographic a=
s d =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0";
> put " =A0 =A0 =A0on e.mrn =3D d.mrn =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 =A0 =A0 =A0 ";
> put ' =A0 where (("01jan2011"d - birth_Date) / 364.25 ) ' "between &start=
age and &endage and ";
> put " =A0 =A0 =A0 =A0 =A0 =A0gender =3D " "'" "&sex." "'" =A0 =A0 =A0 =A0=
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0;
> put " =A0 =A0 =A0; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0";
> put '%let _vdw_enroll=3D' "&macname._VW; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ";
> put '%let _SiteAbbr=3D' "&macname; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0";
> put '%let _SiteName=3D' "&macname; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0";
> put 'title3 "Enrollment view is &_vdw_enroll "; =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ';
> put "%mend &macname; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 =A0";
> %mend createmac;
>
> %createmac(VDW_GpdWestWomen50to75,enroll_west_Gpd_vw,F,50,70);
> %createmac(VDW_GpdWestMen50to75 =A0,enroll_west_Gpd_vw,M,50,70);
> %createmac(VDW_GpdEastWomen50to75,enroll_East_Gpd_vw,F,50,70);
> %createmac(VDW_GpdEastMen50to75 =A0,enroll_East_Gpd_vw,M,50,70);
> %createmac(VDW_NetWestWomen50to75,enroll_west_Net_vw,F,50,70);
> %createmac(VDW_NetWestMen50to75 =A0,enroll_west_Net_vw,M,50,70);
> %createmac(VDW_NetEastWomen50to75,enroll_East_Net_vw,F,50,70);
> %createmac(VDW_NetEastMen50to75 =A0,enroll_East_Net_vw,M,50,70);
> %createmac(VDW_GpdWestWomen50to75,enroll_west_Gpd_vw,F,50,70);
>
> %include ifile;- Hide quoted text -
>
> - Show quoted text -
%macro createmac(macname,theview,sex,startage,endage) ;
proc sql;
create view &macname._VW as
select distinct e.*
from wviews.&theview as e inner join &_vdw_demographic as d
on e.mrn =3D d.mrn
where (("01jan2011"d - birth_Date) / 364.25 ) between
&startage and &endage and
gender =3D "&sex."
;
%let _vdw_enroll=3D&macname._VW;
%let _SiteAbbr =3D &macname;
title3 "Enrollment view is &_vdw_enroll ";
%mend;
data mvalue;
length macname $ 100 theview $ 100 sex $ 2 ;
input macname theview sex startage endage;
datalines;
VDW_GpdWestWomen50to75 enroll_west_Gpd_vw F 50 70
VDW_GpdWestMen50to75 enroll_west_Gpd_vw M 50 70
VDW_GpdEastWomen50to75 enroll_East_Gpd_vw F 50 70
VDW_GpdEastMen50to75 enroll_East_Gpd_vw M 50 70
VDW_NetWestWomen50to75 enroll_west_Net_vw F 50 70
VDW_NetWestMen50to75 enroll_west_Net_vw M 50 70
VDW_NetEastWomen50to75 enroll_East_Net_vw F 50 70
VDW_NetEastMen50to75 enroll_East_Net_vw M 50 70
;
data _null_ ;
set mvalue;
call execute("%createmac(" ||macname || ", " || theview || ", " ||
sex || ", " || startage || ", " || endage || ")");
run;