An interesting question that we frequently are being asked is: How to create a calendar report? Generally, the requirement is to create a report showing appointments and bookings just as in a month planner calendar/scheduler. When you think about it, tracking tasks and events when displayed in a calendar is instant - the users have all the information they need into a well known layout that allows to easily analyze tasks and projects. It is no wonder that our clients request this type of report. The easiest way to prepare a dynamic calendar report is to utilize our flexible crosstab/table/list item.
Due to the crosstabs data driven nature the calendar is generated thoroughly on CalendarDataSource data.
public
class
CalendarDataSource
{
public
IEnumerable<DateTime> GetDaysBetween(DateTime startDate, DateTime endDate)
{
// truncate the time part
var date = startDate.Date;
endDate = endDate.Date;
while
(date <= endDate)
{
yield
return
date;
date = date.AddDays(1);
}
}
}
To format the crosstab in calendar format we have used a few helper user functions:
public
static
DateTime GetFirstDayOfMonth(DateTime value)
{
return
new
DateTime(value.Year, value.Month, 1);
}
public
static
DateTime GetLastDayOfMonth(DateTime value)
{
return
new
DateTime(ReportingCalendarvalue.Year, value.Month, 1).AddMonths(1).AddDays(-1);
}
public
static
int
GetWeekOfYear(DateTime value)
{
var firstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;
return
CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(value, CalendarWeekRule.FirstDay, firstDayOfWeek);
}
public
static
int
GetDayOfWeek(DateTime value)
{
var firstDayOfWeek = (
int
)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;
var dayOfWeek = (
int
)value.DayOfWeek;
return
(dayOfWeek + 7 - firstDayOfWeek) % 7;
}
public
static
string
GetDayOfWeekName(DateTime value)
{
var dayNames = CultureInfo.CurrentCulture.DateTimeFormat.DayNames;
return
dayNames[(
int
)value.DayOfWeek];
}
public
static
bool
IsWeekend(DateTime value)
{
return
(value.DayOfWeek == DayOfWeek.Sunday || value.DayOfWeek == DayOfWeek.Saturday);
}
Stefan’s main interests outside the .NET domain include rock music, playing the guitar and swimming.