如何恢复已被变更的数据? |
尚未結案
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
elvis1000
一般會員 發表:6 回覆:50 積分:16 註冊:2004-12-18 發送簡訊給我 |
你可以把所有的動作都變成數據紀錄起來。例如:
增加用「1」代表,刪除用「2」代表,修改用「3」代表。
修改第5筆「名稱」為「xxx」可記為(3,5,1,'xxx') Type
TDo=record
act:integer;
RecNo:integer;
FieldNo:integer;
Memo1,Memo2,memo3:string[10];
end;
PDo=^TDo; Var
DoWhat:array[0..99] of PDo; 這樣這可以記錄了,或者你也可以用堆疊的。 -----------------------
God bless you!
I am Dark_Angel.
------
----------------------- God bless you! I am Dark_Angel. |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
elvis1000
一般會員 發表:6 回覆:50 積分:16 註冊:2004-12-18 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
elvis1000
一般會員 發表:6 回覆:50 積分:16 註冊:2004-12-18 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
elvis1000
一般會員 發表:6 回覆:50 積分:16 註冊:2004-12-18 發送簡訊給我 |
說起來簡單,做起來很難。如果要記錄動作,就必須監控整個功能按鍵的變化,一開始可能要加入一些監控的變數,例如:
Var DoWhat:integer; // 用來記錄動作的類別 IsDoing:boolean; //正在動作如果要記錄新動作,就先存舊動作。 動作的監控,就落在onClick & OnDataChange上了! 這只是初步構想,應該要實做,才能發現還有什麼問題! ----------------------- God bless you! I am Dark_Angel.
------
----------------------- God bless you! I am Dark_Angel. |
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
大大帮看看思路对不对:
(1)
在数据库创建一个表tmp
field 1: RecNo
field 2: 變更的動作編號
field 3: 變更的欄位編號
field 4: 變更的欄位值
field 5: 变更的表名 (2)
设置tmpdataset与该表连接,相关字段:
field 1: RecNo
field 2: 變更的動作編號
field 3: 變更的欄位編號
field 4: 變更的欄位值 这应该用个栏位数组吧,比如一次更改一条记录的好几个字段怎么办
field 5: 变更的表名 (3)在修改的数据集dataset的每个字段的ondatachange事件中将原数据和对应字段的值填入dataset1
(4)
回退操作:
if update
更新对应字段的值
if insert
则删除插入的值
if del
则插入对应的值
|
elvis1000
一般會員 發表:6 回覆:50 積分:16 註冊:2004-12-18 發送簡訊給我 |
經過一番實驗,已經達成下列功能:
1. 抓到按鍵改變
2. 抓到資料編輯的值(雖然是編輯後的值,編輯前的值應該不難)
3. 記錄下動作 (暫時記錄在ListBox)
unit MainU; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, MyLib, Grids, DBGrids, ExtCtrls, DB, DBClient, Buttons, StdCtrls; type TMainForm = class(TForm) Table: TClientDataSet; DataSource: TDataSource; Panel1: TPanel; DBGrid: TDBGrid; BuAdd: TSpeedButton; BuDel: TSpeedButton; Panel2: TPanel; ListBox: TListBox; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure BuAddClick(Sender: TObject); procedure BuDelClick(Sender: TObject); procedure DataSourceStateChange(Sender: TObject); private { Private declarations } public { Public declarations } procedure SaveAct; end; type TAct=(aNone,aAdd,aDel,aModify); TState=(sNone,sDoing,sSave); TActRec=Record ActKind:TAct; RecNo:integer; Field:string[20]; memo:string[20]; end; var MainForm: TMainForm; Const MyName='Elvis Tsai'; MyCoName='Dark Angel'; ProgName='Test'; Var ProgPath, TempPath:string; Act:TAct; State:TState; ActRec:TActRec; implementation {$R *.DFM} procedure TMainForm.FormCreate(Sender: TObject); begin Application.Title:=ProgName; ProgPath:=ExtractFilePath(Application.ExeName); TempPath:=GetTemporaryPath; //OBJ //Const Act:=aNone; State:=sNone; ListBox.Clear; //Others Table.LoadFromFile('Data.cds'); end; procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin //OBJ //Others //Table.SaveToFile('Data.cds'); end; procedure TMainForm.BuAddClick(Sender: TObject); begin //Save Old if State<>sNone then SaveAct; //Do Insert State:=sDoing; Act:=aAdd; Table.Insert; Table.FieldByName('RecNo').AsInteger:=Table.RecordCount 1; Table.UpdateRecord; ActRec.ActKind:=Act; ActRec.RecNo:=Table.FieldByName('RecNo').AsInteger; ActRec.Field:='-'; ActRec.memo:='-'; //Save Old SaveAct; State:=sNone; Act:=aNone; end; procedure TMainForm.SaveAct; var s:string; begin s:=''; case Act of aNone: begin s:='0,-,-'; end; aAdd: begin s:='1,' intToStr(ActRec.RecNo) ',' ActRec.Field ',' ActRec.memo; end; aDel: begin s:='2,' intToStr(ActRec.RecNo) ',' ActRec.Field ',' ActRec.memo; end; aModify: begin s:='3,' intToStr(ActRec.RecNo) ',' ActRec.Field ',' ActRec.memo; end; end;//case ListBox.Items.Add(s); State:=sNone; Act:=aNone; end; procedure TMainForm.BuDelClick(Sender: TObject); begin //Save Old if State<>sNone then SaveAct; //Do Insert State:=sDoing; Act:=aDel; ActRec.ActKind:=Act; ActRec.RecNo:=Table.FieldByName('RecNo').AsInteger; ActRec.Field:=Table.FieldByName('Name').DisplayName; ActRec.memo:=Table.FieldByName('Name').AsString;; Table.Delete; //Save Old SaveAct; State:=sNone; Act:=aNone; end; procedure TMainForm.DataSourceStateChange(Sender: TObject); begin if (State=sNone) and (Table.State=dsEdit) then begin State:=sDoing; Act:=aModify; ActRec.ActKind:=Act; ActRec.RecNo:=Table.FieldByName('RecNo').AsInteger; ActRec.Field:=DbGrid.SelectedField.DisplayName; ActRec.memo:=DbGrid.SelectedField.AsString; SaveAct; end;//if end; end.----------------------- God bless you! I am Dark_Angel.
------
----------------------- God bless you! I am Dark_Angel. |
elvis1000
一般會員 發表:6 回覆:50 積分:16 註冊:2004-12-18 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |