程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi7實現添加記錄的“攜帶”實現

Delphi7實現添加記錄的“攜帶”實現

編輯:Delphi

在數據庫管理系統中,數據錄入是數據處理的基本功能,錄入操作方便與否是衡量數據庫應用程序交互良莠的指標之一。錄入中除了應要對錄入數據進行合法檢驗外,還應為用戶提供更多的方便操作,即對於“規范性”數據,如:性別、職稱等字段的數據,應盡可能供用戶“選擇”錄入,而非直接文字輸入,另外,如:出生年月、聯系電話、郵編等類似名稱的字段,程序應設置數據錄入格式,這可以從一定程度上“規范”數據,並提高錄入速度。除此以外,在較大數據量的錄入中,用戶還希望更快速地進行相似數據的批量錄入,實現高效數據處理。本文只介紹“批量數據”的錄入處理。

針對大多數的要錄入的記錄數據都與現有(即已錄入)數據具有或多或少的相同內容,因此,修改記錄的少量字段數據無疑要比逐個字段內容錄入快得多。由於此方法源自Foxbase系統的“Set carry on”命令,因此取名為記錄“攜帶”。以下具體介紹這種錄入數據時采用的“攜帶”功能的實現方法。

一、建立一動態數組,用來存放整條記錄的所有字段值(不含“備注型”等類型),定義如下:

MyDynamic_Record: Variant; //定義一個動態可變數組,來存放當前記錄各字段值

注意此處不限定數組單元數和單元值類型,更具有通用性。

二、在表對象的InsertBefore事件中,完成源數據的讀取並存入動態數組MyDynamic_Record中。

具體是,用戶定位到要作為源的記錄位置(可以是末記錄或中間某一記錄),使用Insert插入鍵(或其它應用程序提供的按鍵或按鈕)進行插入操作前,為表對象的InsertBefore事件加入讀取當前記錄的各字段值的代碼(見以下MyRecordScatTo()自定義函數),存入MyDynamic_Record中。

三、在表對象的InsertAfter事件中將MyDynamic_Record數組值寫入新增的記錄的各字段值(代碼見以下My_GathFrom自定義函數)。

四、由用戶對當前新增的“克隆”記錄進行修改,確定時“保存”,否則“取消”。

以下創建一演示實例,並給出具體步驟:

1、新建一工程項目,取名為Project1,表單取名為Form1;在該表單中先後加入如下圖中對象,並設置各相應屬性,調整好各控件對象位置:

其中,對應的Salary(工資表)的結構定義如下:

說明:結構中雖然有“備注”字段,但類型並非“備注型”,而設置為“字符型”,因此該字段可參與“攜帶”。

2、在單元Unit1的type部分作相應的說明及變量的定義:

type
TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);
procedure Table1BeforeInsert(DataSet: TDataSet);
procedure Table1AfterInsert(DataSet: TDataSet);
procedure Table1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
//以下為自定義過程與函數的說明
function MyRecordScatTo(DataSet0:TDataSet;var MyDynamic_Record0:Variant):boolean;
function MyRecordGatherFrom(DataSet0:TDataSet;var MyDynamic_Record0:Variant):boolean;
procedure My_TablePostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction;sFieldName:string);
private
{ Private declarations }
MyDynamic_Record:Variant; //定義動態數組
public
{ Public declarations }
end;

3、在表單的OnCreate事件中,加入Table1表的初始設置:
procedure TForm1.FormCreate(Sender: TObject);
var s:string;
begin
s:=ExtractFilePath(Application.ExeName);
Table1.DatabaseName:=s; //設置Table1的源數據路徑
Table1.Open;
end; //初始設置
分別在表Table1的BeforeInsert,AfterInsert,OnPostError事件中加入如下代碼:
procedure TForm1.Table1BeforeInsert(DataSet: TDataSet);
begin
if CheckBox1.Checked //使用"攜帶"功能時,調用"獲取"
then
if not MyRecordScatTo(Table1,MyDynamic_Record) //出錯時,取消"攜帶"
then CheckBox1.Checked:=false;
procedure TForm1.Table1AfterInsert(DataSet: TDataSet);
begin
if CheckBox1.Checked //使用"攜帶"功能時,調用"賦值"
then MyRecordGatherFrom(Table1,MyDynamic_Record);
end; //添加記錄後的數據處理
procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
//調用通用表數據處理模塊:主關鍵字'編號'
My_TablePostError(DataSet,E,Action,'編號');
end;
分別在Button1、Button2的OnClick事件中加入如下代碼:
procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.Insert;
if DBGrid1.CanFocus
then DBGrid1.SetFocus
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Table1.Refresh;
Table1.Close;
Close;
end; //關閉表單

4、以上調用的過程及函數——MyRecordScatTo、MyRecordGatherFrom、My_TablePostError的代碼如下:

function TForm1.MyRecordScatTo(DataSet0:TDataSet;var MyDynamic_Record0:Variant):boolean; //正確
返回TRUE,否則為FALSE
//功能:讀取(當前記錄)字段值存入動態數組中
var i:integer;
begin
try
i:=DataSet0.FieldCount; //取字段數
MyDynamic_Record0:=VarArrayCreate([0,i],varVariant); //MyVariant
if (not DataSet0.Active) //or(DataSet0.eof)
then begin
MessageBeep(MB_OK);
MessageDlg('當前為空記錄,無法使用"攜帶"!',mtError, [mbOk], 0);
Result:=false;
Exit;
end;
with DataSet0 do //DBGrid0
begin
for i:=0 to FieldCount-1 do
begin
if Fields[i].DataType<>ftMemo //非"備注"型數據
then MyDynamic_Record0[i]:=Fields[i].Value;
end; //for i:
end;
Result:=true;
except
Result:=false
end //try
end; // MyRecordScatTo
function TForm1.MyRecordGatherFrom(DataSet0:TDataSet;var MyDynamic_Record0:Variant):boolean; //
正確返回TRUE,否則為FALSE
//功能:從動態數組中獲取相應值,來更改(當前記錄)字段值
var i:integer;
begin
Result:=true;
with DataSet0 do //
begin
try
for i:=0 to FieldCount-1 do
begin //Edit;
if (Fields[i].DataType<>ftMemo) //非"備注"型數據
then Fields[i].Value:=MyDynamic_Record0[i];
end; //for i
except
Result:=false;
end //try
end;
end; // MyRecordGatherFrom
procedure TForm1.My_TablePostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction;sFieldName:string);
//功能:保存時數據錯誤信息捕捉
var sMes:string;
begin
MessageBeep(0);
//以下捕捉"錯誤信息"
sMes:='當前記錄非法!更正後再保存。';
if Pos(UpperCase('key violation'),UpperCase(e.Message))<>0
then sMes:='"'+sFieldName+'"內容重復,請更改後再保存!';
if Pos(UpperCase('must have a value'),UpperCase(e.Message))<>0
then sMes:='當前欄目必須輸入值!';// '"'+sFieldName+'"字段必須輸入值!';
sMes:=sMes+Chr(13)+Chr(10)+'(Esc鍵取消操作)';
MessageDlg(sMes,mtError, [mbOk], 0);
Action:=daAbort; //放棄編輯且不顯示錯誤信息
end; //調用通用表數據處理模塊

5、運行程序,選擇<使用“攜帶”> 後,按<添加>(或按[Insert]鍵)出現的畫面如下圖所示(以第2條記錄為源):

以上代碼在下述環境中調試通過:中文Win2000 Pro,Delphi 7.0。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved