間隔定時掃描特定星期 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
---------------------------------------------
如有什麼不清楚的地方, 請留言。
學習!!