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

📄 unit1.pas

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

     end;
end;


procedure TForm1.LogMsg0(LogDesc: string; LogCode: Byte);
begin
    ListNet.Items.Add(Format('%.2d -- %s', [LogCode, LogDesc]));
    ListNet.ItemIndex:= ListNet.Items.Count - 1;
    WriteLog(Format('%.2d -- %s', [LogCode, LogDesc]));
end;

procedure TForm1.LogMsg1(LogDesc: string; LogCode: Byte);
begin
    ListNet.Items.Add(LogDesc);
    ListNet.ItemIndex:= ListNet.Items.Count - 1;
    WriteLog(LogDesc);
end;

procedure TForm1.LogMsg2(LogDesc: string; LogCode: Byte);
begin
    ListNet.Items.Add(Format('%.2d -- %s', [LogCode, LogDesc]));
    ListNet.ItemIndex:= ListNet.Items.Count - 1;
    writeLog(Format('%.2d -- %s', [LogCode, LogDesc]));
end;

procedure TForm1.LogMsg3(LogDesc: string; LogCode: Byte);
begin
    ListNet.Items.Add(Format('%.2d -- %s', [LogCode, LogDesc]));
    ListNet.ItemIndex:= ListNet.Items.Count - 1;
    writeLog(Format('%.2d -- %s', [LogCode, LogDesc]));
end;

procedure TForm1.OthersOnLine(Sender: TObject; Client: string);  //需要改 完善
begin
    OnLine.Items.Add(Format('%s -- %s', [Client, timetostr(time)]));
    OnLine.ItemIndex:= OnLine.Items.Count - 1;
    WriteLog(Format('%s -- %s', [Client, timetostr(time)]));
end;

procedure TForm1.OthersOffLine(Sender: TObject; Client: string);   //需要改 完善
begin
    LeaveLine.Items.Add(Format('%s -- %s', [Client, timetostr(time)]));
    LeaveLine.ItemIndex:= LeaveLine.Items.Count - 1;
    WriteLog(Format('%s -- %s', [Client, timetostr(time)]));
end;



procedure TForm1.WriteData(Sender: TObject; Src, Dst: string; Cmd, PkCnt, PkNO: Byte; PkData: array of Byte; PkDataLen: integer) ;
var


    Cs:Byte;
    StrDat:Tstringlist;
    i:integer;
    Curlen:integer;
    Index:integer;
    DataRec: string;
    s:string;
    counter:integer;
    Respond: T4KBytesBuf;
    IOR:Byte;
    order:string;
begin
   StrDat:=Tstringlist.Create;
   s:=datetimetostr(now());   //写日志  Src, Dst: string; , PkCnt, PkNO: Byte; PkData: array of Byte; PkDataLen: integer
   ListData.Items.Add(s+'     获得数据包源地址:'+Src+'目标地址:'+Dst);
   WriteLog(s+'     获得数据包源地址:'+Src+'目标地址:'+Dst);
   if  PkNO=0 then
      qFirstCl:=PKData[0];   // 该包为第一包 需要提取CL 和 CH  设为全局变量 用来判断多包时的转发命令


  {
    if qsrcAddr1='' then
      qsrcAddr1:=Src
    else if qsrcAddr2='' then
      qsrcAddr2:=Src
    else if qsrcAddr3='' then
      qsrcAddr3:=Src
    else if qsrcAddr4='' then
      qsrcAddr4:=Src       //以上程序段用来分别什么地址给本地传输数据 不同的src传来的数据存到不同的StrDat中
    else
 showmessage('无效SRC');
    if qsrcAddr1=src then            //按照不同的src把Data数据域存到不同的数组中防止两个活多个src同时访问
      begin }

 showmessage('收到数据包');
       if  Cmd=$01  then        //连续数据包命令为0x01     应答
       begin
       Respond[0]:=$41;       // 连续数据包应答命令  Cmd, PkCnt, PkNO  Cs
       Respond[1]:=PkCnt;
       Respond[2]:=PkNO;
       Respond[3]:=$00;
       SPClient.ClientTansData( Dst,Src,Respond,4);    //连续数据包命令应答
       end;    //if  Cmd=$01

      if  PkNO=0 then
        qFirstCl:=PKData[0];                       // 该包为第一包 需要提取CL 和 CH  设为全局变量 用来判断多包时的转发命令

       //对所有数据包进行拼接 读出按转发数据格式的记录
      if  PkNO<PkCnt then        //所有数据包拼接   包括单包(单包数据生产文件)情况
       begin
       i:=0;          // 除去二次协议中的cmd pcnt pno 取data区数据
       while i<=PKDataLen-1  do     //数据包中最后一个存的是包校验码cs
         begin                              //记录总的长度为多包数据总长度减去无效cmd pcnt pno cs
         qDatByte1[qDataLen1]:=PKData[i];  //全局 每个源地址来的包都分一个 qDatByte1  qDataLen1
         i:=i+1;
         qDataLen1:=qDataLen1+1;
         end;  //whil
      end;   // if  PkNO<PkCnt

      //最终包到达   包括单包非生产文件与生产文件与单包查询记录命令
     if  PkNO=PkCnt-1 then
       begin
       if qFirstCl=$01 then    //非生产文件数据包    数据解析  提取各个字段
          begin
//showmessage('进入非生产文件');
          index:=3; //在整个记录中 cl ch tt 不再需要提取了 直接从TNL开始  在记录中的位置是3
          while  index<=qDataLen1-3  do     //前面是数据 最后两个存的是校验码     校验码分开处理
           begin
            if qDatByte1[index]>=127 then    //取字段长度模块
               begin
               Curlen:=(qDatByte1[index]-128)*256+qDatByte1[ index+1];
               index:= index+2;
               end     //if DatByte[index]>=127
            else
               begin
               Curlen:= qDatByte1[index];
               index:= index+1;
               end;     //else
            i:=0;
            DataRec:='';
            while i<Curlen do        //取表名和字段内容模块
               begin
               DataRec:=DataRec+char(qDatByte1[index]);
               index:=index+1;
               i:=i+1;

               end;     // while i<Curlen
 // showmessage('解析出数据:'+datarec);
            StrDat.Add(DataRec);        //所有元素都存在StrDat中
            ListData.Items.Add(DataRec);   //添加数据日志表
         end;    // while  index<qDataLen1-3
          //写数据库     给是否写成功标志赋值
         ADOqry.SQL.Clear;                                                                                         //   StrToDate(StrDat[3])
         if StrDat[0]='JFSH_VEH_BASICDATA' then
            ADOqry.SQL.Add('insert JFSH_VEH_BASICDATA values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''')')
         else if StrDat[0]='JFSH_VEH_ETYPE' then
            ADOqry.SQL.Add('insert JFSH_VEH_ETYPE values(''' + StrDat[1] + ''', ''' + StrDat[2]+ ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''')')
         else if StrDat[0]='JFSH_VEH_MOTOROLA' then
            ADOqry.SQL.Add('insert JFSH_VEH_MOTOROLA values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''')')
         else if StrDat[0]='JFSH_VEH_ECAS' then
            ADOqry.SQL.Add('insert JFSH_VEH_ECAS values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')')
         else if StrDat[0]='JFSH_VEH_CANLIN' then
            ADOqry.SQL.Add('insert JFSH_VEH_CANLIN values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')')
         else if StrDat[0]='JFSH_ENG_BASICDATA' then
            ADOqry.SQL.Add('insert JFSH_ENG_BASICDATA values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''',''' + StrDat[7] + ''',''' + StrDat[8] + ''',''' + StrDat[9] + ''')')
         else if StrDat[0]='JFSH_ENG_ECSMap' then
            ADOqry.SQL.Add('insert JFSH_ENG_ECSMap values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''')')
         else if StrDat[0]='JFSH_ENG_BOSCH498' then
            ADOqry.SQL.Add('insert JFSH_ENG_BOSCH498 values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''')')
         else if StrDat[0]='JFSH_ENG_DEUTZ' then
            ADOqry.SQL.Add('insert JFSH_ENG_DEUTZ values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')')
         else if StrDat[0]='JFSH_ENG_MOTOROLA' then
            ADOqry.SQL.Add('insert JFSH_ENG_MOTOROLA values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')')
         else if StrDat[0]='JFSH_ENG_PFileMap' then
            ADOqry.SQL.Add('insert JFSH_ENG_PFileMap values(''' +StrDat[1] + ''', ''' +StrDat[2] + ''',''' +StrDat[3] + ''',''' +StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''',''' + StrDat[7] + ''',''' + StrDat[8] + ''',''' + StrDat[9] + ''',''' + StrDat[10] + ''',''' + StrDat[11] + ''')')
         else if StrDat[0]='JFSH_VEH_ETYPE' then
            ADOqry.SQL.Add('insert JFSH_VEH_ETYPE values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''')')
         else
            begin
              WriteLog(s+'    '+StrDat[0]+'表不存在');
              ListSys.Items.Add(s+'    '+StrDat[0]+'表不存在')
            end;
         try
         ADOqry.ExecSQL;
         IOR:=$01;  //成功
         WriteLog(s+'    '+StrDat[0]+'表写入数据操作成功');
         ListSys.Items.Add(s+'    '+StrDat[0]+'表写入数据操作成功')
         except
         IOR:=$00;  //失败
         WriteLog(s+'    '+StrDat[0]+'表写入数据操作失败');
         ListSys.Items.Add(s+'    '+StrDat[0]+'表写入数据操作失败')
         end;
//showmessage('准备非文件发送应答');
          Respond[0]:=$41;   //应答非生产文件命令
          Respond[1]:=$00;
          Respond[2]:=$0A;
          index:=3;
          if qDatByte1[3]>=127 then
             begin
             Respond[index]:=qDatByte1[3];
             index:=index+1;
             Respond[index]:=qDatByte1[4];
             index:=index+1;
             end
          else
             begin
             Respond[index]:=qDatByte1[3];
             index:=index+1;
             end;
         // Respond[3]:=Length(StrDat[0]);
         // index:=4;
          i:=1;
          while i<=length(StrDat[0])  do
          begin
            Respond[index]:=ord(StrDat[0][i]);
            i:=i+1;
            index:=index+1;
          end;
           Respond[index]:=qDatByte1[qDataLen1-2];       //key值为非文件表数据记录命令中的SEED 1Byte
           index:=index+1;
           Respond[index]:=qDatByte1[qDataLen1-1];       //key值为非文件表数据记录命令中的SEED   1Byte
           index:=index+1;
           Respond[index]:=IOR;    
           SPClient.ClientTansData(Dst, Src,Respond,index+1);    //应答非文件表数据记录命令

// showmessage('发送非文件应答完毕');
        end //if FirstCl=$01


       //发送校验表记录命令 用来查询发送的数据内容
        else  if qFirstCl=$02 then                // 查询数据包
          begin
showmessage('进入查询文件');
          index:=3;                      //在整个记录中 cl ch tt 不再需要提取了 直接从TNL开始  在记录中的位置是3
          if qDatByte1[index]>=127 then    //取字段长度模块
             begin
             Curlen:=(qDatByte1[index]-128)*256+qDatByte1[ index+1];
             index:= index+2;
             end     //if DatByte[index]>=127
          else
             begin
             Curlen:= qDatByte1[index];
             index:= index+1;
             end;     //else
          i:=0;
          DataRec:='';
          while i<Curlen do        //取要查询的表名
          begin
             DataRec:=DataRec+char(qDatByte1[index]);
             index:=index+1;
             i:=i+1;
          end;     // while i<Curlen
          ListData.Items.Add('要查询的表名为:+'+DataRec);   //添加数据日志表
          ADOqry.SQL.Clear;
          ADOqry.SQL.Add('select * from '+DataRec);
          try
          ADOqry.Open;
          ListSys.Items.Add(s+'    '+DataRec+'表查询成功');
          WriteLog(s+'    '+DataRec+'表查询成功');
          except
          ListSys.Items.Add(s+'    '+DataRec+'表查询失败');
          WriteLog(s+'    '+DataRec+'表查询失败')
          end;    // try
          counter:=ADOqry.RecordCount;  //counter中存储记录总条数
          if counter>=0 then
          begin
          ///////////////////////////应答检验表记录命令
          Respond[0]:=$42;
          Respond[1]:=$00;
          Respond[2]:=$0A;
          index:=3;
          if qDatByte1[3]>=127 then
             begin
             Respond[index]:=qDatByte1[3];
             index:=index+1;
             Respond[index]:=qDatByte1[4];
             index:=index+1;
             end
          else
             begin
             Respond[index]:=qDatByte1[3];
             index:=index+1;
             end;
          i:=1;
          while i<=length(DataRec)  do
          begin
            Respond[index]:=ord(DataRec[i]);
            i:=i+1;
            index:=index+1;
          end;
          Respond[index]:=counter and $ff;
          index:=index+1;
          Respond[index]:=(counter shr 8) and $ff;
          index:=index+1;
          Respond[index]:=(counter shr 16) and $ff;
          index:=index+1;
          Respond[index]:=(counter shr 24) and $ff;
          SPClient.ClientTansData( Dst,Src,Respond,index+1);
          /////////////////////////////应答检验表记录命令
          end;   // if counter>=0
       end     //  if FirstCl=$02

       //处理生产文件
       else if qFirstCl=$03 then    // 生产文件数据包
        begin  //本次按照数据文件方式处理生产文件  有空改成读数据库不完整文件处理
showmessage('进入生产文件');
        index:=3;                      //在整个记录中 cl ch tt RCL RCH 不再需要提取了 直接从TNL开始  在记录中的位置是3
          while  index<=qDataLen1-3  do     //前面是数据 最后两个存的是校验码     校验码分开处理
           begin
            if qDatByte1[index]>=127 then    //取字段长度模块
               begin
               Curlen:=(qDatByte1[index]-128)*256+qDatByte1[ index+1];
               index:= index+2;
               end     //if DatByte[index]>=127
            else
               begin
               Curlen:= qDatByte1[index];
               index:= index+1;
               end;     //else
            i:=0;
            DataRec:='';
            while i<Curlen do        //取表名和字段内容模块
               begin
               DataRec:=DataRec+char(qDatByte1[index]);
               index:=index+1;
               i:=i+1;

               end;     // while i<Curlen
  showmessage('解析出数据:'+datarec);
            StrDat.Add(DataRec);        //所有元素都存在StrDat中
            ListData.Items.Add(DataRec);   //添加数据日志表
         end;    // while  index<qDataLen1-3   // while  index<qDataLen1-3


         ADOqry.SQL.Clear;              //动态建立生产文件表
         ADOqry.SQL.Add('create table  QMZDY_PF_' + StrDat[0] + ' (RecName varchar(30),RecID varchar(30),RecLen varchar(30),RecContent varchar(512))');
         try
         ADOqry.ExecSQL;
         ListSys.Items.Add(s+'    QMZDY_PF_'+StrDat[0]+ '数据表成功建立');
         WriteLog(s+'    QMZDY_PF_'+StrDat[0]+ '数据表成功建立')
         except
         ListSys.Items.Add(s+'    QMZDY_PF_'+StrDat[0]+ '数据表已存在');
         WriteLog(s+'    QMZDY_PF_'+StrDat[0]+ '数据表已存在')
         end;    //try

         ADOqry.SQL.Clear;  ///生产文件写数据库
         ADOqry.SQL.Add('insert QMZDY_PF_' + StrDat[0] + ' values(''' + StrDat[0] + ''',''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')');
         try
         ADOqry.ExecSQL;
         IOR:=$01;    //插入成功 为0x01
         WriteLog(s+'    QMZDY_PF_'+StrDat[0]+ '表写入数据操作成功');
         ListSys.Items.Add(s+'    QMZDY_PF_'+StrDat[0]+ '表写入数据操作成功')
         except
         IOR:=$00;       //插入失败为 0x00
         WriteLog(s+'    QMZDY_PF_'+StrDat[0]+ '表写入数据操作失败');
         ListSys.Items.Add(s+'    QMZDY_PF_'+StrDat[0]+ '表写入数据操作失败')
         end;
          //应答文件表数据记录命令

          Respond[0]:=$43;   //应答生产文件命令
          Respond[1]:=$00;
          Respond[2]:=$A0;
          index:=3;
          if qDatByte1[5]>=127 then
             begin
             Respond[index]:=qDatByte1[5];
             index:=index+1;
             Respond[index]:=qDatByte1[6];
             index:=index+1;
             end
          else
             begin
             Respond[index]:=qDatByte1[5];
             index:=index+1;
             end;
          i:=1;
          while i<=length(StrDat[0])  do
          begin
            Respond[index]:=ord(StrDat[0][i]);
            i:=i+1;
            index:=index+1;
          end;
           Respond[index]:=qDatByte1[qDataLen1-2];       //key值为非文件表数据记录命令中的SEED 1Byte
           index:=index+1;
           Respond[index]:=qDatByte1[qDataLen1-1];       //key值为非文件表数据记录命令中的SEED   1Byte
           index:=index+1;
           Respond[index]:=IOR;
           SPClient.ClientTansData( Dst,Src,Respond,index+1);     //应答文件表数据记录命令
          //查询生产文件看表是否填满 如果填满则删除表名

⌨️ 快捷键说明

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