unit UBatch_move; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Db, DBTables, ComCtrls; //使用单元文件定义 type TForm1 = class(TForm) BatchMove1: TBatchMove; //指定完成批传输的组件 tblSource: TTable; //指出源表的数据集 tblDest: TTable; //指出目的表的数据集 Bevel1: TBevel ; Label6: TLabel; Label7: TLabel; Label8: TLabel; Bevel2: TBevel; Label15: TLabel; //显示标题的标签 Label5: TLabel; Label4: TLabel; Label3: TLabel; Bevel3: TBevel; //如下三行指定源表的别名、表名和索引名 cmbxSourceAlias: TComboBox; cmbxSourceTable: TComboBox; cmbxSourceIndex: TComboBox; //如下三行指定目的表的别名、表名和索引名 cmbxDestAlias: TComboBox; cmbxDestTable: TComboBox; cmbxDestIndex: TComboBox; cmbxMode: TComboBox; //指定传输方式的检测框 chkbxAbortKey: TCheckBox; chkbxAbortProblem: TCheckBox; chkbxTrans: TCheckBox; //定义提示标签 Label1: TLabel; Label2: TLabel; Label10: TLabel; Label9: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label11: TLabel; //如下三个指定临时使用的表名 edtChangedTable: TEdit; edtKeyVioTbl: TEdit; edtProbTbl: TEdit; edtRecCount: TEdit; ExcuteBtn: TButton; //执行批传输的按钮 procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure ExcuteBtnClick(Sender: TObject); procedure cmbxSourceAliasChange(Sender: TObject); procedure cmbxDestAliasChange(Sender: TObject); procedure cmbxSourceTableChange(Sender: TObject); procedure cmbxDestTableChange(Sender: TObject); procedure cmbxSourceIndexChange(Sender: TObject); procedure cmbxDestIndexChange(Sender: TObject); procedure cmbxModeChange(Sender: TObject); procedure edtRecCountKeyPress(Sender: TObject; var Key: Char); procedure chkbxAbortKeyClick(Sender: TObject); procedure chkbxAbortProblemClick(Sender: TObject); procedure chkbxTransClick(Sender: TObject); private { Private declarations } function IsStringsEqual(const s1,s2 : string): boolean; //定义内部函数 public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); // Get alias names //在窗体建立的过程中,打开会话,并从BDE的中获取别名列表 begin if Session.Active = false then Session.Open; //如过会话未激活,则打开它 Session.GetAliasNames(CmbxSourceAlias.Items); //调用GetAliasNames方法,从BDE配置文件中,获取别名列表,并存入组合框中 cmbxDestAlias.Items := cmbxSourceAlias.Items; //将源别名列表的内容赋给目的别名列表中 end; procedure TForm1.FormShow(Sender: TObject); //在应用开始执行时,将光标定位在选择源表别名的组合框 begin cmbxSourceAlias.SetFocus; end; procedure TForm1.cmbxSourceAliasChange(Sender: TObject); //该事件处理过程用于获取源数据库名和所有表名 begin if cmbxSourceAlias.ItemIndex <> -1 then //如果用户选择了数据库别名,则获取它,否则,清除它 begin tblSource.DatabaseName:=cmbxSourceAlias.Items[cmbxSourceAlias.ItemIndex]; //获取用户选择的数据库别名 Session.GetTableNames(tblSource.DatabaseName,'',true,false, cmbxSourceTable.Items); //从指定的数据库中,获取该库的所有表名 end else begin tblSource.DatabaseName := ''; cmbxSourceTable.Items.Clear; end; end; procedure TForm1.cmbxDestAliasChange(Sender: TObject); //该事件处理过程用于获取目的数据库名和所有表名 begin if cmbxDestAlias.ItemIndex <> -1 then begin tblDest.DatabaseName := cmbxDestAlias.Items[cmbxDestAlias.ItemIndex]; //获取用户选择的数据库别名 Session.GetTableNames(tblDest.DatabaseName,'',true,false, cmbxDestTable.Items); //从指定的数据库中,获取该库的所有表名 end else begin tblDest.DatabaseName := ''; cmbxDestTable.Items.Clear; end; end; procedure TForm1.cmbxSourceTableChange(Sender: TObject); //该事件处理过程用于获取源表的表名和索引名列表 begin if cmbxSourceTable.ItemIndex <> -1 then //如果用户从源的表名列表中,选择了表名,则获取它,否则,清除它 begin tblSource.TableName:=cmbxSourceTable.Items[cmbxSourceTable.ItemIndex]; //根据用户的选择,获取源表的表名 tblSource.GetIndexNames(cmbxSourceIndex.Items); //获取源表对应的所有索引 end else begin tblSource.TableName := ''; cmbxSourceIndex.Items.Clear; end; end; procedure TForm1.cmbxDestTableChange(Sender: TObject); //该事件处理过程用于获取目的表的表名和索引名列表 begin if cmbxDestTable.ItemIndex <> -1 then begin tblDest.TableName := cmbxDestTable.Items[cmbxDestTable.ItemIndex]; //根据用户的选择,获取目的表的表名 tblDest.GetIndexNames(cmbxDestIndex.Items); //获取目的表对应的所有索引 end else begin tblDest.TableName := ''; cmbxDestIndex.Items.Clear; end; end; procedure TForm1.ExcuteBtnClick(Sender: TObject); //在用户已完成了源和目的的有关设置后,单击执行按钮后执行该过程, //它完成实际的批传输操作 begin if tblDest.TableName = '' then tblDest.TableName := cmbxDestTable.Text; if ((tblSource.DatabaseName <> '') and (tblSource.TableName <> '') and (tblDest.DatabaseName <> '') and (tblDest.TableName <> '') and (cmbxMode.items[cmbxMode.ItemIndex] <> '')) then //在完成实际操作之前,首先测试源和目的的数据库名 //表名是否已经全部设置好 begin //设置TBatchMove组件的相关属性 BatchMove1.ChangedTableName := edtChangedTable.Text; BatchMove1.KeyViolTableName := edtKeyVioTbl.Text; BatchMove1.ProblemTableName := edtProbTbl.Text; BatchMove1.RecordCount := StrToInt(edtRecCount.Text); //设置批传输的记录数 end else begin MessageDlg('Incomplete input.',mtError,[mbOK],0); //只要源和目的的数据库名和表名的其中之一未设置好 //则退出该过程 exit; end; BatchMove1.Execute; //调用Execute方法,完成指定的传输 MessageDlg('批操作已完成,传输了'+IntToStr(BatchMove1.MovedCount)+ '个记录.',mtInformation,[mbOK],0); //显示实际传输的记录数 end; procedure TForm1.cmbxSourceIndexChange(Sender: TObject); //本过程根据用户的选择,获取源表对应的索引 begin if cmbxSourceIndex.ItemIndex <> -1 then //如果用户选择了索引,则获取它 begin tblSource.IndexName := cmbxSourceIndex.Items[cmbxSourceIndex.ItemIndex]; end else begin tblSource.IndexName := ''; //如果用户未选择索引,则清除它 end; end; procedure TForm1.cmbxDestIndexChange(Sender: TObject); //本过程根据用户的选择,获取目的表对应的索引 begin if cmbxDestIndex.ItemIndex <> -1 then //如果用户选择了索引,则获取它 begin tblDest.IndexName := cmbxDestIndex.Items[cmbxDestIndex.ItemIndex]; end else begin tblDest.IndexName := ''; //清除索引名选项 end; end; procedure TForm1.chkbxAbortKeyClick(Sender: TObject); begin BatchMove1.AbortOnKeyViol := chkbxAbortKey.Checked; //设置关键字违反有效规则时,是否终止执行 end; procedure TForm1.chkbxAbortProblemClick(Sender: TObject); begin BatchMove1.AbortOnProblem := chkbxAbortProblem.Checked; //设置数据转换出错时,是否终止执行 end; procedure TForm1.chkbxTransClick(Sender: TObject); begin BatchMove1.Transliterate := chkbxTrans.Checked; //对源或目的是否可使用不同的语言驱动程序 end; function TForm1.IsStringsEqual(const s1,s2 : string): boolean; //该过程将所有的小写字母转换成大写 begin Result := UpperCase(s1) = UpperCase(s2); end; procedure TForm1.cmbxModeChange(Sender: TObject); //该过程设置批传输的方式,如增加、拷贝、删除和修改 begin if cmbxMode.ItemIndex <> -1 then begin if IsStringsEqual(cmbxMode.Items[cmbxMode.ItemIndex],'Append') then BatchMove1.Mode := batAppend else if IsStringsEqual(cmbxMode.Items[cmbxMode.ItemIndex],'Copy') then BatchMove1.Mode := batCopy else if IsStringsEqual(cmbxMode.Items[cmbxMode.ItemIndex], 'Append Update') then BatchMove1.Mode := batAppendUpdate else if IsStringsEqual(cmbxMode.Items[cmbxMode.ItemIndex],'Delete') then BatchMove1.Mode := batDelete else if IsStringsEqual(cmbxMode.Items[cmbxMode.ItemIndex],'Update') then BatchMove1.Mode := batUpdate else MessageDlg('Batch mode not found',mtError,[mbOK],0); //如果未指定批传输方式,则提示错误 end; end; procedure TForm1.edtRecCountKeyPress(Sender: TObject; var Key: Char); //当用户输入传输的记录数时,调用该过程,不允许用户输入非数值型数据 begin if ((key in ['0'..'9'] = false) and (word(key) <> VK_BACK)) then key := #0; end; end.
动态数据传输
最新推荐文章于 2024-05-28 08:57:20 发布