線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1055
推到 Plurk!
推到 Facebook!

关于filter的设定

缺席
terry_zhou82
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-09-02 16:26:36 IP:58.24.xxx.xxx 訂閱
我在cds的表格里面已经设定设定了
TDateField(DBGrid1.Columns.items[2].Field).DisplayFormat:='hh:mm:ss';

在filter的属性里面写:'日期=' formatdatetime('hh:mm:ss',clientdataset1.fieldbyname(日期).asdatetime);
但是他死活都不运行,事么问题啊?急
P.D.
版主


發表:571
回覆:3881
積分:3666
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-09-03 09:11:43 IP:118.169.xxx.xxx 未訂閱
你設定 diskplayformat 與底層的資料庫field 有何關係
請確認 這個欄位 "日期" 內存的格式是啥
比對 formatdatetime('hh:mm:ss',clientdataset1.fieldbyname(日期).asdatetime) 出來的又是什麼
===================引 用 terry_zhou82 文 章===================
我在cds的表格里面已经设定设定了
TDateField(DBGrid1.Columns.items[2].Field).DisplayFormat:='hh:mm:ss';

在filter的属性里面写:'日期=' formatdatetime('hh:mm:ss',clientdataset1.fieldbyname(日期).asdatetime);
但是他死活都不运行,事么问题啊?急
terry_zhou82
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-09-03 10:11:27 IP:116.239.xxx.xxx 訂閱
但是我做cds,是mdb转的,默认格式就是1899-12-31-22:22:09,在数据表里面改不了啊。
leveon
資深會員


發表:29
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-09-06 09:26:35 IP:118.165.xxx.xxx 訂閱
sryang
尊榮會員


發表:38
回覆:741
積分:875
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-09-06 09:38:01 IP:114.35.xxx.xxx 訂閱
ClientDataSet 的 Filter 有很多問題,很難搞
建議您在 ClientDataSet.OnFilterRecord 事件中自行比對欄位值
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
P.D.
版主


發表:571
回覆:3881
積分:3666
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-09-07 09:21:37 IP:118.169.xxx.xxx 未訂閱
Delphi 啟始的日期 1900 起算, 1899 無法識別的
===================引 用 terry_zhou82 文 章===================
但是我做cds,是mdb转的,默认格式就是1899-12-31-22:22:09,在数据表里面改不了啊。
sryang
尊榮會員


發表:38
回覆:741
積分:875
註冊:2002-06-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-09-07 09:58:47 IP:114.35.xxx.xxx 訂閱
TDateTime 實際上是一個 Double
以 "1899/12/30 00:00:00" 為 0
小於這個日期為負值,大於這個日期為正值
整數部份為 "Date",小數部份為 "Time"

[code delphi]
var d1, d2, d3: TDateTime;

begin
d1 := 0;
d2 := -100;
d3 := 100;

ShowMessage(FormatDateTime('yyyy/mm/dd', d1)); // 1899/12/30
ShowMessage(FormatDateTime('yyyy/mm/dd', d2)); // 1899/09/21
ShowMessage(FormatDateTime('yyyy/mm/dd', d3)); // 1900/04/09
end;
[/code]

回到樓主的問題
ClientDataSet 的 Filter 如果要設定用日期欄位篩選,必須將日期與時間同時指定才可以
以樓主的資料 '1899-12-31-22:22:09' 為例,Filter 就要設定為 「日期 = '1899/12/31 22:22:09'」
不過,日期中的分隔符號應該用「/」還是用「-」,則要與控制台的日期格式設定一致才行,不然會發生錯誤

另一種方法則是使用 FormatDateTime EncodeDate EncodeTime 去產生需要的 Filter 字串
FormatDateTime 裡面傳入的日期分隔符號都使用「/」,Delphi 會自動替換成控制台設定的日期分隔符號
[code delphi]
var d: TDateTime;

begin
d := EncodeDate(1899, 12, 30) EncodeTime(22, 22, 9, 0);

ClientDataSet1.Filtered := False;
ClientDataSet1.Filter := '日期 = ''' FormatDateTime('yyyy/mm/dd hh:nn:ss', d) '''';
ClientDataSet1.Filtered := True;
end;
[/code]

===================引 用 P.D. 文 章===================
Delphi 啟始的日期 1900 起算, 1899 無法識別的

------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2012-09-06 20:00:27, 註解 無‧
系統時間:2017-10-24 9:53:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!