间隔定时扫描特定星期

间隔定时扫描特定星期 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061225170151111.html
每隔x周(0<x<53),逢星期一、星期二、星期三、星期四、星期五.在8:30执行。  
  如开始执日期为:2006-12-25,每隔3周执行,第一次执行时间为:  
  2006-12-25   8:30  
  2006-12-26   8:30  
  2006-12-27   8:30  
  2006-12-28   8:30  
  2006-12-29   8:30  
  下一次执行时间为:  
  2007-1-15   8:30  
  2007-1-16   8:30  
  2007-1-17   8:30  
  2007-1-18   8:30  
  2007-1-19   8:30  
   
  请问该如何设计此表,及如何定时描述。(需考虑不开机情况。如:2006-12-26   8:30前关机了,到第二天才开,过期未执行的将不再执行。)  
   
   
   
 

 
  一种想法:  
   
  aDate=StrToDateTime("2006-12-25")+7*3;  
   
  if   Now-aDate<1   then   Begin  
   
      if   DayOfTheWeek(aDate)=1   then   Begin     //星期1  
   
      End   Else   if   DayOfTheWeek(aDate)=2   then   Begin     //星期2  
   
      End;  
   
  end;  
       
  --------------------------------------------------------------  
  程序,犹如人生。  
 

最好把任务执行时间单独放到一个如下的数据结构中,结构如下:(可以用表的形式,也可以用结构文件等形式)  
  日期时间                   是否执行操作  
  2006-12-25   8:30            
  2006-12-26   8:30  
  2006-12-27   8:30  
  2006-12-28   8:30  
  2006-12-29   8:30  
   
  这样系统启动后,扫描此表,对于日期在当前日期之前的,不予操作(可以在是否执行操作的字段内填写某个标志),对于大于当前日期的,取出第一项,然后设置一个等待计时器(设置绝对时间和间隔报时时间),配合等待函数,当时间到代后,执行操作。  
   
  只所以建议使用这种扫描任务计划表的形式,是因为这样容易扩展,哪怕有一天你的任务计划需要改成其他形式,只要是按照时间执行,就可以不改代码,如果在代码中写死了时间计算的部分,那么以后要扩展,还要改代码。麻烦。  
   
   
   
   
 

谢谢大家的宝贵意见,wudi_1982所说也许是一种好的方法,但这样设计的话,数据量会过大,如果间隔周期为1,星期一到星期天每天都执行,开始时间为2006-12-26,无结束日期(或结束日期很大),这样的话,数据量就会太大。我想要的是不把数据分解出来。不管如何设计,只保存一条数据。

好办好办,简单简单。如果你做过交通客运系统的话,你这个问题和车辆调度计划是一模一样的。

晚上给你一个完整的表设计和处理语句。(如果你可以等待的话)

我可以等,那先谢谢了。

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[TScheduleInfo]')   and   OBJECTPROPERTY(id,   N'IsUserTable')   =   1)  
  drop   table   [dbo].[TScheduleInfo]  
  GO  
   
  CREATE   TABLE   [dbo].[TScheduleInfo]   (  
  [FScheduleID]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   ,  
  [FScheduleIntervalDays]   [int]   NOT   NULL   ,  
  [FScheduleOriginalDate]   [datetime]   NOT   NULL   ,  
  [FScheduleTime]   [Char]   (5)   NOT   NULL    
  )   ON   [PRIMARY]  
  GO  
   
  Insert   TScheduleInfo   Values('001',   21,   '2006-12-25',   '08:30')  
  Insert   TScheduleInfo   Values('002',   21,   '2006-12-26',   '08:30')  
  Insert   TScheduleInfo   Values('003',   21,   '2006-12-27',   '08:30')  
  Insert   TScheduleInfo   Values('004',   21,   '2006-12-28',   '08:30')  
  Insert   TScheduleInfo   Values('005',   21,   '2006-12-29',   '08:30')  
   
   
  Select   *   From   TScheduleInfo   Where   DateDiff(Day,   FScheduleOriginalDate,   GetDate())%(FScheduleIntervalDays)   =   0  
   
  ---------------------------------------------  
   
  如有什么不清楚的地方,   请留言。

学习!!

posted on 2008-10-20 10:29  delphi2007  阅读(124)  评论(0编辑  收藏  举报