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

(接上一个问题)TDBGrid绑定TADOQuery,无法刷新

答題得分者是:Justmade
lovelvye
一般會員


發表:5
回覆:10
積分:3
註冊:2003-03-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-26 09:10:45 IP:61.177.xxx.xxx 未訂閱
上一次我提出的问题我已查出来了,我是在OnCreate中先打开ADOQuery,然后更改SQL语句,却没有刷新,因为是跨窗体操作。 但是现在问题又来了,DBGrid无法更新。 错误信息为:缺少更新或刷新的键列信息。
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-26 10:05:27 IP:218.16.xxx.xxx 未訂閱
Refresh 的要求是 該 DataSet 正在使用唯一索引 (Unique Index) 因為他要以這個唯引索引來在重新讀取資料後返回 Refresh 前位置。    若不能達到這個要求,可以 BookMark 和 close-open 來代替
var
BM : TBookMark;
begin
  BM := ADOQuery1.GetBookMark;
  ADOQuery1.Active := false;
  ADOQuery1.Active := true;
  ADOQuery1.GotoBookMark(BM);
  ADOQuery1.FreeBookMark(BM);
end
lovelvye
一般會員


發表:5
回覆:10
積分:3
註冊:2003-03-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-26 10:31:25 IP:61.177.xxx.xxx 未訂閱
是修改之后无法保存。
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-26 10:49:15 IP:218.16.xxx.xxx 未訂閱
可否列出你 ADOQuery 的 SQL 語法 ?
lovelvye
一般會員


發表:5
回覆:10
積分:3
註冊:2003-03-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-26 11:39:33 IP:61.177.xxx.xxx 未訂閱
SELECT 工资.期间, 工资.职工编号, 人事.姓名, 隶属部门.隶属部门, 工资.出勤, 工资.已发, 工资.福利, 工资.留存, 工资.满勤奖, 工资.夜餐中, 工资.夜餐夜, 工资.夜餐金额, 工资.加班费, 工资.扣款, 工资.补贴, 工资.补贴备注, 工资.养老保险, 已发 留存 AS 合计 FROM 人事 RIGHT JOIN (隶属部门 RIGHT JOIN 工资 ON 隶属部门.编号=工资.隶属部门) ON 人事.编号=工资.职工编号 WHERE (工资.期间=:ym) AND (隶属部门.隶属部门=:bm)
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-26 12:36:33 IP:211.21.xxx.xxx 未訂閱
引言: SELECT 工资.期间, 工资.职工编号, 人事.姓名, 隶属部门.隶属部门, 工资.出勤, 工资.已发, 工资.福利, 工资.留存, 工资.满勤奖, 工资.夜餐中, 工资.夜餐夜, 工资.夜餐金额, 工资.加班费, 工资.扣款, 工资.补贴, 工资.补贴备注, 工资.养老保险, 已发 留存 AS 合计 FROM 人事 RIGHT JOIN (隶属部门 RIGHT JOIN 工资 ON 隶属部门.编号=工资.隶属部门) ON 人事.编号=工资.职工编号 WHERE (工资.期间=:ym) AND (隶属部门.隶属部门=:bm)
基本上您是使用TADOQuery 而TADOQuery只能針對一個Table進行增、刪、修的動作 而您的SQL語法含三個Table(人事、部門、工資),當然無法進行增、刪、修的動作 改用Tquery搭配TUpdateSQL:SQL語法不變,因為TUpdateSQL可針對某Table進行增、刪、修的動作。 如果您堅持要用TADOQuery:您必須要修改SQL的語法 SELECT 工资.期间, 工资.职工编号, 工资.出勤, 工资.已发, 工资.福利, 工资.留存, 工资.满勤奖, 工资.夜餐中, 工资.夜餐夜, 工资.夜餐金额, 工资.加班费, 工资.扣款, 工资.补贴, 工资.补贴备注, 工资.养老保险, 已发 留存 AS 合计 FROM 工资 WHERE (工资.期间=:ym) AND (工资.隶属部门=:bm) 至於人事.姓名, 隶属部门.隶属部门要如可取得,您可以使用Lookup欄位或Calculated欄位 ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-26 13:06:43 IP:218.16.xxx.xxx 未訂閱
基本上任何元件都只對針對單一資料表作自動修改,因為 join 在一起資料很多時會有些不合理的修改令 Delphi 不知應甚樣修改。 例 : 如你上面 select 出來的資料,有兩筆均是职工编号A001名稱陳中文的,但使用者在其中一筆改成陳大文,一筆改成陳小文,职工编号不變,那Delphi要甚樣處理才好呢? 所以,若你的資料是要修改的,就要以單一資料表為準,其他相關資料就用 Lookup 或 MasterDetail 關係等來顯示罷。
lovelvye
一般會員


發表:5
回覆:10
積分:3
註冊:2003-03-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-26 13:11:38 IP:61.177.xxx.xxx 未訂閱
to justmade join的字段是无需修改的, 是否可在ADOQuery的OnWillChangField事件中加入相应保存的操作?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-26 13:28:55 IP:218.16.xxx.xxx 未訂閱
儘管你能夠在 OnWillChangField / OnWillChangeRecord 等事件內加入 更新 SQL 語句以另一個 ADOQuery 來執行,但也應無法跳過你所說的無法更新錯誤罷? 因於我現在的電腦沒有可連接 ADO 的數據庫所以不能測試,但你可試試若將該事件 EventStatus 設成 esOK 看看能否跳過該錯誤。
lovelvye
一般會員


發表:5
回覆:10
積分:3
註冊:2003-03-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-26 13:42:56 IP:61.177.xxx.xxx 未訂閱
对,无法跳过该错误。
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-03-26 13:46:59 IP:218.16.xxx.xxx 未訂閱
所以哦,既然你 Join 入的資料是無需修改的,就select 單單工資的資料,其他相關的參考資料就用另外兩個 ADOQuery 來 select,最後再在主Query 設好 Lookup Field 罷,一般都是這樣去做的。
系統時間:2024-05-19 13:01:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!