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

我用Query.RecordCount为何不能取值?

尚未結案
mason88
一般會員


發表:8
回覆:17
積分:5
註冊:2005-08-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-13 19:35:35 IP:222.50.xxx.xxx 未訂閱
是这样的: 我在Form1录入数据到表Expert.DB(Paradox7格式),这张表是人员管理的,而人员按不同专业分类并有一个编号。我需要系统能在录入人员时,先通过Form2的一个Combobox选定专业,并赋值给Table的EPro字段,自动给不同专业人员分配不同的号码段,并使其编号自动累加。 我设想:每次录入一名人员时,先输入该人员的专业名称,然后用SQL查询出Table中属于此专业的人员,然后利用SQL的RecordCount计算出这些人的数量,再使这名人员的编号ENo=Query1.RecordCount 1。 不过,运行时系统并没有在编号中加上已有的本专业人员数量,由于ENo是关键字段,系统报错。 不知道是我对RecordCount这个参数理解有误(它不是用来统计的?),还是出了什么问题? 代码如下: procedure TForm1.BtnAddClick(Sender: TObject); var Series,PlusNum:integer; SN:integer; Value,strSQL:String; begin Form2.ShowModal; Table1.Append ; DBEditPro.Text:=Form2.ComboBox1.Text; Value:=Trim(DBEditPRO.Text); Query1.Close; strSQL:='Select * from Table1 where EPro = "Value"'; Query1.SQL.Text:=strSQL; Query1.Open; PlusNum:=Query1.RecordCount 1; case Form2.ComboBox1.ItemIndex of 0:SN:=1400100000; 1:SN:=1400200000; 2:SN:=1400300000; 3:SN:=1400400000; 4:SN:=1400500000; 5:SN:=1400600000; 6:SN:=1400700000; 7:SN:=1400800000; 8:SN:=1400900000; 9:SN:=1401000000; 10:SN:=1401100000; end; Series:=SN PlusNum; DBEditNO.Text := InttoStr(Series); Table1.FieldByName('ENo').AsString:=Form1.DBEditNO.Text; end;
sryang
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-13 21:18:58 IP:221.226.xxx.xxx 未訂閱
strSQL:='Select * from Table1 where EPro = "Value"'; Query1.SQL.Text:=strSQL; Query1.Open; Query1.Last; Query1.First; PlusNum:=Query1.RecordCount 1; 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
mason88
一般會員


