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

📄 unit1.pas

📁 delphi实现的一个完全自动运行的数据库存取的软件保留30天日志记录
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, Buttons, ComCtrls,StrUtils,
  IdTCPServer, IdComponent, IdTCPConnection, IdTCPClient, IdBaseComponent,
  IdAntiFreezeBase, IdAntiFreeze,unit2,iniFiles, CheckLst, SocketProtocolServer, // FileCtrl,
  ExtCtrls, jpeg;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQry: TADOQuery;
    StatusBar: TStatusBar;
    BitInt: TBitBtn;
    BitFix: TBitBtn;
    BitOver: TBitBtn;
    Timer: TTimer;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    ListData: TListBox;
    ListSys: TListBox;
    ListNet: TListBox;
    GroupBox2: TGroupBox;
    Label4: TLabel;
    Label5: TLabel;
    TLogin: TTimer;
    OnLine: TListBox;
    LeaveLine: TListBox;
    GroupBox3: TGroupBox;
    Label6: TLabel;
    ImageOnLine: TImage;
    ImageOffLine: TImage;
    Label7: TLabel;
    ImageDBOn: TImage;
    ImageDBOff: TImage;
    LogResOutTime: TTimer;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure BitFixClick(Sender: TObject);
    procedure BitOverClick(Sender: TObject);
    procedure BitIntClick(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure TLoginTimer(Sender: TObject);
    procedure LogResOutTimeTimer(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);

  private
    { Private declarations }
    procedure LogMsg0(LogDesc: string; LogCode: Byte);
    procedure LogMsg1(LogDesc: string; LogCode: Byte);
    procedure LogMsg2(LogDesc: string; LogCode: Byte);
    procedure LogMsg3(LogDesc: string; LogCode: Byte);
    procedure OthersOnLine(Sender: TObject; Client: string);
    procedure OthersOffLine(Sender: TObject; Client: string);
    procedure LoginResult(Sender: TObject; Status: Boolean);
    procedure WriteData(Sender: TObject; Src, Dst: string; Cmd, PkCnt, PkNO: Byte; PkData: array of Byte; PkDataLen: integer) ;
    procedure REcQust();
  public
  end;

  type
      InfoRec=record     //信息记录
      ShName:string;     //表名
      str1:string;
      str2:string;
      str3:string;
      str4:string;
      str5:string;
      str6:string;
      str7:string;
      str8:string;
      str9:string;
      str10:string;
      str11:string;
  end;

var
   Form1: TForm1;
   SPClient: TSocketProtocolServer;
   qsrcAddr1,qsrcAddr2,qsrcAddr3,qsrcAddr4:string;  //全局存放源地址 用来判断是不是统一机器给我发数据

   qDatByte1: T1KBytesBuf;           //用来组织记录数组
   qDatByte2: T1KBytesBuf;
   qDatByte3: T1KBytesBuf;
   qDatByte4: T1KBytesBuf;
   qDataLen1:integer;                 //用来存放数据记录字节数
   qDataLen2:integer;
   qDataLen3:integer;
   qDataLen4:integer;
   qFirstCl:Byte;
implementation

{$R *.dfm}

procedure WriteLog(s:string);    //写日志表
var
    time:string;
    Day:string;
    FileName:string;
    Log:textfile;
begin
    ShortDateFormat:='yyyymmdd';
    time:=DateTimetostr((now()));
    Day:=leftstr(time,8);
    filename:=ExtractFilePath(paramstr(0))+'\log\Log'+Day+'.log';
    try
    AssignFile(Log,filename);
    reset(Log);
    append(Log);
    writeln(Log,time+'   '+s);
    closeFile(Log);
    except
     ;
    end
end;

procedure CreateLog();
var fileName:string;
    s:string;
    Day:string;
    Log:textfile;
begin
    ShortDateFormat:='yyyymmdd';
    s:=DateTimetostr((now()));
    Day:=leftstr(s,8);
    filename:=ExtractFilePath(paramstr(0))+'\log\Log'+Day+'.log';
    if false=fileExists(filename) then
    begin
    AssignFile(Log,filename);
    rewrite(Log);
    closeFile(Log);       //构建日志表
    end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
    Timer.Enabled:=true;
    timer.Interval:=3600000; // 30000;
    qsrcAddr1:='';
    qsrcAddr2:='';     //地址字符串清零
    qsrcAddr3:='';
    qsrcAddr4:='';
    qDataLen1:=0;                 //用来存放数据记录字节数
    qDataLen2:=0;
    qDataLen3:=0;
    qDataLen4:=0;
    CreateLog();
    WriteLog('系统成功启动');
    ListSys.Items.Add(datetimetostr(now())+'   系统成功启动');
end;


procedure TForm1.BitFixClick(Sender: TObject);
begin
    FConfig.Show;
    BitInt.Enabled:=true;
end;

procedure TForm1.BitOverClick(Sender: TObject);
var
    s:string;
    filename:string;
    LvIni: TIniFile;
    SoftName:string;
begin
    ShortDateFormat:='yyyymmdd';
    s:=Datetimetostr((now()));
    filename:=ExtractFilePath(paramstr(0))+'\ini\myini.ini';
    LVIni:=TInifile.create(filename);
    SoftName:=LvIni.ReadString('DataGate', 'GDG','');
    SPClient.ClientLogout(SoftName);
    WriteLog(s+'     注销网络');
    WriteLog(s+'     系统成功关闭');
    Close;
end;

procedure TForm1.BitIntClick(Sender: TObject);
var
s:string;
LvIni: TIniFile;
Password,UserID,InitialCatalog,DataSource:string;
Day:string;
FileName:string;
counter:integer;
Addr,Port,SoftName:string;
begin
    filename:=ExtractFilePath(paramstr(0))+'\ini\myini.ini';
    LVIni:=TInifile.create(filename);
    Addr:=LvIni.ReadString('DataGate', 'GIP','');
    Port:=LvIni.ReadString('DataGate', 'GPort','');
    SoftName:=LvIni.ReadString('DataGate', 'GDG','');
    SPClient:= TSocketProtocolServer.Create(SoftName);
    SPClient.FSPCOnLogLv0:= LogMsg0;
    SPClient.FSPCOnLogLv1:= LogMsg1;
    SPClient.FSPCOnLogLv2:= LogMsg2;
    SPClient.FSPCOnLogLv3:= LogMsg3;
    //SPClient.ClientLogin(SoftName);
    SPClient.FSPCRspOnOthersOnLine:= OthersOnLine;
    SPClient.FSPCRspOnOthersOffLine:= OthersOffLine;
    SPClient.FSPCRspOnLogin:= LoginResult;
    SPClient.FSPCRspOnTransData:= WriteData;
    SPClient.OpenSocket(Addr,strtoint(Port));
    ShortDateFormat:='yyyymmdd';
    s:=Datetimetostr((now()));
    Day:=leftstr(s,8);
    BitInt.Enabled:=false;
    ADOConnection1.Connected:=false;
    filename:=ExtractFilePath(paramstr(0))+'\ini\myini.ini';
    LVIni:=TInifile.create(filename);
    InitialCatalog:=LvIni.ReadString('server', 'Initial Catalog','');
    DataSource:=LvIni.ReadString('server', 'Data Source','');
    UserID:=LvIni.ReadString('server', 'User ID','');
    Password:=LvIni.ReadString('server', 'Password','');
    ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password='+Password+';Persist Security Info=True;User ID='+UserID+';Initial Catalog='+InitialCatalog+';Data Source='+DataSource;

    try
    ADOConnection1.Connected:=true;
    ImageDBOn.Visible:=true;
    ImageDBOff.Visible:=false;
    ListSys.Items.Add(s+'  数据库初始化成功');
    WriteLog('数据库初始化成功');
    except
    ImageDBOn.Visible:=false;
    ImageDBOff.Visible:=true;
    ListSys.Items.Add(s+'  数据库初始化失败');
    filename:=ExtractFilePath(paramstr(0))+'Log'+Day+'.log';
    WriteLog('数据库初始化失败')
    end;

    ADOqry.SQL.Clear;
    ADOqry.SQL.Add('create table JFSH_VEH_BASICDATA(VIN varchar(30) PRIMARY KEY,');
    ADOqry.SQL.Add('Trucktype varchar(30),Pdate datetime,EIN varchar(30),BOM varchar(30),');
    ADOqry.SQL.Add('Manuinfor varchar(30))');

    ADOqry.SQL.Add('create table JFSH_VEH_ETYPE(Trucktype varchar(30) PRIMARY KEY,');
    ADOqry.SQL.Add('Pdate datetime,Enginetype varchar(30),ABSTYPE varchar(30),ECASTYPE');
    ADOqry.SQL.Add('varchar(30),CANLINTYPE varchar(30))');

    ADOqry.SQL.Add('create table JFSH_VEH_MOTOROLA(Trucktype varchar(30) PRIMARY KEY,');
    ADOqry.SQL.Add('Cruise_Control_Enable varchar(30),');
    ADOqry.SQL.Add('Max_Road_Speed_Trim varchar(30),LSI_Breakpoint_Speed varchar(30),');
    ADOqry.SQL.Add('Rear_Axle_Ratio_Low varchar(30),Tire_Size_varcha varchar(30))');

    ADOqry.SQL.Add('create table JFSH_VEH_ECAS(Trucktype varchar(30) PRIMARY KEY,');
    ADOqry.SQL.Add('Scpzwjm varchar(30),content varchar(512))');

    ADOqry.SQL.Add('create table JFSH_VEH_CANLIN(Trucktype varchar(30) PRIMARY KEY,');
    ADOqry.SQL.Add('Jdpzwjm varchar(30),content varchar(512))');

    ADOqry.SQL.Add('create table JFSH_ENG_BASICDATA (EIN varchar(30) PRIMARY KEY,') ;
    ADOqry.SQL.Add('EMVN varchar(30),VTNO varchar(30),ECSID varchar(30),ECUID varchar(30),');
    ADOqry.SQL.Add('ECUName varchar(30),PFName varchar(30),TCFName varchar(50),CrtDate datetime)');

    ADOqry.SQL.Add('create table JFSH_ENG_ECSMap(ECSID varchar(30) PRIMARY KEY,');
    ADOqry.SQL.Add('ECSTN varchar(30) Not Null)');

    ADOqry.SQL.Add('create table JFSH_ENG_BOSCH498(EIN varchar(30) PRIMARY KEY,');
    ADOqry.SQL.Add('FuelComp varchar(30))');

    ADOqry.SQL.Add('create table JFSH_ENG_DEUTZ(EIN varchar(30) PRIMARY KEY,' );
    ADOqry.SQL.Add('FuelComp varchar(30),OCAdjust varchar(30))');

    ADOqry.SQL.Add('create table JFSH_ENG_MOTOROLA(EIN varchar(30) PRIMARY KEY,');
    ADOqry.SQL.Add('FuelComp varchar(30),OCAdjust varchar(30))');

    ADOqry.SQL.Add('create table JFSH_ENG_PFileMap(PFName varchar(30),PFileTableName varchar(30),');
    ADOqry.SQL.Add('ECSID varchar(30),DriveFName varchar(255),DemDataFName varchar(255),');
    ADOqry.SQL.Add('OriginPFName varchar(255),TCFName varchar(50),ECUManufacturer varchar(255),');
    ADOqry.SQL.Add('SoftVersionNO varchar(30),CrtDate varchar(255),FileExplain varchar(255))');

    ADOqry.SQL.Add('create table  LogIndex(IndexName varchar(20) primary key)');
 
  try
    ADOqry.ExecSQL;
    ListSys.Items.Add(s+'  数据表成功建立');
    WriteLog('数据表成功建立')
    except
    ListSys.Items.Add(s+'  数据表已存在');
    WriteLog('数据表已存在')
    end;
    //下面代码用来操作日志表 在软件故障时可能零点不会触发timmer  当程序再次打开时
    // 在初始化中新建和删除日志,并对索引进行操作
    FileName:='log'+Day;
    ADOqry.SQL.Clear;
    ADOqry.SQL.Add('insert LogIndex values ('''+FileName+''')');

    try
    ADOqry.ExecSQL;
    ListSys.Items.Add(s+'  日志索引记录添加成功');
    except
    ListSys.Items.Add(s+'  日志索引记录已存在');
    end;

    ADOqry.SQL.Clear;
    ADOqry.SQL.Add('select * from LogIndex');
    ADOqry.Open;
    counter:=ADOqry.RecordCount;
    if counter>5 then
    begin
       ADOqry.SQL.Clear;
       ADOqry.SQL.Add('select Top 1 IndexName from LogIndex Order By IndexName ASC');
       ADOqry.Open;
       s:=ADOqry.FieldByName('IndexName').AsString; //需要删除的日志索引文件名
       ADOqry.SQL.Clear;
       ADOqry.SQL.Add('delete from LogIndex where IndexName not in (select Top 5 IndexName from LogIndex Order By IndexName DESC)');
       ADOqry.ExecSQL;                             //删除日志索引
    end;
    filename:=ExtractFilePath(paramstr(0))+'\log\'+s+'.log';
    deletefile(FileName);


end;

procedure TForm1.TimerTimer(Sender: TObject);
var
    s:string;
    Day:string;
    FileName:string;
    counter:integer;
    H,M,Se,Z : word;
begin
    ShortDateFormat:='yyyymmdd';
    s:=DateTimetostr((now()));
    Day:=Datetostr((now()));
    s:=rightstr(s,8);
    DecodeTime(now(), H, M, Se, Z);
    if  H=22   then
          begin
          timer.Interval:=1800000;  //最大值是22:59  时间间隔为30分
          end;
    if  H=23   then
          begin
          timer.Interval:=600000;    //最大值是23:29  时间间隔为10分
          end;
    if ( H=23) and (M>40)   then
          begin
          timer.Interval:=60000;     //最大值是23:59  时间间隔为1分
          end;  
    if  H=0  then   //零点时刻到达
     begin
        timer.Interval:=3600000;// 零点过后 时间间隔为一小时
        CreateLog();
        ListSys.Clear;
        ListData.Clear;
        ListNet.Clear;          //三个日志信息表清空
        FileName:='log'+Day;
        ADOqry.SQL.Clear;
        ADOqry.SQL.Add('insert LogIndex values ('''+FileName+''')');

        try
        ADOqry.ExecSQL;
        except
        ListSys.Items.Add(s+'  日志记录已存在或数据库异常');
        end;

        ADOqry.SQL.Clear;
        ADOqry.SQL.Add('select * from LogIndex');
        ADOqry.Open;
        counter:=ADOqry.RecordCount;
        if counter>5 then
        begin
          ADOqry.SQL.Clear;
          ADOqry.SQL.Add('select Top 1 IndexName from LogIndex Order By IndexName ASC');
          ADOqry.Open;
          s:=ADOqry.FieldByName('IndexName').AsString; //需要删除的日志索引文件名
          showmessage(s);
          ADOqry.SQL.Clear;
          ADOqry.SQL.Add('delete from LogIndex where IndexName not in (select Top 5 IndexName from LogIndex Order By IndexName DESC)');
          ADOqry.ExecSQL;                             //删除日志索引
        end;
        filename:=ExtractFilePath(paramstr(0))+'\log\'+s+'.log';
        deletefile(FileName);

⌨️ 快捷键说明

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