I run a lot of reports off of BOE scheduler. Most of them have to have date ranges entered. Instead of using specific dates and scheduling the reports multiple times, I like to use what I call interpreted date codes. These are codes like: t = today t-1 = yesterday t+1=tomorrow w = current week m = current month mb = beginning of current month me = end of current month mb-1 = beginning of previous month mb+1 = beginning of next month me-1 = end of previous month etc. That way I just enter a parameter date code and the report always interprets the code into the correct date. The formula for this is:
// Accepts a date as a string in mm/dd/yyyy, yyyy-mm-dd, or
// relative (t-45) format. Returns a standard Crystal date.
local numberVar NRange;
local numberVar NOperator;
local stringVar SInterval;
local stringVar STemp;
local numberVar NPos;
if IsDate({?EndDate}) then Date({?EndDate}) //If proper Crystal date
was entered, don't change
else
(
if
InStr({?EndDate},"+")>0 then NOperator:=1 //Plus or minus?
else NOperator:=-1;
STemp:=Replace({?EndDate},"+","-"); //Convert + to -, for
easier string manipulation
NPos:=Instr(STemp,"-");
If
NumericText(Mid(STemp,NPos+1)) then
//Extract and make sure valid number
NRange:=toNumber((Mid(STemp,NPos+1)))
else NRange:=0;
if NPos>0 then
SInterval:=Left(STemp,NPos) //Extract first part. Ex.
"T" or "W"
else SInterval:=STemp;
if
Left(SInterval,1)="T" or SInterval="TODAY" then //Dates relative to Today
CDate(DateAdd("d",(NOperator*NRange),DataDate))
else if
Left(SInterval,1)="W" or SInterval="WEEK" then //Dates relative to this week
CDate(DateAdd("ww",(NOperator*NRange),DataDate))
else if
Left(SInterval,2)="MB" then //Dates relative to beginning of this month
CDate(DateAdd("m",(NOperator*NRange),
DateValue(DatePart("yyyy",DataDate),
DatePart("m",DataDate), 1)))
else if
Left(SInterval,2)="ME" then //Dates relative to
end of this month
DateSerial(year(DataDate), month(DataDate) + (NOperator*NRange) + 1, 1 -
1)
else if
Left(SInterval,1)="M" or SInterval="MONTH" then //Dates relative to this month
CDate(DateAdd("m",(NOperator*NRange),DataDate))
else if
Left(SInterval,2)="YB" then //Dates relative to
beginning of this year
CDate(DateAdd("yyyy",(NOperator*NRange),DateValue(DatePart("yyyy",DataDate),
1, 1)))
else if
Left(SInterval,2)="YE" then //Dates relative to end of this year
CDate(DateAdd("yyyy",(NOperator*NRange),DateValue(DatePart("yyyy",DataDate),
12, 31)))
else if
Left(SInterval,1)="Y" or SInterval="YEAR" then //Dates relative to this year
CDate(DateAdd("yyyy",(NOperator*NRange),DataDate))
else if
Left(SInterval,1)="Q" or SInterval="QUARTER" then //Dates relative to this quarter
CDate(DateAdd("q",(NOperator*NRange),DataDate))
else
// Error trap
DataDate
) So you create parameters called EndDate and StartDate making them strings. I usually enter in the list of basic values like the ones I have above. Then you use the above code to create two formulas: InterpretedEndDate and InterpretedStartDate. You use the InterpretedStartDate and InterpretedEndDate to do your record selections. I also have created a SQL function that does the same thing only this allows you to pass a date code to a SQL stored procedure and to have the stored procedure interpret the date code. If interested, I can send it to you. Hope this helps someone.
------------- Thanks,
D. Bodell
|