What you are doing in above code can be programmed in a data step. Put character arguments of INTNX function in quotes and reference variables by their name in data step instead of macro variable names. e.g: Intnx(month, &dvar, 1, e) vs Intnx('month', dvar, 1, 'e') Get your macro variable's (Stichdatum) value into a variable. Assign values to dvar and hvar variables. Store your format name 'faellig' in variable called fmtname and retain it in your control data set. For low and high end of intervals, use 'l' and 'h' values for hlo variable, respectively. Store your left end and right end values of intervals in Start and End variables (values separated by a dash on the left side of equal sign in proc format statement; e.g.: 20089 - 20453 = "2015"). Store your label in Label variable (e.g.: "2015"). Issue output statements after each interval constructed. Construct do until loops to generate additional rows. You can read in this data set by using cntlin option in proc format. %macro genInt(Stichdatum); data datefmt; if _n_ = 1 then do; Stichdatum = INPUT(SYMGET('Stichdatum'),anydtdte.); dvar = stichdatum; hvar = Intnx('month', dvar, 1, 'e'); end; retain fmtname 'dtfmt'; If intnx('month',dvar,0,'e') < intnx('qtr',dvar,0,'e') then do; hlo = 'l'; Start = .; End = INTNX('Month',Stichdatum,0,'e'); Label = '0_abgelaufen'; output; end; hlo = ' '; dvar = Intnx('qtr', dvar, 1, 'b'); DO UNTIL (Intnx('Qtr', dvar, 0, 'e') > Intnx('year', hvar, 1, 'e')); Start = Intnx('qtr', dvar, 0, 'b'); End = Intnx('Qtr', dvar, 0, 'e'); Label = PUT(Intnx('qtr', dvar, 0, 'end'), DDMMYYP10.); output; dvar = Intnx('qtr', dvar, 1, 'b'); END; DO UNTIL (Intnx('semiyear', dvar, 0, 'e') > Intnx('year', hvar, 2, 'e')); Start = Intnx('semiyear', dvar, 0, 'b'); End = Intnx('semiyear', dvar, 0, 'e'); Label = PUT(Intnx('semiyear', dvar, 0, 'end'), DDMMYYP10.); output; dvar = Intnx('semiyear', dvar, 1, 'b'); END; DO UNTIL (Intnx('year', dvar, 0, 'e') > Intnx('year', hvar, 6, 'e')); Start = Intnx('year', dvar, 0, 'b'); End = Intnx('year', dvar, 0, 'e'); Label = PUT(Intnx('year', dvar, 0, 'end'), YEAR4.); output; dvar = Intnx('year', dvar, 1, 'b'); END; Start = Intnx('year', dvar, 0, 'b'); End = .; hlo = 'h'; Label = Catx(' ','nach' ,PUT(Intnx('year', dvar, -1, 'e'), YEAR4.)); output; format Start End Date9.; keep fmtname Start End hlo Label; run; proc format cntlin = datefmt; run; %mend; %genInt(31May2012);
... View more