Here's some code that should get you started. You will need to make changes to it to fit your situation, but it should be enough to get you going
data runDates ;
infile cards ;
input
vendor $
startDDStr $
endDDStr $
;
cards ;
AAA 01 30
BBB 26 25
CCC 01 EOM
DDD 01 15
;
run ;
data startEndDates ;
/* Use todays date as the run date */
runDate=today() ;
runDD=day(runDate) ;
runMM=month(runDate) ;
runYY=year(runDate) ;
/* If current is not Dec, then end month is next month */
if runMM ne 12 then do ;
endMM=runMM+1 ;
endYY=runYY ;
end ;
/* If current month is Dec, then end month is Jan next year */
else do ;
endMM=1 ;
endYY=runYY+1 ;
end ;
/* read the test data */
set runDates ;
/* Convert the start date to a numeric */
startDD=inputn(startDDStr,"2.") ;
/* Create a SAS date value for the start date */
startDate=MDY(runMM,startDD,runYY) ;
/* If the endDDStr is not EOM */
if endDDStr ne "EOM" then do ;
/* Convert endDDStr to a numeric */
endDD=inputn(endDDStr,"2.") ;
/* Create a SAS date value for the end date */
endDate=MDY(endMM,endDD,endYY) ;
end ;
/* If the endDDStr is EOM */
else do ;
/* take the run date, and advance it to the end of the next month */
endDate=INTNX("month1",rundate,0,"E") ;
* put endDate= date7. ;
end ;
put "--> " vendor startDate date7. " " endDate date7. ;
/* Create macro variables to contain the start & end dates */
call symput("startDate"!!left(putn(_n_,"8.")),putn(startDate,"date.")) ;
call symput("endDate"!!left(putn(_n_,"8.")),putn(endDate,"date.")) ;
call symput("cntr",putn(_n_,"8.")) ;
run ;
/* Macro to report the start and end dates to the log */
%macro report(cntr) ;
%do i=1 %to &cntr ;
%put StartDate&i : &&startDate&i EndDate&i : &&EndDate&i ;
%end ;
%mend ;
%report(&cntr) ;
... View more