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

有關BeforeUpdateRecord的問題

尚未結案
sundy6719
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-17 22:41:47 IP:211.74.xxx.xxx 未訂閱
以下是我的程式碼 procedure TDM.dspMasterBeforeUpdateRecord(Sender: TObject;   SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;   UpdateKind: TUpdateKind; var Applied: Boolean); var qyTemp:TSQLQuery;     i:Integer;     Str1,Str2:String; begin qyTemp:=TSQLQuery.Create(self); qyTemp.SQLConnection:=dm.SC;   case UpdateKind of   ukInsert:begin   Str1:='Insert into 會員 ';   Str2:='(';     for i:=0 to DeltaDS.fieldcount-1 do     begin        if (pfInUpdate in DeltaDS.Fields.Fields[i].ProviderFlags) then        Str2:=Str2+DeltaDS.Fields.Fields[i].FieldName+',';     end;   Str2:=Copy(Str2,1,Length(Str2)-1)+')';   Str1:=Str1+Str2+' Values ';   str2:='(';      for i:=0 to deltaDS.FieldCount -1 do      begin        if (pfInUpdate in DeltaDS.Fields.Fields[i].ProviderFlags) then        Str2:=Str2+':'+DeltaDS.Fields.Fields[i].FieldName+',';      end;   Str2:=copy(Str2,1,Length(Str2)-1)+')';   Str1:=Str1+Str2;   showmessage(Str1);   qyTemp.SQL.Text:=Str1; with qyTemp do begin parambyname('UserID').Value:=DeltaDS.fieldbyname('UserID').NewValue; parambyname('Name').Value:=DeltaDS.fieldbyname('Name').NewValue; parambyname('Sex').Value:=DeltaDS.fieldbyname('Sex').NewValue; parambyname('Tel').Value:=DeltaDS.fieldbyname('Tel').NewValue; parambyname('Cell').Value:=DeltaDS.fieldbyname('Cell').NewValue; parambyname('Address').Value:=DeltaDS.fieldbyname('Address').NewValue; execSQL(False); end; 然後執行會出現以下的警告視窗
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-17 23:22:13 IP:203.204.xxx.xxx 未訂閱
引言: 以下是我的程式碼
procedure TDM.dspMasterBeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
  UpdateKind: TUpdateKind; var Applied: Boolean);
var qyTemp:TSQLQuery;
    i:Integer;
    Str1,Str2:String;
begin
qyTemp:=TSQLQuery.Create(self);
qyTemp.SQLConnection:=dm.SC;
  case UpdateKind of
  ukInsert:begin
  Str1:='Insert into 會員 ';
  Str2:='(';
    for i:=0 to DeltaDS.fieldcount-1 do
    begin
       if (pfInUpdate in DeltaDS.Fields.Fields[i].ProviderFlags) then
       Str2:=Str2+DeltaDS.Fields.Fields[i].FieldName+',';
    end;
  Str2:=Copy(Str2,1,Length(Str2)-1)+')';
  Str1:=Str1+Str2+' Values ';
  str2:='(';
     for i:=0 to deltaDS.FieldCount -1 do
     begin
       if (pfInUpdate in DeltaDS.Fields.Fields[i].ProviderFlags) then
       Str2:=Str2+':'+DeltaDS.Fields.Fields[i].FieldName+',';
     end;
  Str2:=copy(Str2,1,Length(Str2)-1)+')';
  Str1:=Str1+Str2;
  showmessage(Str1);
  qyTemp.SQL.Text:=Str1;
with qyTemp do
begin
parambyname('UserID').Value:=DeltaDS.fieldbyname('UserID').NewValue;
parambyname('Name').Value:=DeltaDS.fieldbyname('Name').NewValue;
parambyname('Sex').Value:=DeltaDS.fieldbyname('Sex').NewValue;
parambyname('Tel').Value:=DeltaDS.fieldbyname('Tel').NewValue;
parambyname('Cell').Value:=DeltaDS.fieldbyname('Cell').NewValue;
parambyname('Address').Value:=DeltaDS.fieldbyname('Address').NewValue;
execSQL(False);
end;
然後執行會出現以下的警告視窗
個人覺得您多寫這一段是錯的, 因為DataSetProvider會幫您Update資料, 由於新增了相同Key值的資料, 以致造成此Table的PK重複. <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
sundy6719
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-18 01:11:40 IP:211.74.xxx.xxx 未訂閱
我是參考書中所說的如果在TDataSetProvider元件中的OnBeforeUpdateRecord事件中撰寫任一程式碼的話那麼Tdatasetprovider元件就會認定我們是要自己去處理更新資料的細節所以它就不會在去自己組合sql敘述來幫我們更新資料 而我有試過了真的如您所說的變成了二筆資料所以造成重覆的KEY值加入那麼我要怎麼做還是我的觀念有問題
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-18 02:04:35 IP:203.204.xxx.xxx 未訂閱
引言: 我是參考書中所說的如果在TDataSetProvider元件中的OnBeforeUpdateRecord事件中撰寫任一程式碼的話那麼Tdatasetprovider元件就會認定我們是要自己去處理更新資料的細節所以它就不會在去自己組合sql敘述來幫我們更新資料 而我有試過了真的如您所說的變成了二筆資料所以造成重覆的KEY值加入那麼我要怎麼做還是我的觀念有問題
DataSetProvder會不會幫我們更新資料,不是看事件中是否有寫任何程式碼來決定,是看你有沒有設定事件傳入的參數Applied 是True還是False來決定的。 因此在OnBeforeUpdateRecord事件中除了可以改變更新資料的內容外,若程式中已自行處理好更新的動作的話,要把Applied設為True,表示已處理好更新的動作了,如此DataSetProvider就不會再次的更新資料了。 _______________________________________ 深藍的魚,祝您好運..........連連
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-30 13:44:14 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

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