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

DBGrid按下Title排序的問題(Field index out of range)

缺席
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-12 12:31:21 IP:210.243.xxx.xxx 未訂閱
請問各位大大,之前有很多說要按下DBGrid的Title就排序的討論, 比如 Justmade 大大的 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28513 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30526 以及 Fishman 大大的 http://delphi.ktop.com.tw/topic.php?topic_id=42872 但是, 不是出現 Field index out of range 就是 index 'STA_NAME_INDEX' not found 請問一下,這個問題是不是出在該欄位是LookUp出來的關係, 因為其他的都可以執行,就是只要按到該欄位就不行, 請各位大大幫我解答一下,謝謝!!!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-14 11:11:25 IP:210.65.xxx.xxx 未訂閱
Hi wscken,    我剛剛試了一下,似乎 FieldKind 非 fkData 的都不行,意即 Calculated Field & Lookup Field 不行用此方法,若你的 DBGrid 僅供查詢可以直接由 SQL Command 中著手 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-14 11:38:09 IP:210.243.xxx.xxx 未訂閱
try try clientdataset
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-14 13:53:24 IP:210.243.xxx.xxx 未訂閱
Fishman大大,這樣子就會變的沒有效率,要回去重抓資料.. hahalin大大,我本來就是用ClientDataSet了,所以才會不知道怎麼做..
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-14 14:35:06 IP:210.243.xxx.xxx 未訂閱
改Calculated Field用internal calculated field
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-14 15:33:44 IP:210.65.xxx.xxx 未訂閱
Hi wscken,    我指的並不是在 SQL Command 中下 Order By,因為既然是 Lookup Field,Command 中自然也不會有該欄位,如何排序?    我指的是在 SQL Command 中將該欄位一併 Select 出來,再套用先前的程式碼就可以了,但如此一來,可能會造成你的 DataSet 為 ReadOnly,所以才會說,若是 DBGrid 僅供查詢可以直接由 SQL Command 中著手    若是 DBGrid 需可修改,建議你用 hahalin 版大的方法試試 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-19 19:34:59 IP:210.243.xxx.xxx 未訂閱
Fishman 大大: 我的DBGrid要能夠提供新删修的功能,所以沒辦法照您說的由 Commend中來下手... hahalin 大大: 您說的改Calculated Field用internal calculated field,我試了4天還是試不出來,可以請問一下我該到哪裡找這種相關範例,還是有什麼資料可以看呢? 已經試到不知道怎麼著手了..........
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-20 12:05:27 IP:210.243.xxx.xxx 未訂閱
http://community.borland.com/article/0,1410,29056,00.html    http://community.borland.com/article/0,1410,22571,00.html  中的    Sorting    If you want to sort the result set in ClientDataset,    如果你要在clientdataset排序    you can use the IndexFieldNames property in the same way as you did with TTable.     你可以使用indexfilednames屬性就像在TTable裡面的用法一樣    ...中間這一段就是indexfieldnames的使用說明    You can define the calculated field type either at design-time or at run-time. At design-time, you can add a new calculated field for the ClientDataset just as you always have done with TDBDataset components.     你可以再設計階段使用一種新的calculated欄位...    Invoke the Fields Editor by double-clicking on the ClientDataset. Then, press the right mouse button inside the Fields Editor to bring up the context menu, where you will select the menu item "New field...". When the New Field dialog appears, you can select either Calculated or InternalCalc to set the TField.FieldKind. You can also change the field type at design-time by using the Object Inspector to change the value of the FieldKind property from fkCalculated to fkInternalCalc. 在欄位編輯視窗增加一個欄位,設定為fkInternalCalc類型 http://www.delphi32.com/info_facts/faq/faq_67.asp How do you make TClientDataSet sort on lookup or calculated fields? In the fields editor, when creating a new field to be sorted on, choose New Field from the context menu and choose InternalCalc as the field type. Or if creating TFields in code, make the TField.FieldKind fkInternalCalc instead of fkCalc. fkInternalCalc is only available in ClientDataSets. http://podgoretsky.com/ftp/Docs/Delphi/D5/dg/5_ds3.html Using internally calculated fields in client datasets Internally calculated fields, just like calculated fields, are calculated in an OnCalcFields event handler. However, you can optimize your event handler by checking the State property of your client dataset. When State is dsInternalCalc, you must recompute internally calculated fields. When State is dsCalcFields, you need only recompute regular calculated fields.
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-06-04 11:05:05 IP:210.243.xxx.xxx 未訂閱
小弟不才,還是試不出來,先結案好了, Fishman大大,hahalin大大,感謝兩位的回應,謝謝你們..
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-06-04 11:19:13 IP:210.243.xxx.xxx 未訂閱
應該不需要放棄吧 你要不要把你自己實作有問題的code貼上來 讓更多朋友能有機會協助您
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-06-04 13:51:37 IP:210.243.xxx.xxx 未訂閱
hahalin大大,我剛剛一氣之下從灌了程式,結果居然可以了,用的發法是 http://delphi.ktop.com.tw/topic.php?topic_id=42872 的方法, 不過ClientDataSet的方法我不能用,因為在整各專案內都是使用ADOQuery ,實在很多,又不能改,所以在ADOQuery那邊還是沒有辦法在Lookup的欄位上 ,做排序的功能,至於程式碼則是普通的寫法,如下.... var Str:String ; begin Str := Column.Field.FieldName ; With TADOQuery(self.FindComponent(Column.Grid.DataSource.DataSet.Name)) Do Begin //--- 動態找出點下按鍵的資料模組內的ADOQuery --- if Pos(' DESC', Sort)= 0 then Sort := Column.Field.FieldName ' DESC' else Sort := Str End ; end; 難道在不改變架構的情形下,只能更改Sql語法從抓資料嗎???
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-06-04 14:22:28 IP:210.243.xxx.xxx 未訂閱
也可以不用改掉原來的adoquery 加個datasetprovider 再加上 clientdataset也是可以
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-06-07 10:36:54 IP:210.243.xxx.xxx 未訂閱
---------------------------------------------------- 也可以不用改掉原來的adoquery 加個datasetprovider 再加上 clientdataset也是可以 ---------------------------------------------------- 目前無法這樣改,就是因為如此一來修改的幅度太大,不是短時間能夠完成的, 依照原架構加個datasetprovider跟clientdataset的話,就等於整各要從來了, 因為如此一來的資料庫操作也不太一樣,所以才會無法動手..變成現在的不能排序了....真糟糕..
系統時間:2024-07-03 4:39:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!