Crystal Report根据假日规则排除时间条目

时间:2011-11-07 22:45:28

标签: crystal-reports

处理报告以确定员工利用率(利用率定义为给定报告期间的可计费小时数与非可计费小时数。)

问题是我需要从我的等式中排除假期。虽然已经写了许多关于识别假期的文章,但我需要一些额外的帮助。

我无法访问后端MS。 SQL数据库为了创建假日表,所以我需要在报表中过滤日期。

我需要排除的假期是

  • 新年(1月1日)

  • 阵亡将士纪念日(5月的最后一个星期一)

  • 独立日(7月4日)

  • 劳动节(9月的第一个星期一)

  • 感恩节(11月的第四个星期四)

  • 平安夜(12月24日)半天

  • 圣诞节(12月25日)

  • 新年前夜(12月31日)

以下是我需要遵循的规则:

周六将在周六观看周六公认的假期。

将在下周一观察周日即将到来的假期。

目前我通过计算总可用分钟(每个工作日= 480分钟)来处理报告,因此对于正常假期,我需要将其从工作总时数和可用总时数中删除。对于半天假期,我需要从总可用时间中移除240分钟,并丢弃240以上的任何工作时间。 我希望这是有道理的。

1 个答案:

答案 0 :(得分:2)

使用以下文本创建名为'Observance'的自定义函数:

//Correct date to match business rules
Function (Datevar value)

    Select DayOfWeek(value)
    //Sunday; add a day
    Case 1: Date(DateAdd("d", 1, value))
    //Saturday
    Case 7: Date(DateAdd("d", -1, value))
    //no change
    Default: value
    ;

使用以下文本创建名为“FullHolidays”的自定义函数:

//create a list of full-day holidays, calculated dynamically
Function (Numbervar yyyy)

    Datevar Array holidays;
    Datevar holiday;

    //New Year's day
    holiday:=Date(yyyy, 1, 1);
    Redim Preserve holidays[Ubound(holidays)+1];
    holidays[Ubound(holidays)]:=Observance(holiday);

    //Memorial Day (last Monday in May)
    //TODO

    //Independence day
    holiday:=Date(yyyy, 7, 4);
    Redim Preserve holidays[Ubound(holidays)+1];
    holidays[Ubound(holidays)]:=Observance(holiday);

    //Labor Day (first Monday in September)
    //TODO

    //Thanksgiving (fourth Thursday in November)
    //TODO

    //xmas day
    holiday:=Date(yyyy, 12, 25);
    Redim Preserve holidays[Ubound(holidays)+1];
    holidays[Ubound(holidays)]:=Observance(holiday);

    holidays;

使用以下文本创建名为“HalfHolidays”的自定义函数:

//create a list of half-day holidays, calculated dynamically
Function (Numbervar yyyy)

    Datevar Array holidays;
    Datevar holiday;

    //xmas eve
    holiday:=Date(yyyy, 12, 24);
    Redim Preserve holidays[Ubound(holidays)+1];
    holidays[Ubound(holidays)]:=Observance(holiday);

    //new year's eve
    holiday:=Date(yyyy, 12, 31);
    Redim Preserve holidays[Ubound(holidays)+1];
    holidays[Ubound(holidays)]:=Observance(holiday);

    holidays;

在如下公式中使用:

If {Table.DateField} IN FullHolidays(Year({Table.DateField})) Then
    0
Else If {Table.DateField} IN HalfHolidays(Year({Table.DateField})) Then
    240
Else
    480

我会把感恩节(和其他这样的假期)计算留在你干练的手中(我太忙于看着House)。