sas macro - create new variables in SAS using do loop -


i have sas program has base year of data , 5 forecast years. forecast years have same calculations, use prior year's data base year calculations. want avoid copying data 5 times , changing suffix of variable names. great have 1 forecast year , have loop or array change suffix of variable names. here updated code based on inputs:

*start macro loop - takes 2 parameters, first year of dataset created , last year; %macro loop(year_start, year_end);    *loop on years;    %do year=&year_start %to &year_end;   *create macro variable previous years;   %let prev_year=%eval(&year_start-1);  data schoolaidfy&year_start.; set work.forecastinputs;  * cost per pupil amounts;                        l201_fy&start_year.=    l203_fy&prev_year.;                              l202_fy&start_year.=        round(scpp*spg_fy&start_year.,1);            l203_fy&start_year.=        sum(l201_fy&start_year.,l202_fy&start_year.);                    l204_fy&start_year.=    l206_fy&prev_year.;                      l205_fy&start_year.=        round(ts_scpp*spg_fy&start_year.,0.01);      l206_fy&start_year.=        sum(l204_fy&start_year.,l205_fy&start_year.);                l207_fy&start_year.=    l209_fy&prev_year.;                      l208_fy&start_year.=        round(pd_scpp*spg_fy&start_year.,0.01);      l209_fy&start_year.=        sum(l207_fy&start_year.,l208_fy&start_year.);            l210_fy&start_year.=    l212_fy&prev_year.;                      l211_fy&start_year.=        round(ei_scpp*spg_fy&start_year.,0.01);      l212_fy&start_year.=        sum(l210_fy&start_year.,l211_fy&start_year.);                l213_fy&start_year.=    l215_fy&prev_year.;                      l214_fy&start_year.=        round(tl_scpp*spg_fy&start_year.,0.01);      l215_fy&start_year.=        sum(l213_fy&start_year.,l214_fy&start_year.);                      run;     %end;   *end of loop;    %mend;   *end of macro;      %loop(year_start=17, year_end=20); 

here log:

