zoukankan      html  css  js  c++  java
  • 通达OA 同步中控考勤机 增强版

    如果你用的是中控考勤机且考勤机能联网,那恭喜有福了! 最近发现考勤机提供web方式查询,经过调试可以用程序直接读取考勤机数据跨过考勤机软件及其access数据库,数据同步及时性、可靠性大幅提高。

    通达oa2011已经支持 指纹考勤机  但只限中控iclock660 这款2000大洋的型号,通过本文的开发接口,可以与任意一款指纹机集成, 需求指纹机管理软件能实时保存数据;

    我这里用的是 中控u160 指纹考勤机, 这款机器支持WIFI ,可以实现实时传输考勤数据,这也就意味着,用户采集指纹马上就能够在自己的OA上看到自己的考勤数据;

    特别指出的一点是这款机器的中控u160WIFI配置 容易出错的是 网线连接的ip网段 设置192.168.3.x,WIFI ip网段是在192.168.1.x   ,这样才能保证成功, 大多数都是错在这里

     

    之前博文里提到的使用PHP同步 ACCESS与mysql数据库的方式,有些缺点由于php是被动执行的脚步,我们只能够定时重复执行的方式来实现,确实不方便; 

     

    来说下新方案:

     

    1, 首先我们仍使用中控提供的考勤软件 ATT2008或称为zktime5.0 ,考勤机光盘附带的标准版,一般都有, 这里我们不再使用access而使用MSSQl数据库,安装目录下有一文件 mssql.sql ,放在sqlserver企业管理器中执行,就创建好要使用的数据库及表了,我们命名数据库为 Att2008;

     

     2,打开 表checkinout , 添加自增字段 id (这里严重鄙视一下!。。 ),修改通达oa数据库 attend_duty 增加 outID字段

     

     3,使用sql企业管理器创建作业任务名为:update_TDOA ,作业计划选择每天 ,作业步骤 添加以下脚本:

     1 use att2008
     2 declare @num int,
     3 <span style="white-space:pre">        </span>@sqls nvarchar(4000),
     4 <span style="white-space:pre">        </span>@con varchar(200),
     5 <span style="white-space:pre">        </span>@startID int,
     6 <span style="white-space:pre">        </span>@attend_duty varchar(300)
     7 set @startID=0
     8 --需先安装MySQL ODBC 3.51驱动
     9 set @con='OPENROWSET(''MSDASQL'',''DRIVER={MySQL ODBC 3.51 Driver};SERVER=127.0.0.1;PORT=3336;DATABASE=td_oa;USER=root;PASSWORD=myoa888;STMT=set names gb2312;OPTION=2049'','
    10 set @attend_duty=@con+'''select * from ATTEND_DUTY;'')'
    11 set @sqls='SELECT @a=outid FROM '+@con+'''select outid from attend_duty order by id desc limit 1;'')'
    12 exec('delete &nbsp;'+@con+'''select * from attend_duty'') where register_type=2 and CONVERT(varchar(12) , register_time, 112 )=&nbsp;
    13 (select top 1 CONVERT(varchar(12) ,CHECKTIME, 112 ) from CHECKINOUT order by CHECKTIME desc)&nbsp;
    14 ')
    15 exec sp_executesql @sqls,N'@a int output',@startID output&nbsp;
    16 print @startID
    17 exec('insert '+@con+'''select * from ATTEND_DUTY'') (outid,USER_ID,REGISTER_TYPE,REGISTER_TIME,REGISTER_IP,type)&nbsp;
    18 SELECT top 500 &nbsp;C.id,case when A.user_id is not null then A.user_id else ''0'' end,

    至此,你已经实现了数据同步,不过到这里仍然是定时执行,如果你没有进一步的要求,到这里也可以了

    同步数据实现每次调用只更新增量数据,并且自动识别考勤类型写入mysql,每天第一次为上班登记,最后一次打卡为下班数据;

     

    4,打开sql查询 添加以下脚本

     1 use att2008
     2 if (object_id('tgr_zk2TDOA_insert', 'tr') is not null)
     3     drop trigger tgr_zk2TDOA_insert
     4 go
     5 
     6 create trigger tgr_zk2TDOA_insert on CHECKINOUT  Instead Of Insert
     7 as    
     8 SET XACT_ABORT ON 
     9 --*************************************************************
    10 
    11 
    12 if exists (select 1 from checkinout where checktime=(select checktime from inserted) )
    13    return;
    14 
    15 insert checkinout(USERID,CHECKTIME,CHECKTYPE,VERIFYCODE,SENSORID,WORKCODE,sn,USEREXTFMT) 
    16 select USERID,CHECKTIME,CHECKTYPE,VERIFYCODE,SENSORID,WORKCODE,sn,USEREXTFMT from inserted
    17 
    18 --执行同步作业
    19 declare @JobID uniqueidentifier
    20 select @JobID=Job_ID from msdb.dbo.sysjobs where Name='update_TDOA' --查Job_ID
    21 EXEC msdb.dbo.sp_start_job @job_id = @JobID
    22 
    23 --************************************************************
    24 go
    25 SET XACT_ABORT OFF 
    26 print '更新成功!';
    27 go

    此处,使用触发器调用上一步的作业执行数据同步到OA,并且修正了 中控考勤软件的一处bug,你会发现每次点击考勤软件中下载记录会像数据库中添加全部数据 ,比如之前有9000条数据,点一次变成18000了再一次27000条记录了, 太可怕了。。。此处再鄙视以下中控;

    这里触发器增加了验证,如果要增加的记录 数据库中已经有了,不再添加;

    有人会问为什么不把同步脚本放在触发器中执行? 这里使用链接服务器写入mysql时直接在触发器中执行 基本不会成功,需要配置很多东西,还不一定成功,直接调用作业吧;

  • 相关阅读:
    unix操作系统一些笔记
    安装SQL SERVER2008 R2出现的几个问题
    js中的类型和函数参数传递类型问题
    js一些要点
    百度2015年前端笔试题(南京区域)
    js 函数中的 this 问题
    html细节
    前后台读取Web.config中的值的方法
    使用的 SQL Server 版本不支持数据类型“datetime2”.
    物料主数据MRP4中的独立/集中
  • 原文地址:https://www.cnblogs.com/GmrBrian/p/3199314.html
Copyright © 2011-2022 走看看