?? udatacopy.pas
字號:
{*******************************************************}
{ 軟件名稱: --通用-- }
{ 單元名稱: DataCopy.pas }
{ 中文名稱: 數據復制類 }
{ 單元描述: }
{ 創 建: SamonHua }
{ 創建日期: 2007-12-18 }
{ 修 改: 參見VSS記錄 }
{ 版權所有 (C)2002-2007 深圳壹平臺信息技術有限公司}
{*******************************************************}
unit uDataCopy;
interface
uses
SysUtils, Classes, DB, Variants, uCommon;
type
TDataCopy = class(TComponent)
private
FTargetKey: string;
FSourceKey: string;
FTargetDataSet: TDataSet;
FSourceDataSet: TDataSet;
FAllowNoneKeyField: Boolean;
FBeforeCopyData: TNotifyEvent;
FAfterCopyData: TNotifyEvent;
FBeginCopyData: TNotifyEvent;
FEndCopyData: TNotifyEvent;
FAutoLocateRecord: boolean;
FAutoDisablePostEvent: Boolean;
FAutoDisableInsertEvent: Boolean;
FAutoDisableEditEvent: Boolean;
FUnallowModifyTargetStatus: Boolean;
{ Private declarations }
protected
{ Protected declarations }
function LocateSourceDataSet: boolean;
function LocateTargetDataSet: boolean;
public
procedure CopyCurrentData;//復制當前記錄
procedure CopyAllData;//復制所有記錄
procedure CloneAllData;//復制所有記錄,使兩個數據集數據一模一樣
{ Public declarations }
published
property SourceDataSet: TDataSet read FSourceDataSet write FSourceDataSet;
property TargetDataSet: TDataSet read FTargetDataSet write FTargetDataSet;
property SourceKey: string read FSourceKey write FSourceKey;
property TargetKey: string read FTargetKey write FTargetKey;
property AllowNoneKeyField: Boolean read FAllowNoneKeyField write FAllowNoneKeyField default False;
property BeginCopyData: TNotifyEvent read FBeginCopyData write FBeginCopyData;
property EndCopyData: TNotifyEvent read FEndCopyData write FEndCopyData;
property BeforeCopyData: TNotifyEvent read FBeforeCopyData write FBeforeCopyData;
property AfterCopyData: TNotifyEvent read FAfterCopyData write FAfterCopyData;
property AutoLocateRecord: boolean read FAutoLocateRecord write FAutoLocateRecord default false;
property AutoDisableInsertEvent: Boolean read FAutoDisableInsertEvent write FAutoDisableInsertEvent default true;
property AutoDisableEditEvent: Boolean read FAutoDisableEditEvent write FAutoDisableEditEvent default true;
property AutoDisablePostEvent: Boolean read FAutoDisablePostEvent write FAutoDisablePostEvent default true;
property UnallowModifyTargetStatus: Boolean read FUnallowModifyTargetStatus write FUnallowModifyTargetStatus default False;
constructor Create(AOwner: TComponent); override;
{ Published declarations }
end;
//procedure Register;
implementation
{procedure Register;
begin
RegisterComponents('Egov', [TDataCopy]);
end;}
{ TDataCopy }
procedure TDataCopy.CloneAllData;
var
tmpBookmark1, tmpBookmark2: TBookmark;
tmpBeforeScroll1, tmpBeforeScroll2, tmpAfterScroll1, tmpAfterScroll2,
tmpBeforeInser, tmpAfterInsert, tmpBeforeEdit, tmpAfterEdit,
tmpBeforeDelete1, tmpBeforePost, tmpAfterPost: TDataSetNotifyEvent;
i: integer;
strKeyValue: string;
begin
if Assigned(FBeginCopyData) then
FBeginCopyData(self);
FTargetDataSet.DisableControls;
FSourceDataSet.DisableControls;
tmpBookmark1 := FTargetDataSet.GetBookmark;
tmpBeforeScroll1 := FTargetDataSet.BeforeScroll;
tmpBeforeDelete1 := FTargetDataSet.BeforeDelete;
tmpAfterScroll1 := FTargetDataSet.AfterScroll;
FTargetDataSet.BeforeScroll := nil;
FTargetDataSet.AfterScroll := nil;
FTargetDataSet.BeforeDelete := nil;
tmpBookmark2 := FSourceDataSet.GetBookmark;
tmpBeforeScroll2 := FSourceDataSet.BeforeScroll;
tmpAfterScroll2 := FSourceDataSet.AfterScroll;
FSourceDataSet.BeforeScroll := nil;
FSourceDataSet.AfterScroll := nil;
if FAutoDisableInsertEvent then
begin
tmpBeforeInser := FTargetDataSet.BeforeInsert;
tmpAfterInsert := FTargetDataSet.AfterInsert;
FTargetDataSet.BeforeInsert := nil;
FTargetDataSet.AfterInsert := nil;
end;
if FAutoDisableEditEvent then
begin
tmpBeforeEdit := FTargetDataSet.BeforeEdit;
tmpAfterEdit := FTargetDataSet.AfterEdit;
FTargetDataSet.BeforeEdit := nil;
FTargetDataSet.AfterEdit := nil;
end;
if FAutoDisablePostEvent then
begin
tmpBeforePost := FTargetDataSet.BeforePost;
tmpAfterPost := FTargetDataSet.AfterPost;
FTargetDataSet.BeforePost := nil;
FTargetDataSet.AfterPost := nil;
end;
try
strKeyValue := '';
if (FSourceKey <> '') and (FSourceDataSet.FieldList.IndexOf(FSourceKey) <> -1) then
strKeyValue := FSourceDataSet.FieldByName(FSourceKey).AsString;
FTargetDataSet.First;
while not FTargetDataSet.Eof do
if not LocateSourceDataSet then
FTargetDataSet.Delete
else
FTargetDataSet.Next;
FSourceDataSet.First;
while not FSourceDataSet.Eof do
begin
if Assigned(FBeforeCopyData) then
FBeforeCopyData(self);
if LocateTargetDataSet then
FTargetDataSet.Edit
else
FTargetDataSet.Append;
for i := 0 to FSourceDataSet.FieldCount - 1 do
if FTargetDataSet.FieldList.IndexOf(FSourceDataSet.Fields[i].FieldName) <> -1 then
FTargetDataSet.FieldByName(FSourceDataSet.Fields[i].FieldName).Value := FSourceDataSet.Fields[i].Value;
FTargetDataSet.Post;
if Assigned(FAfterCopyData) then
FAfterCopyData(self);
FSourceDataSet.Next;
end;
finally
FTargetDataSet.BeforeScroll := tmpBeforeScroll1;
FTargetDataSet.AfterScroll := tmpAfterScroll1;
FTargetDataSet.BeforeDelete := tmpBeforeDelete1;
//FTargetDataSet.GotoBookmark(tmpBookmark1);
//FTargetDataSet.FreeBookmark(tmpBookmark1);
FSourceDataSet.BeforeScroll := tmpBeforeScroll2;
FSourceDataSet.AfterScroll := tmpAfterScroll2;
FSourceDataSet.GotoBookmark(tmpBookmark2);
FSourceDataSet.FreeBookmark(tmpBookmark2);
if FAutoDisableInsertEvent then
begin
FTargetDataSet.BeforeInsert := tmpBeforeInser;
FTargetDataSet.AfterInsert := tmpAfterInsert;
end;
if FAutoDisableEditEvent then
begin
FTargetDataSet.BeforeEdit := tmpBeforeEdit;
FTargetDataSet.AfterEdit := tmpAfterEdit;
end;
if FAutoDisablePostEvent then
begin
FTargetDataSet.BeforePost := tmpBeforePost;
FTargetDataSet.AfterPost := tmpAfterPost;
end;
FTargetDataSet.EnableControls;
FSourceDataSet.EnableControls;
if FAutoLocateRecord then
FTargetDataSet.Locate(FTargetKey, strKeyValue, [loCaseInsensitive]);
if Assigned(FEndCopyData) then
FEndCopyData(self);
end;
end;
procedure TDataCopy.CopyAllData;
var
tmpBookmark1, tmpBookmark2: TBookmark;
tmpBeforeScroll1, tmpBeforeScroll2, tmpAfterScroll1, tmpAfterScroll2,
tmpBeforeInser, tmpAfterInsert, tmpBeforeEdit, tmpAfterEdit,
tmpBeforePost, tmpAfterPost: TDataSetNotifyEvent;
i: integer;
strKeyValue: string;
begin
if Assigned(FBeginCopyData) then
FBeginCopyData(self);
FTargetDataSet.DisableControls;
FSourceDataSet.DisableControls;
tmpBookmark1 := FTargetDataSet.GetBookmark;
tmpBeforeScroll1 := FTargetDataSet.BeforeScroll;
tmpAfterScroll1 := FTargetDataSet.AfterScroll;
FTargetDataSet.BeforeScroll := nil;
FTargetDataSet.AfterScroll := nil;
tmpBookmark2 := FSourceDataSet.GetBookmark;
tmpBeforeScroll2 := FSourceDataSet.BeforeScroll;
tmpAfterScroll2 := FSourceDataSet.AfterScroll;
FSourceDataSet.BeforeScroll := nil;
FSourceDataSet.AfterScroll := nil;
if FAutoDisableInsertEvent then
begin
tmpBeforeInser := FTargetDataSet.BeforeInsert;
tmpAfterInsert := FTargetDataSet.AfterInsert;
FTargetDataSet.BeforeInsert := nil;
FTargetDataSet.AfterInsert := nil;
end;
if FAutoDisableEditEvent then
begin
tmpBeforeEdit := FTargetDataSet.BeforeEdit;
tmpAfterEdit := FTargetDataSet.AfterEdit;
FTargetDataSet.BeforeEdit := nil;
FTargetDataSet.AfterEdit := nil;
end;
if FAutoDisablePostEvent then
begin
tmpBeforePost := FTargetDataSet.BeforePost;
tmpAfterPost := FTargetDataSet.AfterPost;
FTargetDataSet.BeforePost := nil;
FTargetDataSet.AfterPost := nil;
end;
try
strKeyValue := '';
if (FSourceKey <> '') and (FSourceDataSet.FieldList.IndexOf(FSourceKey) <> -1) then
strKeyValue := FSourceDataSet.FieldByName(FSourceKey).AsString;
FSourceDataSet.First;
while not FSourceDataSet.Eof do
begin
if Assigned(FBeforeCopyData) then
FBeforeCopyData(self);
if LocateTargetDataSet then
FTargetDataSet.Edit
else
FTargetDataSet.Insert;
for i := 0 to FSourceDataSet.FieldCount - 1 do
if FTargetDataSet.FieldList.IndexOf(FSourceDataSet.Fields[i].FieldName) <> -1 then
FTargetDataSet.FieldByName(FSourceDataSet.Fields[i].FieldName).Value := FSourceDataSet.Fields[i].Value;
FTargetDataSet.Post;
if Assigned(FAfterCopyData) then
FAfterCopyData(self);
FSourceDataSet.Next;
end;
finally
FTargetDataSet.BeforeScroll := tmpBeforeScroll1;
FTargetDataSet.AfterScroll := tmpAfterScroll1;
//FTargetDataSet.GotoBookmark(tmpBookmark1);
//FTargetDataSet.FreeBookmark(tmpBookmark1);
FSourceDataSet.BeforeScroll := tmpBeforeScroll2;
FSourceDataSet.AfterScroll := tmpAfterScroll2;
FSourceDataSet.GotoBookmark(tmpBookmark2);
FSourceDataSet.FreeBookmark(tmpBookmark2);
if FAutoDisableInsertEvent then
begin
FTargetDataSet.BeforeInsert := tmpBeforeInser;
FTargetDataSet.AfterInsert := tmpAfterInsert;
end;
if FAutoDisableEditEvent then
begin
FTargetDataSet.BeforeEdit := tmpBeforeEdit;
FTargetDataSet.AfterEdit := tmpAfterEdit;
end;
if FAutoDisablePostEvent then
begin
FTargetDataSet.BeforePost := tmpBeforePost;
FTargetDataSet.AfterPost := tmpAfterPost;
end;
FTargetDataSet.EnableControls;
FSourceDataSet.EnableControls;
if FAutoLocateRecord then
FTargetDataSet.Locate(FTargetKey, strKeyValue, [loCaseInsensitive]);
if Assigned(FEndCopyData) then
FEndCopyData(self);
end;
end;
procedure TDataCopy.CopyCurrentData;
var
i: Integer;
tmpBeforeInser, tmpAfterInsert, tmpBeforeEdit, tmpAfterEdit,
tmpBeforePost, tmpAfterPost: TDataSetNotifyEvent;
begin
if Assigned(FBeginCopyData) then
FBeginCopyData(self);
FTargetDataSet.DisableControls;
if FAutoDisableInsertEvent then
begin
tmpBeforeInser := FTargetDataSet.BeforeInsert;
tmpAfterInsert := FTargetDataSet.AfterInsert;
FTargetDataSet.BeforeInsert := nil;
FTargetDataSet.AfterInsert := nil;
end;
if FAutoDisableEditEvent then
begin
tmpBeforeEdit := FTargetDataSet.BeforeEdit;
tmpAfterEdit := FTargetDataSet.AfterEdit;
FTargetDataSet.BeforeEdit := nil;
FTargetDataSet.AfterEdit := nil;
end;
if FAutoDisablePostEvent then
begin
tmpBeforePost := FTargetDataSet.BeforePost;
tmpAfterPost := FTargetDataSet.AfterPost;
FTargetDataSet.BeforePost := nil;
FTargetDataSet.AfterPost := nil;
end;
try
if Assigned(FBeforeCopyData) then
FBeforeCopyData(self);
if LocateTargetDataSet then
FTargetDataSet.Edit
else
FTargetDataSet.Insert;
for i := 0 to FSourceDataSet.FieldCount - 1 do
if FTargetDataSet.FieldList.IndexOf(FSourceDataSet.Fields[i].FieldName) <> -1 then
FTargetDataSet.FieldByName(FSourceDataSet.Fields[i].FieldName).Value := FSourceDataSet.Fields[i].Value;
FTargetDataSet.Post;
if Assigned(FAfterCopyData) then
FAfterCopyData(self);
finally
if FAutoDisableInsertEvent then
begin
FTargetDataSet.BeforeInsert := tmpBeforeInser;
FTargetDataSet.AfterInsert := tmpAfterInsert;
end;
if FAutoDisableEditEvent then
begin
FTargetDataSet.BeforeEdit := tmpBeforeEdit;
FTargetDataSet.AfterEdit := tmpAfterEdit;
end;
if FAutoDisablePostEvent then
begin
FTargetDataSet.BeforePost := tmpBeforePost;
FTargetDataSet.AfterPost := tmpAfterPost;
end;
FTargetDataSet.EnableControls;
if Assigned(FEndCopyData) then
FEndCopyData(self);
end;
end;
constructor TDataCopy.Create(AOwner: TComponent);
begin
inherited;
FAutoLocateRecord := false;
FAutoDisableInsertEvent := true;
FAutoDisableEditEvent := true;
FAutoDisablePostEvent := true;
FUnallowModifyTargetStatus := false;
end;
function TDataCopy.LocateSourceDataSet: boolean;
var
strFieldName: string;
i: integer;
varLocateValues: Variant;
begin
Result := False;
if FSourceKey = '' then
if FAllowNoneKeyField then
exit
else
raise Exception.Create('未設置關鍵字段,不能正確定位記錄。');
if Pos(';', FSourceKey) = 0 then
Result := FSourceDataSet.Locate(FSourceKey, FTargetDataSet.FieldByName(FTargetKey).AsString, [])
else
begin
if SubStrCount(FSourceKey) <> SubStrCount(FTargetKey) then
raise Exception.Create('來源和目的數據集關鍵字段數量不一致,不能正確定位記錄。');
varLocateValues := VarArrayCreate([0, SubStrCount(FTargetKey)], varVariant);
for i := 0 to SubStrCount(FTargetKey) do
begin
strFieldName := CopySubStr(FTargetKey, i);
varLocateValues[i] := VarToStr(FTargetDataSet.FieldByName(strFieldName).Value);
end;
result := FSourceDataSet.Locate(FSourceKey, varLocateValues, [loCaseInsensitive]);
end;
end;
function TDataCopy.LocateTargetDataSet: boolean;
var
strFieldName: string;
i: integer;
varLocateValues: Variant;
begin
Result := false;
if FTargetKey = '' then
if FAllowNoneKeyField then
exit
else
raise Exception.Create('未設置關鍵字段,不能正確定位記錄。');
if Pos(';', FTargetKey) = 0 then
Result := FTargetDataSet.Locate(FTargetKey, FSourceDataSet.FieldByName(FSourceKey).AsString, [])
else
begin
if SubStrCount(FSourceKey) <> SubStrCount(FTargetKey) then
raise Exception.Create('來源和目的數據集關鍵字段數量不一致,不能正確定位記錄。');
varLocateValues := VarArrayCreate([0, SubStrCount(FSourceKey)], varVariant);
for i := 0 to SubStrCount(FSourceKey) do
begin
strFieldName := CopySubStr(FSourceKey, i);
varLocateValues[i] := VarToStr(FSourceDataSet.FieldByName(strFieldName).Value);
end;
result := FTargetDataSet.Locate(FTargetKey, varLocateValues, [loCaseInsensitive]);
end;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -