全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2660
推到 Plurk!
推到 Facebook!

关于数据库定时执行的问题

答題得分者是:sryang
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-08-28 23:16:05 IP:58.247.xxx.xxx 訂閱

[code delphi]
timer1.ontimer时间下
if not ClientDataSet1.Eof then
begin
if FormatDateTime('hh:mm:ss',now)=FormatDateTime('hh:mm:ss',ClientDataSet1.FieldByName('时间').asdatetime ) then
begin
ShowMessage('ok');

[/code]

一定要在dbgrid里面选中当前的那条记录,才会执行showmessage,有没有办法让他在没选中时也按照这个来?遍历数据库?
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-08-28 23:50:40 IP:118.169.xxx.xxx 未訂閱
很難懂?
===================引 用 terry_zhou82 文 章===================

[code delphi]
timer1.ontimer时间下
if not ClientDataSet1.Eof then
begin
if FormatDateTime('hh:mm:ss',now)=FormatDateTime('hh:mm:ss',ClientDataSet1.FieldByName('时间').asdatetime ) then
begin
ShowMessage('ok');

[/code]

一定要在dbgrid里面选中当前的那条记录,才会执行showmessage,有没有办法让他在没选中时也按照这个来?遍历数据库?
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-08-29 00:51:23 IP:58.247.xxx.xxx 訂閱
版主大大,我的意思是,这条showmessage不执行。只有在dbgrid里面选中她之后才会执行。但我又想不选中他来执行
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-08-29 13:05:27 IP:118.169.xxx.xxx 未訂閱
1.這個事件是在 Timer 上被觸發(定時), 先查看你的 Interval 定多少?
2. 不要設定任何條件, 就Timer中一條showmessage(...) , 先確認 Timer 是否有被執行?
3. 如果上述設定沒有問題, 請確認 Timer 是否有被啟動?

綜合所提問題, 我認為是 Timer 沒被啟動, 或者兩者配合時機不對,
另外針對這樣的寫法, 很可能會造成資源被耗盡的問題,
但不知道你要這個功能的目的在做什麼用, 所以才會說很難懂!
===================引 用 terry_zhou82 文 章===================
版主大大,我的意思是,这条showmessage不执行。只有在dbgrid里面选中她之后才会执行。但我又想不选中他来执行
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-08-29 15:31:24 IP:116.239.xxx.xxx 訂閱
回大大,我想是想做个提醒功能,在数据表格中写入时间,随后用timer1控件加以判断,如果2者时间一致,则执行相关命令
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-08-30 09:27:49 IP:220.136.xxx.xxx 未訂閱
不清楚你整體設計架構, 但
1.如果是要在寫入要判斷, 為何不在儲存時進行
2.抑或者要在輸入該欄的同時, 找相關觸發的事件區來控制這段
以上這些都不需要用 timer 來操作
===================引 用 terry_zhou82 文 章===================
回大大,我想是想做个提醒功能,在数据表格中写入时间,随后用timer1控件加以判断,如果2者时间一致,则执行相关命令
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-08-30 12:45:31 IP:114.35.xxx.xxx 訂閱
還是在 OnTimer 事件中遍歷吧
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-08-30 12:52:31 IP:116.239.xxx.xxx 訂閱
他不执行啊
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-08-30 13:01:52 IP:114.35.xxx.xxx 訂閱
不執行,是不進入 OnTimer 事件?還是進入了 OnTimer 事件但是沒有 ShowMessage?
你確定有跑迴圈遍歷?

這種比對時間的程式撰寫時有幾個小技巧
  1. 每秒執行一次 (甚至多次),縱使你要比對的是「分」
  2. 進入 OnTimer 事件時,先 Timer.Enabled := False,整個事件的最後面再 Timer.Enabled := True,最好使用 try ... finally ... end
    把 Timer.Enabled := True 放在 finally 區塊
  3. 當比對到要執行的動作時,不要使用會阻塞目前執行緒工作的動作,例如 ShowMessage、ShowModal 等
    如果是通知訊息可以使用 StayOnTop 的一般 Form,用 Show 的方式呈現
提供您參考

