0

我正在编写一个实用程序来配置何时自动生成某些报告。

下一部分将是一些后台任务(可能是 Windows 服务),它将轮询数据库以了解何时执行这些重复操作。我想出了这个最初的表格设计:

ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
RunWhen DateTime

......但很快意识到“RunWhen”不会削减番茄酱,因为给定的报告需要为给定的成员运行多次(一旦运行,该值不再有效/有用)。

不过,在展示下一个候选表设计之前,先说一下何时可以完成这些报告(生成并通过电子邮件发送):配置者可以将它们设置为在每个月的特定日期(1 日、10 日、17 日)运行,无论如何)或根据模式,即它们可以设置为“每个月的第一个星期二”或“每个月的最后一个星期五”或“每周的第一个星期一”(IOW,每个星期一)。所以我想出了这个:

ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
DayOfMonth int
PatternOrdinal VarChar(6) // First, Second, Third, Fourth, or Last
PatternDOW VarChar(9) // Monday, ... Sunday
PatternInterval VarChar(5) // Week, Month

...但随后意识到这也没有多大意义,因为每次轮询数据库时,都必须运行代码来计算是否已达到或超过等于 DayOfMonth 或 Pattern 字段组合的任何日期. 然后什么会阻止它在那之后永远触发呢?

所以,我认为我需要结合这些想法,但不是 RunWhen,而是调用 DateTime 字段 NextExecution,并在每次为给定成员生成报告时更新它:

ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
NextExecution DateTime
DayOfMonth int
PatternOrdinal VarChar(6) // First, Second, Third, Fourth, or Last
PatternDOW VarChar(9) // Monday, ... Sunday
PatternInterval VarChar(5) // Week, Month

当达到或超过 NextExecution 时间时,服务会生成/通过电子邮件发送报告。然后它计算下一次执行的时间(基于 DayOfMonth 或 Pattern* 字段)并使用该值更新 NextExecution 字段。

这对我来说似乎是合乎逻辑的,但我确信这是一个以前遇到过的挑战,并且想知道是否有一种标准的方法来完成这个可能比我提出的更干净。

4

1 回答 1

1

假设您记录了这些报告的运行时间,您可以将其与第二种方法一起使用,以防止报告多次运行。您可能希望加入某种规则,即您将仅尝试运行在“X”天内已超过到期日的报告。

另一种可能的设计是保留一个类似于您的第一种方法的表格,但是当一个人在接下来的 10 年(或其他足够大的时间跨度)创建一个新的时间表时填写它。保留一个表格,列出用户创建的计划,并将计划日期链接回这些计划,以便在用户取消计划时将其删除。您需要决定如何处理重叠的日程表(例如,两个日程表恰好在本月的同一天登陆,并要求运行相同的报告)。您是否运行一次或两次报告?当用户创建/删除日程表时,您如何处理决定了您可能必须如何围绕维护日历进行编码。

于 2016-02-11T17:53:28.847 回答