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

TClientDataSet.Delta內容問題

答題得分者是:sryang
max5020
資深會員


發表:26
回覆:275
積分:320
註冊:2003-06-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-12-22 12:35:17 IP:122.146.xxx.xxx 訂閱
目前使用TQuery - TProvider - TClientDataSet,
操作資料維護, 因為要依據資料異動內容,
更新部份Table,
所以想從TClientDataSet.Delta取得異動資料,
Code如下:

[code delphi]
qWork:= TClientDataSet.Create(self);
ts:= TStringList.Create;
ts.Clear;
qWork.Data:= DataSet_Detail.Delta;
qWork.First;
while not qWork.Eof do
begin
if qWork.UpdateStatus=usModified then ts.Add('usModified');
if qWork.UpdateStatus=usDeleted then ts.Add('usDeleted');
if qWork.UpdateStatus=usInserted then ts.Add('usInserted');
if qWork.UpdateStatus=usUnModified then ts.Add('usUnModified');
for i:= 0 to qWork.FieldCount- 1 do
begin
s:= qWork.Fields[i].FieldName ': ';
s:= s 'OldValue= ';
if VarIsNull(qWork.Fields[i].OldValue)
then s:= s 'NULL'
else
begin
s1:= qWork.Fields[i].OldValue;
s:= s s1;
end;

s:= s ', Value= ';
if VarIsNull(qWork.Fields[i].Value)
then s:= s 'NULL'
else
begin
s1:= qWork.Fields[i].Value;
s:= s s1;
end;
ts.Add(s);
end;
ts.Add('-----------------------------------');
qWork.Next;
end;
s:= 'c:\' FormatDateTime('hhnnss', Now) '.txt';
ts.SaveToFile(s);
ts.Free;
qWork.Destroy;

[/code]

但是取得的結果如下:
usUnModified
upb_kind: OldValue= P1, Value= P1
upb_no: OldValue= 091122A011, Value= 091122A011
upb_seq: OldValue= 5, Value= 5
upb_partNo: OldValue= IR 354020.5 - JNS, Value= IR 354020.5 - JNS
upb_qty: OldValue= 130, Value= 130
upb_price: OldValue= 0, Value= 0
upb_priceNTD: OldValue= 72.8, Value= 72.8
upb_ordNo: OldValue= NULL, Value= NULL
upb_rem: OldValue= NULL, Value= NULL
upb_tax: OldValue= NULL, Value= NULL
upb_backNo: OldValue= NULL, Value= NULL
upb_backQty: OldValue= 0, Value= 0
upb_price1: OldValue= 130, Value= 130
upb_discount: OldValue= 56, Value= 56
upb_sample: OldValue= N, Value= N
upb_cost: OldValue= 72.8, Value= 72.8
-----------------------------------
usModified
upb_kind: OldValue= NULL, Value= NULL
upb_no: OldValue= NULL, Value= NULL
upb_seq: OldValue= NULL, Value= NULL
upb_partNo: OldValue= NULL, Value= NULL
upb_qty: OldValue= 115, Value= 115
upb_price: OldValue= NULL, Value= NULL
upb_priceNTD: OldValue= NULL, Value= NULL
upb_ordNo: OldValue= NULL, Value= NULL
upb_rem: OldValue= NULL, Value= NULL
upb_tax: OldValue= NULL, Value= NULL
upb_backNo: OldValue= NULL, Value= NULL
upb_backQty: OldValue= NULL, Value= NULL
upb_price1: OldValue= NULL, Value= NULL
upb_discount: OldValue= NULL, Value= NULL
upb_sample: OldValue= NULL, Value= NULL
upb_cost: OldValue= NULL, Value= NULL
-----------------------------------
為何異動1筆, Detla卻有2筆,
如何使第2筆的OldValue存在舊值??


sryang
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-12-22 17:22:05 IP:59.125.xxx.xxx 訂閱
沒有錯。Update 一筆,Delta 就有兩筆;Insert 或是 Delete 的話,Delta 就是一筆

usUnModified 那一
筆就是 old value,usModified 那一筆筆資料中「不是 null」或是「(是 null) and (usUnModified 那一筆中不是 null)」的欄位,是「有修改過的欄位」的 new value
所以你要先把 Unmodified 的那一筆暫存下來,遇到 usModified 的時候,與先前存下來的做比對,找出有修改的欄位,組成 UPDATE 中的 SET 部份


------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2009-12-22 17:24:10, 註解 補充說明‧
Jasonwong
版主


發表:49
回覆:918
積分:558
註冊:2006-10-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-12-22 17:25:44 IP:210.202.xxx.xxx 訂閱

[code delphi]
ClientDataSet2.Data:= ClientDataSet1.Delta;
ClientDataSet2.MergeChangeLog;

[/code]
ClientDataSet2.Data 就是你要的內容
------
http://www.cobbler.tw

聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
sryang
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-12-22 21:37:17 IP:124.10.xxx.xxx 訂閱
MergeChangeLog 之後,就不知道那一筆資料是新增的,那一筆資料是修改的了
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
系統時間:2017-12-14 14:21:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!