------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-08-31 13:39:36 IP:74.125.xxx.xxx 訂閱
不是的,我举个例子,我打开数据库,选中dbgrid1中的某条记录,当时间相同时,他会执行。如果不选中,就不执行
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2012-08-31 13:46:36 IP:114.35.xxx.xxx 訂閱
重點:你有跑迴圈遍歷選出的數據嗎?
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2012-08-31 13:55:33 IP:74.125.xxx.xxx 訂閱
回大大,我刚才重新用弄了下,这下可以运行通过了。但是有个问题,以为timer设为了1秒钟,所以每次运行的时候,dbgrid那个蓝色的选中条总是选在最后一条上面。有没有办法。或者用listview来代替dbgrid ?
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#13 引用回覆 回覆 發表時間:2012-08-31 13:58:55 IP:114.35.xxx.xxx 訂閱
你可以用兩個 DataSet,一個供顯示,一個供定時運行
定時運行的那個,每一次 OnTimer 都重新取數據
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#14 引用回覆 回覆 發表時間:2012-08-31 14:35:39 IP:1.170.xxx.xxx 未訂閱

[code delphi]
ClientDataSet1.first;
while not ClientDataSet1.Eof do
begin
if FormatDateTime('hh:mm:ss',now)=FormatDateTime('hh:mm:ss',ClientDataSet1.FieldByName('时间').asdatetime ) then
begin
ShowMessage('ok');
...
end
....
ClientDataSet1.next;
end
[/code]

編輯記錄
wuabc 重新編輯於 2012-08-31 00:36:25, 註解 無‧
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#15 引用回覆 回覆 發表時間:2012-08-31 14:50:56 IP:74.125.xxx.xxx 訂閱
我用listview来代替dbgrid会不会好一点啊
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#16 引用回覆 回覆 發表時間:2012-08-31 14:57:25 IP:74.125.xxx.xxx 訂閱
 sryang,大大,可否给举个例子,我是不是很明白
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#17 引用回覆 回覆 發表時間:2012-08-31 15:04:54 IP:114.35.xxx.xxx 訂閱
[code delphi]
Timer1.Enabled := false;
try
sNow := FormatDateTime('hh:mm:ss',now);
// 重新取得排程數據
ClientDataSet1.Close;
ClientDataSet1.Open;

// 迴圈遍歷取得的數據
while not ClientDataSet1.Eof do
begin
if sNow = FormatDateTime('hh:mm:ss',ClientDataSet1.FieldByName('时间').asdatetime) then
begin
// 此處不應使用 ShowMessage,因為整個程式會因為 ShowMessage 等待使用者回應
// 應使用 StayOnTop 的一般 Form,用 Show 來顯示
ShowMessage('ok');
.....
end;
ClientDataSet1.MoveBy(1);
end;
finally
Timer1.Enabled := true;
end;
[/code]

------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#18 引用回覆 回覆 發表時間:2012-08-31 15:20:42 IP:74.125.xxx.xxx 訂閱
没用,选中条还是会跟着滚动。
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#19 引用回覆 回覆 發表時間:2012-08-31 16:01:43 IP:114.35.xxx.xxx 訂閱
用兩個 ClientDataSet,一個連接至 DBGrid 供顯示用途
一個用於 Timer 中供取資料及判斷用途

你想改用 ListView 也可以
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#20 引用回覆 回覆 發表時間:2012-08-31 17:17:14 IP:74.125.xxx.xxx 訂閱
 大大们,我想到了一个更加好的办法。就是通过clientdataset的filter属性来筛选,随后在放置到timer的ontimer事件中。但问题日期相等的函数咋么写啊?总是实现不了
filter:= '日期 = ''' formatdatetime('hh:mm:ss',now) '''';
sql的高手可否帮我看看啊?谢谢各位大大

terry_zhou82
一般會員


發表:8
回覆:22
積分:6
註冊:2012-08-28

發送簡訊給我
#21 引用回覆 回覆 發表時間:2012-09-03 13:47:46 IP:116.239.xxx.xxx 訂閱
最后还是采用了sryang的方法,采用2个dateset的方式来实现功能比较方便。分给他了,PD老大,别不满意哦。呵呵

系統時間:2024-04-27 2:26:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!