請教按title一下順向排序再按一下變逆向排序 |
尚未結案
|
zivu
一般會員 發表:11 回覆:28 積分:12 註冊:2004-04-29 發送簡訊給我 |
|
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
Hi,zivu,您好!
小弟的一點淺見,還請您看看:
當點擊DBGrid標題時對資料返回結果進行排序,主要是在DBGrid的OnTitleClick事件中處理。我們可以通過Column->FieldName來取得列所代表的欄位名。如果欄位是非線性的,可以通過select * from Table order by Field來進行操作.排序命令Order By並不只能根據單一的欄位排序,也可以同時指定多個欄位爲排序依據,例如:
select * from 成績單 order by 數學,語文,英語
程式將會按照數學欄位先排序,然後再按照語文欄位排序,最後才按照英語欄位排序。Order By是從小到大,而我們要從大到小,則可在排序欄位名稱的後面再加上Desc命令,例如:
select * from 成績單 order by 數學 desc
我們可以將相應的SQL命令下達給資料庫,就等結果了:
void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column) { ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Text = "select * from MainTable order by '" Column->FieldName "'"; ADOQuery1->Open(); }================================= 人生在勤,不索何獲 業精於勤荒於嬉,行成於思毀於隨 臨淵羡魚不如退而結網
------
人生在勤,不索何获? |
zivu
一般會員 發表:11 回覆:28 積分:12 註冊:2004-04-29 發送簡訊給我 |
|
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
試試這個如何,也許能幫上點忙:
void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column) { AnsiString s1,s2,s3; s1 = Column->Field->FieldName; s2 = " DESC"; s3 = ADOQuery1->Sort; if((s3.Pos(s1) == 1) && (s3.Pos(s2) == 0)) { ADOQuery1->Sort = s1 " DESC"; } else { ADOQuery1->Sort = s1 " ASC"; } }一點殘念:小弟在Try的時候,使用的是"Asc"和"Desc",結果老是Error,後來仔細閱讀幫助,才發現這兩個關鍵詞應該大寫,555,在上面浪費好多時間 ================================= <>人生在勤,不索何獲> <>業精於勤荒於嬉,行成於思毀於隨> <>臨淵羡魚不如退而結網> 發表人 -
------
人生在勤,不索何获? |
zivu
一般會員 發表:11 回覆:28 積分:12 註冊:2004-04-29 發送簡訊給我 |
感謝bigdogchina版主這麼辛苦的幫我解決問題~~!
可是我看了你寫的程式以後~~!我有好幾個地方看不太懂~~!
第一個是Column->Field->FieldName,如果直接把它取代bigdogchina版主大大之前po的SQL語言裡面的Column->FieldName會掛掉,可是如果我把Field去掉帶入改寫delphi的程式是一定可以的~~~!但是有加Field跟沒加到底插在哪~~!想不通說~~!
第二個是ADOQuery1->Sort; 請問bigdogchina版主大大這是delphi跟BCB都可以這樣寫~~!那這到底是什麼意思阿~~!
第三個是if((s3.Pos(s1) == 1) && (s3.Pos(s2) == 0))
因為是宣告AnsiString s1,s2,s3;而AnsiPos只要是非零值表示它一定找的到,所以它一定會找的到s3.Pos(s1)所以設成1 ,可是後面設成0表示只要是DESC就一定找不到~~!所以應該會先執行順向排序ASC 再找不到才會執行逆向排序DESC, 可是不知道bigdogchina版主大大為什麼要設成DESC呢??請你替我解惑了~~~!或是告訴我我那裡觀念弄錯了~~!謝謝你了~!
|
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
引言: 感謝bigdogchina版主這麼辛苦的幫我解決問題~~! 可是我看了你寫的程式以後~~!我有好幾個地方看不太懂~~! 第一個是Column->Field->FieldName,如果直接把它取代bigdogchina版主大大之前po的SQL語言裡面的Column->FieldName會掛掉,可是如果我把Field去掉帶入改寫delphi的程式是一定可以的~~~!但是有加Field跟沒加到底插在哪~~!想不通說~~! 第二個是ADOQuery1->Sort; 請問bigdogchina版主大大這是delphi跟BCB都可以這樣寫~~!那這到底是什麼意思阿~~! 第三個是if((s3.Pos(s1) == 1) && (s3.Pos(s2) == 0)) 因為是宣告AnsiString s1,s2,s3;而AnsiPos只要是非零值表示它一定找的到,所以它一定會找的到s3.Pos(s1)所以設成1 ,可是後面設成0表示只要是DESC就一定找不到~~!所以應該會先執行順向排序ASC 再找不到才會執行逆向排序DESC, 可是不知道bigdogchina版主大大為什麼要設成DESC呢??請你替我解惑了~~~!或是告訴我我那裡觀念弄錯了~~!謝謝你了~!慚愧,程式非我寫的,小弟也只是試著將hagar版大的code轉化為BCB。 ①Column->FieldName和Column->Field->FieldName的確是不太一樣,看看BCB的Help是如何描述的: TColumn::FieldName Indicates the name of the field represented by the column(指出欄位在列中的名字) 而我們再來看看另外一個: TField::FieldName Indicates the name of the physical column in the underlying dataset to which a field component is bound(指出實際的列在基礎的DataSet到哪個欄位的名字,欄位元件受限). 更為詳細的解釋參看Help. ②在Delphi和BCB中寫法不一樣啊,Delphi為ADOQuery1.Sort,而BCB中為ADOQuery1->Sort.通過Help,我們得知ADOQuery的Sort屬性是Specifies the sort order of the recordset(規定recordset的排序次序) ③s2並不是我要設置成DESC的,而是原來的程式就是這樣用的啊。實際上可以自由變動嘛,理解使用的方法是關鍵,具體的寫法可安裝實際要求做的嘛(將其改為ASC嘛) 一點建議,其實小弟上面說的內容全在Help上,您也許應該多留意一下幫助中的相關解釋。 ================================= <>人生在勤,不索何獲> <>業精於勤荒於嬉,行成於思毀於隨> <>臨淵羡魚不如退而結網>
------
人生在勤,不索何获? |
zivu
一般會員 發表:11 回覆:28 積分:12 註冊:2004-04-29 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |