⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysrestore.pas

📁 delphi开发的中国移动大客户管理系统,后台数据库为oracle
💻 PAS
字号:
unit sysrestore;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, DBTables, Db, Buttons,FileCtrl;

type
  TSysRestoreFrm = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    Table1: TTable;
    Table2: TTable;
    BatchMove1: TBatchMove;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ListBox1: TListBox;
    GroupBox2: TGroupBox;
    RB_Append: TRadioButton;
    RB_Copy: TRadioButton;
    Query: TQuery;
    FilterComboBox1: TFilterComboBox;
    Label1: TLabel;
    Label2: TLabel;
    LDir: TLabel;
    SpeedButton1: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FilterComboBox1Change(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
    FDir:string;
    fext:string;
    Function IsHaveDcid(pTable:TTable;pDcid:string):Boolean;
    Function ExecQuery(PQuery:TQuery;PSql:string):Boolean;
    //得到数据库服务器日期
    Function GetDbServerDate(DBName:string):string;overload;
  public
    { Public declarations }
  end;

var
  SysRestoreFrm: TSysRestoreFrm;

implementation

{$R *.DFM}
uses xt_sjhf_frm_main,SelectDir;




procedure TSysRestoreFrm.FilterComboBox1Change(Sender: TObject);
begin
   xt_sjhf_main.qry_TB_XTGL_FACB.DisableControls;
   ListBox1.Clear;
   if FilterComboBox1.Mask ='*.DB' then
       fext:='.DB'
   else if FilterComboBox1.Mask ='*.DBF' then
       fext:='.DBF'
   else
       fext:='.TXT';

   xt_sjhf_main.qry_TB_XTGL_FACB.First;
   while not xt_sjhf_main.qry_TB_XTGL_FACB.Eof do
   begin
      if FileExists(FDir+'\'+xt_sjhf_main.qry_TB_XTGL_FACB.fieldbyname('BYWM').asstring+fext) then
         ListBox1.Items.Add(xt_sjhf_main.qry_TB_XTGL_FACB.fieldbyname('BZWM').asstring);

      xt_sjhf_main.qry_TB_XTGL_FACB.Next;
   end;
   xt_sjhf_main.qry_TB_XTGL_FACB.EnableControls;
end;
procedure TSysRestoreFrm.FormShow(Sender: TObject);
begin
   FilterComboBox1Change(nil);
end;
procedure TSysRestoreFrm.BitBtn1Click(Sender: TObject);
var n:integer;
    fsql:string;
    FTName:string;
begin
   xt_sjhf_main.qry_TB_XTGL_FACB.DisableControls;
   //设置备份方式为拷贝
   BatchMove1.Mode:=batCopy;
   table2.DatabaseName:=FDir;
   //计算要备份的表的个数
   FSql:='select count(*) from T_XTGL_FACB where FABH ='''+xt_sjhf_main.Edit_fabh.Text+'''';
   xt_sjhf_main.Query.close;
   xt_sjhf_main.Query.sql.Clear;
   
   if xt_sjhf_main.qry_TB_XTGL_FACB.Filtered then
     fsql:=fsql+ ' and ('+ xt_sjhf_main.qry_TB_XTGL_FACB.Filter+')';
   xt_sjhf_main.Query.sql.Add(fsql);

   xt_sjhf_main.Query.open;
   xt_sjhf_main.Query.First;

   xt_sjhf_main.qry_TB_XTGL_FACB.First;
   while not xt_sjhf_main.qry_TB_XTGL_FACB.Eof do
   begin
       FTName:=xt_sjhf_main.qry_TB_XTGL_FACB.fieldbyname('BYWM').asstring;
       Table1.close;
       table1.TableName:=FTName;

       //过滤要导入数据的电厂
       if not FileExists(FDir+'\'+FTName+fext) then
       begin
          xt_sjhf_main.qry_TB_XTGL_FACB.Next;
          continue;
       end;
       Table2.close;
       table2.DatabaseName:=FDir;
       table2.TableName:=FTname+fext;

       table2.Filter:='';
       table2.Filtered:=false;
       //覆盖时用
       fsql:='delete from '+FTName;
       //if IsHaveDcid(Table1,'DCID') then
      // begin
        table2.Filtered:=true;

        //如果有DCID 则删覆盖表时要过滤
        fsql:='delete from ' + FTName ;
       //end;

       if FilterComboBox1.Mask='*.DB' then
          table2.TableType:=ttParadox
       else if FilterComboBox1.Mask='*.DBF' then
          table2.TableType:=ttDBase
       else
          table2.TableType:=ttASCII;

       BatchMove1.Source:=table2;
       BatchMove1.Destination:=table1;
       if RB_Append.Checked then
          BatchMove1.Mode:=batAppendUpdate
       else
       begin
          ExecQuery(Query,fsql);
          BatchMove1.Mode:=batAppend;
       end;
       try
         BatchMove1.Execute;
       except
         Application.MessageBox('恢复数据失败!','警告',MB_OK+MB_ICONSTOP);
         xt_sjhf_main.qry_TB_XTGL_FACB.EnableControls;
         close;
         exit;
       end;
       xt_sjhf_main.qry_TB_XTGL_FACB.Next;
   end;
   xt_sjhf_main.qry_TB_XTGL_FACB.EnableControls;

   Application.MessageBox('恢复数据成功!','警告',MB_OK+MB_ICONEXCLAMATION);
   close;
   exit;
end;

procedure TSysRestoreFrm.FormCreate(Sender: TObject);
begin
  //数据备份在当前目录下\data子目录
  FDir:=ExtractFilePath(ParamStr(0))+'data\'+GetDbServerDate('db_vipdl');
  if not DirectoryExists(FDir) then ForceDirectories(FDir);
  LDir.Caption:=FDir;
end;
Function TSysRestoreFrm.IsHaveDcid(pTable:TTable;pDcid:string):Boolean;
var i:integer;
begin
    result:=false;
    if not pTable.Active then
    try
       pTable.Active:=true;
    except
       exit;
    end;
    for i:=0 to pTable.FieldCount - 1 do
    begin
      if pTable.Fields[i].FieldName = pDcid then
      begin
        result:=true;
        break;
      end;
    end;
end;
procedure TSysRestoreFrm.SpeedButton1Click(Sender: TObject);
var dlg:TSelectDirFrm;
begin
  try
    dlg:=TSelectDirFrm.Create(self);
    if dlg.ShowModal = mrOk then
    begin
      LDir.Caption:=dlg.label1.Caption;
      FDir:=dlg.Label1.Caption;
      FilterComboBox1Change(nil);
    end;    
  finally
    dlg.free;
  end;  
end;

function TSysRestoreFrm.ExecQuery(PQuery: TQuery; PSql: string): Boolean;
begin
  Result:=true;
  PQuery.close;
  PQuery.sql.Clear;
  PQuery.Filtered:=false;
  PQuery.sql.add(PSql);
  try
    PQuery.ExecSQL;
  except
    Result:=false;
  end;
end;

function TSysRestoreFrm.GetDbServerDate(DBName: string): string;
var query:TQuery;
    Present: TDateTime;
    Year, Month, Day: Word;
    str:string;
begin
  try
      query:=TQuery.Create(nil);
  except
      exit;
  end;
  query.DatabaseName:=DBname;
  query.close;
  query.sql.Clear;
  query.sql.Add('select distinct sysdate from dual');
  try
     query.open;
  except
     exit;
  end;
  query.First;
  Present:=Query.Fields[0].AsDateTime;
  DecodeDate(Present, Year, Month, Day);
  str:=inttostr(year);
  if month<10 then str:=str+'0'+inttostr(month)
  else str:=str+inttostr(month);
  if day<10 then str:=str+'0'+inttostr(day)
  else str:=str+inttostr(day);
  result:=str;
  query.free;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -