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

請問ClientDataSet新增一筆資料後,在對此資料修改會出錯?

答題得分者是:GrandRURU
chris681016
中階會員


發表:64
回覆:117
積分:96
註冊:2006-10-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-09-18 17:19:11 IP:211.75.xxx.xxx 訂閱
資料庫連結方式  SQLConnection1<---SQLQuery1<--DataSetProvider1<--ClientDataSet1 放在Data Module裡面

procedure TfCust_edit.FormActivate(Sender: TObject);
begin
with fdm.Single_sql do
begin
close;sql.Clear;
sql.Add('select * from CUST_0000 ');
sql.Add('order by cust_no ');
open;
end;
fdm.Single_cds.PacketRecords:=1000;
if fdm.Single_cds.Active=false then fdm.Single_cds.Active:=true;

end;
假設新增一筆客戶資料 fdm . Single_cds.Append
客戶代號 客戶名稱
00001 測式客戶0001
fdm.Single_cds.Post;
fdm.Single_sql.Refresh; //不然無法看到新增的資料,因為我要馬上寫回資料庫,只有在新增加在做此動作

// POST後就寫回資料庫
procedure Tfdm.Single_cdsAfterPost(DataSet: TDataSet);
begin
if Single_cds.ChangeCount>0 then
begin
Single_cds.ApplyUpdates(0);
end;
end;

如果在對 客戶代號 00001 修改客戶名稱為 測式客戶11111
fdm.Single_cds.Post; 就會出現 「Record not found or change another user」

如果在
fdm.Single_cds.Post;
fdm.Single_sql.Refresh;
增加此行
fdm.Single_cds.Refresh;
//新增的資料在修改就不會錯,但是,速度會比較慢,2萬筆資料測式。
//如果不加 fdm.Single_cds.Refresh; 我去看過 fdm.Single_cds 裡的Data也有此筆資料。

如果post不馬上 ApplyUpdates 就不會有問題。
還是一定要
fdm.Single_sql.Refresh; fdm.Single_cds.Refresh;
麻煩各位大大了~~~~~~








編輯記錄
chris681016 重新編輯於 2012-09-18 03:20:53, 註解 無‧
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-09-18 18:35:59 IP:59.120.xxx.xxx 訂閱
你開錯元件了
程式應該像這樣
[code delphi]
procedure TfCust_edit.FormActivate(Sender: TObject);
begin
with fdm.Single_sql do
begin
close;
sql.Clear;
sql.Add('select * from CUST_0000 ');
sql.Add('order by cust_no ');
//open; // 這邊Open是開啟Single_sql
end;

fdm.Single_cds.PacketRecords:=1000;
if fdm.Single_cds.Active=false then fdm.Single_cds.Active:=true; // ClientDataset會自動帶入SQLQuery的資料,因為它們是連動的
end;
[/code]

所有的動作都應該是對ClientDataSet做,包含refresh的行為都應該是ClientDataSet.Refresh;

編輯記錄
GrandRURU 重新編輯於 2012-09-18 04:37:26, 註解 無‧
chris681016
中階會員


發表:64
回覆:117
積分:96
註冊:2006-10-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-09-18 20:14:20 IP:61.64.xxx.xxx 訂閱
 感謝大大的指導^^
之前都用ADOQUERY在寫,所以不怎麼了解DBX的運作~~~~。
再問一下?~~~~~~~~~~~~~~
我看很多寫回資料都在DataSetProvider 跟 ClientDataSet裡面處理,尤期是 M/D 架構在連結到別的TABLE
而 DataSetProvider 跟 ClientDataSe都放在DataModule,那不就很多資料處理都在 DataModule裡寫囉!!
這樣是正確的嗎?
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-09-18 21:28:56 IP:182.235.xxx.xxx 訂閱
看不出來錯誤在哪邊 ^ ^;

只是所有的程式都會擠在DataModule,後期會很難維護

我的習慣是專用的Form都會配一組TSQLQuery TDataSetProvider TClientDataSet
不過商業邏輯程式碼也會因此而被分散,至於怎麼寫會比較好,可能要給經驗較豐富的大師來回答了
sryang
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-09-19 08:07:06 IP:114.35.xxx.xxx 訂閱
這樣寫就對了
讓 DataModule 負責資料存取相關的動作
Form 負責 UI 互動相關的動作
( 不然幹麼要叫做 DataModule?就是希望拿來當作資料存取類別的基礎類別,而它又有元件容器的性質,
可以幫忙管理內部元件的生命週期 )

===================引 用 chris681016 文 章===================
感謝大大的指導^^
之前都用ADOQUERY在寫,所以不怎麼了解DBX的運作~~~~。
再問一下?~~~~~~~~~~~~~~
我看很多寫回資料都在DataSetProvider 跟 ClientDataSet裡面處理,尤期是 M/D 架構在連結到別的TABLE
而 DataSetProvider 跟 ClientDataSe都放在DataModule,那不就很多資料處理都在 DataModule裡寫囉!!
這樣是正確的嗎?
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
chris681016
中階會員


發表:64
回覆:117
積分:96
註冊:2006-10-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-09-19 09:31:13 IP:211.75.xxx.xxx 訂閱
 如GrandRURU所說,只是所有的程式都會擠在DataModule,後期會很難維護。
所以開多個
DataModule來做資料更新囉,不知道會不影響連線速度,不過用完就free因該還好。
感謝大大們指導教學^_________^


系統時間:2017-12-12 0:59:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!