2                                                          sas system                           11:35 monday, september 28, 2015  58         l215_fy&start_year.=     sum(l213_fy&start_year.,l214_fy&start_year.);                    59          60          run; 61          62          63           %end; 64           *end of loop; 65          66           %mend; 67           *end of macro; 68          69          %loop(year_start=17, year_end=20); 180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. warning: apparent symbolic reference start_year not resolved. 180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. 180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.=                                        _______                                        180 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.; warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.=                                                                                       _______                                                                                       180 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.; error 180-322: statement not valid or used out of proper order.  note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.= 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.);                                                      _______                                                      180 69       ! l207_fy&start_year.= l209_fy&prev_year.; error 180-322: statement not valid or used out of proper order.  note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.= 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.;            _______            180 error 180-322: statement not valid or used out of proper order.  3                                                          sas system                           11:35 monday, september 28, 2015  warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69                l208_fy&start_year.=  round(pd_scpp*spg_fy&start_year.,0.01);   l209_fy&start_year.=                   _______                                                         _______ _______                                                                                                                                                180                                                             180 180                                                                                   69       ! sum(l207_fy&start_year.,l208_fy&start_year.);    l210_fy&start_year.= l212_fy&prev_year.;       l211_fy&start_year.= 69       ! round(ei_scpp*spg_fy&start_year.,0.01); warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69                l208_fy&start_year.=  round(pd_scpp*spg_fy&start_year.,0.01);   l209_fy&start_year.= 69       ! sum(l207_fy&start_year.,l208_fy&start_year.);    l210_fy&start_year.= l212_fy&prev_year.;       l211_fy&start_year.=                                                                                                            _______                                                                                                            180 69       ! round(ei_scpp*spg_fy&start_year.,0.01); error 180-322: statement not valid or used out of proper order.  warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69            l212_fy&start_year.=  sum(l210_fy&start_year.,l211_fy&start_year.);     l213_fy&start_year.= l215_fy&prev_year.;               _______                                                                 _______               180                                                                     180 69       !  l214_fy&start_year.=  round(tl_scpp*spg_fy&start_year.,0.01);   l215_fy&start_year.= 69       ! sum(l213_fy&start_year.,l214_fy&start_year.); warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69            l212_fy&start_year.=  sum(l210_fy&start_year.,l211_fy&start_year.);     l213_fy&start_year.= l215_fy&prev_year.; 69       !  l214_fy&start_year.=  round(tl_scpp*spg_fy&start_year.,0.01);   l215_fy&start_year.=             _______             180 69       ! sum(l213_fy&start_year.,l214_fy&start_year.); error 180-322: statement not valid or used out of proper order.  note: line generated invoked macro "loop". 69            l212_fy&start_year.=  sum(l210_fy&start_year.,l211_fy&start_year.);     l213_fy&start_year.= l215_fy&prev_year.; 69       !  l214_fy&start_year.=  round(tl_scpp*spg_fy&start_year.,0.01);   l215_fy&start_year.=                                                                             _______                                                                             180 69       ! sum(l213_fy&start_year.,l214_fy&start_year.); error 180-322: statement not valid or used out of proper order.  warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. 4                                                          sas system                           11:35 monday, september 28, 2015  warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved.  note: sas system stopped processing step because of errors. warning: data set work.schoolaidfy17 may incomplete.  when step stopped there 0 observations , 1197           variables. warning: data set work.schoolaidfy17 not replaced because step stopped. note: data statement used (total process time):       real time           0.01 seconds       cpu time            0.01 seconds   180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. warning: apparent symbolic reference start_year not resolved. 180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. 180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.=                                        _______                                        180 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.; warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.=                                                                                       _______                                                                                       180 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.; error 180-322: statement not valid or used out of proper order.  note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.= 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.);                                                      _______                                                      180 69       ! l207_fy&start_year.= l209_fy&prev_year.; error 180-322: statement not valid or used out of proper order.  note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.= 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.;            _______            180 error 180-322: statement not valid or used out of proper order. 5                                                          sas system                           11:35 monday, september 28, 2015   warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69                l208_fy&start_year.=  round(pd_scpp*spg_fy&start_year.,0.01);   l209_fy&start_year.=                   _______                                                         _______ _______                                                                                                                                                180                                                             180 180                                                                                   69       ! sum(l207_fy&start_year.,l208_fy&start_year.);    l210_fy&start_year.= l212_fy&prev_year.;       l211_fy&start_year.= 69       ! round(ei_scpp*spg_fy&start_year.,0.01); warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69                l208_fy&start_year.=  round(pd_scpp*spg_fy&start_year.,0.01);   l209_fy&start_year.= 69       ! sum(l207_fy&start_year.,l208_fy&start_year.);    l210_fy&start_year.= l212_fy&prev_year.;       l211_fy&start_year.=                                                                                                            _______                                                                                                            180 69       ! round(ei_scpp*spg_fy&start_year.,0.01); error 180-322: statement not valid or used out of proper order.  warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69            l212_fy&start_year.=  sum(l210_fy&start_year.,l211_fy&start_year.);     l213_fy&start_year.= l215_fy&prev_year.;               _______                                                                 _______               180                                                                     180 69       !  l214_fy&start_year.=  round(tl_scpp*spg_fy&start_year.,0.01);   l215_fy&start_year.= 69       ! sum(l213_fy&start_year.,l214_fy&start_year.); warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69            l212_fy&start_year.=  sum(l210_fy&start_year.,l211_fy&start_year.);     l213_fy&start_year.= l215_fy&prev_year.; 69       !  l214_fy&start_year.=  round(tl_scpp*spg_fy&start_year.,0.01);   l215_fy&start_year.=             _______             180 69       ! sum(l213_fy&start_year.,l214_fy&start_year.); error 180-322: statement not valid or used out of proper order.  note: line generated invoked macro "loop". 69            l212_fy&start_year.=  sum(l210_fy&start_year.,l211_fy&start_year.);     l213_fy&start_year.= l215_fy&prev_year.; 69       !  l214_fy&start_year.=  round(tl_scpp*spg_fy&start_year.,0.01);   l215_fy&start_year.=                                                                             _______                                                                             180 69       ! sum(l213_fy&start_year.,l214_fy&start_year.); error 180-322: statement not valid or used out of proper order.  warning: apparent symbolic reference start_year not resolved. 6                                                          sas system                           11:35 monday, september 28, 2015  warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved.  note: sas system stopped processing step because of errors. warning: data set work.schoolaidfy17 may incomplete.  when step stopped there 0 observations , 1197           variables. warning: data set work.schoolaidfy17 not replaced because step stopped. note: data statement used (total process time):       real time           0.01 seconds       cpu time            0.01 seconds   180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. warning: apparent symbolic reference start_year not resolved. 180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. 180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.=                                        _______                                        180 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.; warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.=                                                                                       _______                                                                                       180 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.; error 180-322: statement not valid or used out of proper order.  note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.= 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.);                                                      _______                                                      180 69       ! l207_fy&start_year.= l209_fy&prev_year.; error 180-322: statement not valid or used out of proper order.  note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.= 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.;            _______            180  note: sas system stopped processing step because of errors. warning: data set work.schoolaidfy17 may incomplete.  when step stopped there 0 observations , 1197           variables. warning: data set work.schoolaidfy17 not replaced because step stopped. note: data statement used (total process time):       real time           0.01 seconds       cpu time            0.01 seconds   180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. warning: apparent symbolic reference start_year not resolved. 180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. 180: line , column cannot determined. note: nospool on. rerunning option spool might allow recovery of line , column error has occurred. error 180-322: statement not valid or used out of proper order. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.=                                        _______                                        180 69       ! round(ts_scpp*spg_fy&start_year.,0.01);   l206_fy&start_year.=  sum(l204_fy&start_year.,l205_fy&start_year.); 69       ! l207_fy&start_year.= l209_fy&prev_year.; warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. warning: apparent symbolic reference start_year not resolved. note: line generated invoked macro "loop". 69         ,l202_fy&start_year.);      l204_fy&start_year.= l206_fy&prev_year.;       l205_fy&start_year.=                                                                                       _______   note: sas system stopped processing step because of errors. warning: data set work.schoolaidfy17 may incomplete.  when step stopped there 0 observations , 1197           variables. warning: data set work.schoolaidfy17 not replaced because step stopped. note: data statement used (total process time):       real time           0.01 seconds       cpu time            0.01 seconds  70          71          72          73          74         goptions noaccessible; 75         %let _clienttasklabel=; 76         %let _clientprojectpath=; 77         %let _clientprojectname=; 78         %let _sasprogramfile=; 79          80         ;*';*";*/;quit;run; 81         ods _all_ close; 82          83          84         quit; run; 85          

you need macro loop if want different datasets. if want single data set

*start macro loop - takes 2 parameters, first year of dataset created , last year; options mprint symbolgen; %macro loop(year_start, year_end);   *loop on years;   %do year=&year_start %to &year_end;    *create macro variable previous years;   %let prev_year=%eval(&year_start-1);    data schoolaid_fy&year_start.;    set work.schoolaid_fy&prev_year.;     * cost per pupil amounts;                          l201_fy&start_year.=  l203_fy&prev_year.;                                     l202_fy&start_year.=  round(scpp*spg_fy&prev_year.,1);            l203_fy&start_year.= sum(l201_fy&prev_year.,l202_fy&prev_year.);     *rest of code;    run;   %end;   *end of loop;    %mend;   *end of macro;    

then have call macro, example if want 15 20 use year_start=15 , year_end=20.

%loop(year_start=15, year_end=20);    

Comments