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

DBGrid的流水號問題 -- MSSQL + ADOQuery

缺席
wscken
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-28 12:03:04 IP:210.243.xxx.xxx 未訂閱
請問各位大大,有人遇過使用MSSQL ADOQuery的問題嗎? 當我要新增一個流水號的時候,我使用 procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet); begin DataSet.Fields[0].Value := IntToStr(Abs(DataSet.RecNo)) ; end; 使用Abs是因為第一筆的顯示會變成-1,雖然平常使用都沒有問題,可是當使用者按下最後一筆的按鈕時, 最後一筆資料也會變成1,我想說會不會是EOF或BOF的關係,所以我檢查了一下 發現當移動資料到第一筆跟最後一筆時,都會同時觸動EOF的狀態, 所以程式也沒有辦法判斷,由於目前上面的各位大大的範例都是使用ClientDataSet比較多 所以我想請問一下大大有沒有人知道怎麼解決這個問題,是我設定錯誤還是元件的問題..........
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-28 16:53:02 IP:218.17.xxx.xxx 未訂閱
引言: 請問各位大大,有人遇過使用MSSQL ADOQuery的問題嗎? 當我要新增一個流水號的時候,我使用 procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet); begin DataSet.Fields[0].Value := IntToStr(Abs(DataSet.RecNo)) ; end; 使用Abs是因為第一筆的顯示會變成-1,雖然平常使用都沒有問題,可是當使用者按下最後一筆的按鈕時, 最後一筆資料也會變成1,我想說會不會是EOF或BOF的關係,所以我檢查了一下 發現當移動資料到第一筆跟最後一筆時,都會同時觸動EOF的狀態, 所以程式也沒有辦法判斷,由於目前上面的各位大大的範例都是使用ClientDataSet比較多 所以我想請問一下大大有沒有人知道怎麼解決這個問題,是我設定錯誤還是元件的問題..........
你试一下,不要ABS,判断它如果是 -1 ,则等于1。
wscken
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-28 17:45:15 IP:210.243.xxx.xxx 未訂閱
這樣情形是一樣的,當按下第一筆跟最後一筆觸發的都是一樣的 如果直接判斷=-1就顯示1的話,那一開始的最後一筆所顯示的就會是1..
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-28 17:54:13 IP:202.39.xxx.xxx 未訂閱
MSSQL Server 不適用 RecNo 您可用另一個 TADOQuery 來執行 'Select Count(*) From TableName' 的 方式來算出共有幾筆 record 或用 TADOQuery.RecordCount 的方式 -- Everything I say is a lie. 發表人 - hagar 於 2004/06/28 18:04:10
wscken
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-28 19:31:06 IP:210.243.xxx.xxx 未訂閱
hagar 大大,抱歉,在下功力不夠,還是不知道使用RecordCount來做要如何做到這個功能, 因為沒有辦法抓到目前在第幾筆,所以實在不懂抓到總共的筆數又有什麼用..
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-28 20:30:28 IP:202.39.xxx.xxx 未訂閱
Sorry! 不是您功力不夠 是小弟誤會了!  看來目前除了用
dnsxc
一般會員


發表:7
回覆:13
積分:4
註冊:2004-05-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-04 09:05:04 IP:222.65.xxx.xxx 未訂閱
WSCKEN 你可以用SQL 2K TTABLE(添加一个新字段‘RECO’): procedure TForm1.ADOTABLE1CalcFields(DataSet: TDataSet); begin ADOTABLE1.FIELDBYNAME('RECO').ASSTRING:= IntToStr(Abs(ADOTABLE1.RecNo)) ; end; 你可以试试!
dnsxc
一般會員


發表:7
回覆:13
積分:4
註冊:2004-05-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-04 10:34:22 IP:222.65.xxx.xxx 未訂閱
WSCKEN: 在MSSQL TADOQUERY下,在ADOQUERY1中加入一个FIELD(NAME IS ’NO‘) procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet); begin adoquery1.FieldByName('xv').AsString:=inttostr(abs(adoquery1.RecNo)); end; 这样就不会出现你所说的问题。
dnsxc
一般會員


發表:7
回覆:13
積分:4
註冊:2004-05-22

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-04 10:39:23 IP:222.65.xxx.xxx 未訂閱
DEAR ALL:      SORRY!      FIELDBYNAME('XV').ASSTRING 应改为:FIELDBYNAME('NO').ASSTRING
wscken
初階會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-07-07 10:57:36 IP:210.243.xxx.xxx 未訂閱
dnsxc大大 MSSQL ADOQuery 使用ADOQuery1.RecNo使用Abs來抓,乍看之下是對的,不過實際上, 當妳直接到最後一筆時,就不會正確了,我的問題就是這各意思, 所以我才不知道該怎麼改.. hagar 大大說的改成TClientDataset的話,那就可以,可是現在案子就是沒有辦法去更動這個, 所以才會這樣頭痛...
wscken
初階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-07-07 11:21:23 IP:210.243.xxx.xxx 未訂閱
各位大大,如果改成 procedure TForm1.ADOQuery1RecNoGetText(Sender: TField; var Text: String; DisplayText: Boolean); begin text := IntToStr(Sender.DataSet.RecNo) end; 在GetText的時候抓RecNo的話,則顯示會正確,但是當按下新增的時候,所有的流水號會變成-1, 實在想不出替代的方法,不知道還有沒有別的方法可以做到....
skp
一般會員


發表:14
回覆:19
積分:6
註冊:2002-11-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-07-28 11:33:25 IP:210.177.xxx.xxx 未訂閱
你可以試一下把 No 這個Field設定成 Auto Increment, 這樣它每次就會自動增加,應該可以解決到你的問題。
wscken
初階會員


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-08-06 11:22:54 IP:210.243.xxx.xxx 未訂閱
skp大大 這樣的作法,好像是使用在資料庫中設定自動增加的欄位,要在產生前先自動增加的,跟我需要的前端產生出來,跟資料庫無關的欄位,只是單純的流水號的結果不相同, 所以不適合這樣的作法................................................
系統時間:2024-09-12 7:13:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!