动态数据传输

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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值