發表:8
回覆:17
積分:5
註冊:2005-08-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-13 22:09:08 IP:222.50.xxx.xxx 未訂閱
引言: strSQL:='Select * from Table1 where EPro = "Value"'; Query1.SQL.Text:=strSQL; Query1.Open; Query1.Last; Query1.First; PlusNum:=Query1.RecordCount 1; 加油喔,喵~
But it doesn't work.
sryang
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-14 11:11:19 IP:221.226.xxx.xxx 未訂閱
在 TQuery 使用 SELECT 敘述取得資料時,RecordCount 有可能會傳回 -1 所以 last 之後再 first 才能取得正確的 RecordCount    看你的需求,只是想知道筆數,那幹嘛不用 count(*) 來取得? 而且,你的 SQL 傳入參數的方式錯誤 應該這樣寫:
strSQL:='Select count(*) as RecCount from Table1 where EPro = '''   Value   '''';
Query1.SQL.Text:=strSQL;
Query1.Open;
PlusNum:=Query1.FieldByName('RecCount').AsInteger   1;
你原先的寫法,只能抓到 EPro 的值等於 "Value" 的,而不是你想要的 Epro 的值等於 Trim(DBEditPRO.Text) 的。 所以可能是因為這個原因,使得 Primary Key 重複吧 加油喔,喵~ 發表人 - sryang 於 2005/08/14 11:12:56
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
mason88
一般會員


發表:8
回覆:17
積分:5
註冊:2005-08-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-14 13:20:17 IP:222.50.xxx.xxx 未訂閱
还是不行,我也搞不清楚还可能是什么问题…… 唉,我还是先认真学学数据库编程这部分内容吧。 Anyway谢谢sryang兄。
sryang
尊榮會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-14 15:14:43 IP:221.226.xxx.xxx 未訂閱
不用客氣 我只是針對你這一段程式上的問題,做了一些建議 後來仔細看了你的原發貼,發現你這樣的思維是有錯誤的 一個 Primary Key 欄位要做自動編號,不可以透過 記錄數量 1 這樣的作法 舉個例子,現在你的檔案中有 5 筆記錄,這些人的專業都是相同的,EPro 欄位分別是 1400100001、1400100002、1400100003、1400100004、1400100005 在刪除了 1400100003 這一筆之後,又新增一筆 依照你的思維,新增的這一筆 EPro 欄位將會填入 1400100005 就導致了 Primary Key 重複 所以你應該用 Max(EPro) 來取得目前最大的那一筆 如果取不到,表示這個專業類別中還沒有記錄,這時候再來依照專業類別去編第一個號碼 另,是否可以把報出的錯誤貼上來,方便作個判斷 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
mason88
一般會員


發表:8
回覆:17
積分:5
註冊:2005-08-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-14 20:06:56 IP:222.50.xxx.xxx 未訂閱
引言: 不用客氣 我只是針對你這一段程式上的問題,做了一些建議 後來仔細看了你的原發貼,發現你這樣的思維是有錯誤的 一個 Primary Key 欄位要做自動編號,不可以透過 記錄數量+1 這樣的作法 舉個例子,現在你的檔案中有 5 筆記錄,這些人的專業都是相同的,EPro 欄位分別是 1400100001、1400100002、1400100003、1400100004、1400100005 在刪除了 1400100003 這一筆之後,又新增一筆 依照你的思維,新增的這一筆 EPro 欄位將會填入 1400100005 就導致了 Primary Key 重複 所以你應該用 Max(EPro) 來取得目前最大的那一筆 如果取不到,表示這個專業類別中還沒有記錄,這時候再來依照專業類別去編第一個號碼 另,是否可以把報出的錯誤貼上來,方便作個判斷 加油喔,喵~
我也考虑到了你提到的这个问题,即应该是选取了所有该专业人员后,读出最后一名的编号,再将此编号+1。只是目前这个RecordCount没解决,我怀疑是否我从一开始就错了,因为即使我用新方法,也一样要涉及计算记录数的问题。 我在设计中试运行,到RecordCount这一步,返回信息是: 请yang兄帮忙看看。
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-15 08:43:32 IP:218.15.xxx.xxx 未訂閱
插花, mason88您好: 1、从错误信息来看,是因为表Ept不存在。您检查下是否哪里有到了表Ept,表Ept是否存在或表路径是否正确,因我看您的SQL语句中是Table1。 2、从您的SQL语句中可以看出您的原意,是想select出EPro等于值(Trim(DBEditPRO.Text))的所有栏位值,而您所写的是select出EPro是等于值(Value)是不合您要求的,这样每次也select不出您想要的,也即每次返回的结果都是RecordCount =-1 ,没符合条件的记录,应改为: strSQL:='Select * from Table1 where EPro ="' Value '" '; Query1.SQL.Text:=strSQL; showmessage(StrSQL); //加多一句,看看SQL语句是什么? Query1.Open; 注意红色部分的写法,及检查表Ept的路径。 ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ 發表人 - deity 於 2005/08/15 08:54:25
mason88
一般會員


發表:8
回覆:17
積分:5
註冊:2005-08-01

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-15 12:17:59 IP:218.15.xxx.xxx 未訂閱
引言: 插花, mason88您好: 1、从错误信息来看,是因为表Ept不存在。您检查下是否哪里有到了表Ept,表Ept是否存在或表路径是否正确,因我看您的SQL语句中是Table1。 2、从您的SQL语句中可以看出您的原意,是想select出EPro等于值(Trim(DBEditPRO.Text))的所有栏位值,而您所写的是select出EPro是等于值(Value)是不合您要求的,这样每次也select不出您想要的,也即每次返回的结果都是RecordCount =-1 ,没符合条件的记录,应改为: strSQL:='Select * from Table1 where EPro ="' Value '" '; Query1.SQL.Text:=strSQL; showmessage(StrSQL); //加多一句,看看SQL语句是什么? Query1.Open; 注意红色部分的写法,及检查表Ept的路径。 ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ 發表人 - deity 於 2005/08/15 08:54:25
多谢。我是在将整个project拷贝回家做的时候出现这个问题的,现在我回到办公室再调整原来的project,再按照各位的建议,将'value"改为'" value "'就没问题了。我想有可能是我在家里没有设置好原表的别名的缘故。 现在这个问题初步解决,感谢各位的帮忙。答题分不能给每个帮忙的朋友,sryang兄答的多,所以只好给他了。也要谢谢deity兄,你的回答也很关键。
系統時間:2024-05-02 8:07:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!