線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4906
推到 Plurk!
推到 Facebook!

關於ClientDataSet的存取OldValue,CurValue,NewValue的問題

答題得分者是:ccchen
chinliang
一般會員


發表:16
回覆:26
積分:13
註冊:2002-06-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-09-25 20:10:00 IP:210.243.xxx.xxx 未訂閱
關於ClientDataSet的存取OldValue,CurValue,NewValue的問題    小弟目前在寫多人存取資料庫,所可能發生對同一筆記錄作刪除及修改的問題 的錯誤處理,小弟的問題是若使用TQuery元件即無法存取CurValue,但是使用 Table即可,但是想請教是否有方法可以使TQuery可存取CurValue,當發生錯 誤時,使用TTable元件的會產生"Record not found or changed by another  user",接著會開啟我寫的ReconcileError Dialog,但使用TQuery時尚 出"Unable to find record. No key specified."的錯誤,就無法抓出 CurValue,小弟想是不是TQuery要指定KEY值,但要如何指定?敘述如下,望請 各位先進不吝指教,謝謝。    錯誤處理作法: 在ClientDataSet1的OnReconcileError內寫入錯誤處理程序如 下:   Action:= HandleReconcileError(DataSet, UpdateKind, E);    並開啟一ReconcileError Dialog,顯示三個欄位為: 1. New Value :     欲輸入資料庫的值 2. Conflict Value: 衝突的值,意即為CurValue,為其他使用                    者已寫入資料庫的值 3. Old Value:      原始下載至Client端的值    連接方式1(使用TABLE元件):可成功執行    Database1 --> Table1 -->  DataSetProvider1 --> ClientDataSet1    連接方式2(使用TQUERY元件):無法抓出CurValue值    Database1 --> TQuery1 -->  DataSetProvider1 --> ClientDataSet1
範例如下:
=====================================
欄位名稱:           ID    PW    Dep
                    =================
原始資料:           Mary  123   MIS 
=====================================
操作流程: 1. 使用者A改成: Mary 456 ACC 2. 使用者B改成: Mary 789 CUS 但產生ReconcileError事件, 因被使 用者A修改過了,隨即顯示ReconcileError Dialog,抓出如下值:
欄位名稱  New Value  Conflict Value(CurValue)  Old Value 
=========================================================          
ID        Mary         Mary                    Mary 
PW        789          456                     123
Dep       CUS          ACC                     MIS
簡而言之,就是上面的Conflict Value如果使用TQuery,根本沒辦法抓出,不知 各位先進是否有解決辦法? 註: 除了無法抓出CurValue外,當然也沒有辦法依照使用者所選的的Reconcile 方式(如: raCorrect,raMerage)來作處理。 謝謝你花時間看完,也請了解的先進不吝指教,再次謝謝。
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-09-26 07:46:52 IP:61.219.xxx.xxx 未訂閱
將DataSetProvider之UpdateMode設為upWherekeyOnly 再將key欄位設為pinKey(doubleclick TQuery->選取field->於Object Inspector中providerFlag設pInkey為True)
chinliang
一般會員


發表:16
回覆:26
積分:13
註冊:2002-06-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-09-27 20:00:36 IP:210.243.xxx.xxx 未訂閱
對不起,因這一二天在忙其他的事,故比較晚回覆,再次感謝熱 心的版主先進,上次也是問了一個關於DBGrid顯示MEMO欄位的問 題,也是版主幫忙,真是銘感五內。 依照版主所指示,設定完後果然是可以的,查了一下HELP才了解 UpdateMode屬性的意義為"Controls how the provider locates records when applying updates",倘若是在沒有人在使用者之 前變更的話,設UpdateWhereAll是不會有問題的,在Query內,把 欄位的providerFlag內的pInkey的屬性設為True即設定Key值,不 知是否觀念正確? 但是想到一個問題想請教版主,今天在發生使用者重複對一記錄 作修改及其他動作時,若發現有被其他使用者修改的話,理應秀 出ReconcileError Dialog讓使用者知道別人已經對此記錄作了異 動,但是在使用上述方法下,並無法像使用TTable元件,觸發Clien tDataSet內的OnReconcileError事件,於是我想了一個方法,一開 始都不按照版主的設定,在第二個使用者重複編輯同一記錄,在 Client端呼叫ClientDataSet的ApplyUpdates時,因為找不到該記錄 ,故觸發了DataSetProvider的OnUpdateError,然後在這裡動態的設 定UpdateMode為upWhereKeyOnly,動態的指定Key值,然後便會觸發 ClientDataSet的OnReconcileError事件,跳出預先設計好的Reconcile Error Dialog,讓使用者知道這個記錄已經被修改過,然後再決定 如何處理,不知這樣的作法是正確的嗎,還是會有什麼問題?若沒有 問題的話,這幾天就想要照這個方法給他做下去了。 也請各位先進能指導一下,如何做好錯誤處理,因為以前寫程式都 不太注意錯誤的處理,所以並沒有很強的概念,謝謝。
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-09-28 09:42:17 IP:203.217.xxx.xxx 未訂閱
基本上是沒有什麼不可以, 不過程式應力求簡單自然, 繞圈子的邏輯你寫的時候沒問題, 將來維護就很辛苦了
chinliang
一般會員


發表:16
回覆:26
積分:13
註冊:2002-06-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-09-28 10:01:52 IP:211.73.xxx.xxx 未訂閱
可是因為要秀出錯誤訊息的Dialog好像就只有這個方法, 所以再想不出辦法前,可能還是要硬著頭皮潦落去,如果 使用TTable元件,錯誤一定是會發生在ClientDataSet內 ,當然就沒有這些問題了,所以針對TQuery的作法可能先 暫時這樣處理了,雖然也明知道這樣好像是繞來繞去的, 但是也沒有理想的辦法,謝謝版主的指教,再次感謝。 實作上如果有任何問題再請教各位先進,謝謝。
legon
一般會員


發表:1
回覆:13
積分:2
註冊:2002-09-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-10-05 11:09:01 IP:211.97.xxx.xxx 未訂閱
唳翋ㄛchinliang倗ㄩ 扂妏蚚ADOㄛʊ脯ㄛ[坻ロ錶⺼chinliang垀扴ㄛ筍岆curValue睿oldalue飲岆nil(峈煦饜ㄘ,墅岈ㄛ峈睡ˋ
chinliang
一般會員


發表:16
回覆:26
積分:13
註冊:2002-06-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-10-06 20:49:06 IP:211.73.xxx.xxx 未訂閱
legon兄你好: 我不是用ADO的,所以不知道,但是我覺得OldValue不可能存取不到,因為資料在Client端,所以我覺得是不是沒設定好? 至於CurValue則可能因為被其他使用者異動,若無按照版主的方式,設定主鍵值,有可能沒辦法在回資料庫查時,LOCATE到該筆記錄,故無法存取該筆記錄的CurValue,請參考參考.
sundy6719
初階會員


發表:136
回覆:78
積分:42
註冊:2002-07-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-06 01:32:16 IP:211.74.xxx.xxx 未訂閱
怎麼才有辦法顯示CurValue呢 我是使用dbexpress和內定的的reconcile error對話盒 可是無法顯示CurValue的值
系統時間:2024-04-19 18:50:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!