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

請問如何在UPDATE一個table的某筆數據時同步寫入另一table

尚未結案
terran_wang
一般會員


發表:9
回覆:14
積分:4
註冊:2005-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-08 18:51:22 IP:218.4.xxx.xxx 未訂閱
各位先進好,小弟剛接觸delphi不久,第一次提問,還請各位多多指教。 想在A表有更新時(包括insert與update)同步將數據寫入一個結構一模一樣的B表中,來達到一個可以查看異動記錄的目的,不知如何才能做到,請各位大大指教。 發表人 - terran_wang 於 2005/04/08 18:54:12
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-08 19:50:17 IP:222.78.xxx.xxx 未訂閱
您好!您可以在dataset的afterpost事件中寫code把數據插入到另一個表,用datasource1.DataSet.State=dsInsert(dsEdit)等來判斷新增或修改狀態。 發表人 - oktony 於 2005/04/08 19:58:11 發表人 - oktony 於 2005/04/08 19:58:54
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-09 09:03:47 IP:202.62.xxx.xxx 未訂閱
您好﹗    如果是使用資料集元件的Insert/Edit/Post方法來更新資料﹐可使用如下方法來將更新的資料同步新增到另一個資料表中﹒
以下步驟以ADO存取為例﹒
在對應原始資料表的資料集元件的BeforePost事件中﹐利用一個變數記錄下當前資料的鍵值欄位值﹒在AfterPost事件中﹐在對應同步新增資料表(目標資料表)的資料集元件中﹐將原始資料表中被Post的資料利用先前記錄下的變數值再新增進來﹒
Private
  S: String; //宣告變數(假設為字串形態)    ADOTable1元件的BeforePost事件中(假設ADOTable1對應原始資料表)
begin
  S := ADOTable1.Fields.FieldByName('鍵值欄位名').AsString;
end;    ADOTable1元件的AfterPost事件中(假設ADOQuery1對應目標資料表)
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('Insert Into 目標資料表 Select * From ');
  ADOQuery1.SQL.Add('原始資料表 Where 鍵值欄位 = :STemp');
  ADOQuery1.Parameters.ParamByName('STep').Value := S;
  ADOQuery1.ExecSQL;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
wct
一般會員


發表:5
回覆:17
積分:4
註冊:2002-06-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-09 10:45:14 IP:220.229.xxx.xxx 未訂閱
您好, 若是您之資料庫支援Trigger的話,針對該Table撰寫Trigger來攔截欲Insert Or Update之資料(Before Insert,After Insert,Or Before Update,After Update),將資Insert入相同結構之另一Table,並在該Table新增一DateTime欄位,Default 值為"Now"(Insert時之系統時間)來記錄何時被新增或修改, 此種方法之好處是可以不Care應用程式在哪裡,只要有人動過該Table都會紀錄到另一Table中。 wct
terran_wang
一般會員


發表:9
回覆:14
積分:4
註冊:2005-03-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-09 14:18:44 IP:218.4.xxx.xxx 未訂閱
感謝各位前輩指點,特別是cashxin2002前輩給出的代碼已經解決了我的問題,wct前輩也給我指出了另一個方向,只是手頭的項目還不需要達到這樣的要求,所以沒有嘗試,再次感謝大家的幫助,謝謝。
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-09 20:36:30 IP:218.5.xxx.xxx 未訂閱
cashxin2002前輩總是很熱心詳細地回答別人的問題呵呵。
terran_wang
一般會員


發表:9
回覆:14
積分:4
註冊:2005-03-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-12 13:35:32 IP:218.4.xxx.xxx 未訂閱
大家好,剛剛嘗試了WCT前輩所指出的方向,發現比cashxin2002前輩的實現方法更加方便,且功能更強,貼出來給大家參考一下。 我使用SQL2000,有test與test2兩張table,在test中創建一個trigger,代碼如下: CREATE TRIGGER [SAVE_LOG] ON [dbo].[TEST] FOR INSERT, UPDATE AS UPDATE TEST SET UPDATE_TIME=GETDATE() WHERE ID=(SELECT ID FROM INSERTED) INSERT INTO TEST2 SELECT * FROM TEST WHERE ID= (SELECT ID FROM INSERTED) 因為沒辦法只在test2中加入update_time項(從test插入時會提示欄位不正確),所以只能在test中也加入該項,並在每次更新時填入最新的系統時間,然後再將這一行整個插入test2,大家如果有更好的辦法請指點,謝謝。
系統時間:2024-05-19 22:06:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!