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

请传送下面链接: http方式读取考勤机记录,http://blog.csdn.net/tao2581/article/details/8439516


*****************************************************************************

之前写过一篇中控考勤机与通达OA的文章,先拿来引用一下:

通达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 ,作业计划选择每天 ,作业步骤 添加以下脚本:

use att2008
declare @num int,
<span style="white-space:pre">		</span>@sqls nvarchar(4000),
<span style="white-space:pre">		</span>@con varchar(200),
<span style="white-space:pre">		</span>@startID int,
<span style="white-space:pre">		</span>@attend_duty varchar(300)


set @startID=0
--需先安装MySQL ODBC 3.51驱动
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'','
set @attend_duty=@con+'''select * from ATTEND_DUTY;'')'
set @sqls='SELECT @a=outid FROM '+@con+'''select outid from attend_duty order by id desc limit 1;'')'


exec('delete '+@con+'''select * from attend_duty'') where register_type=2 and CONVERT(varchar(12) , register_time, 112 )=
(select top 1 CONVERT(varchar(12) ,CHECKTIME, 112 ) from CHECKINOUT order by CHECKTIME desc)
')
exec sp_executesql @sqls,N'@a int output',@startID output
print @startID


exec('insert '+@con+'''select * from ATTEND_DUTY'') (outid,USER_ID,REGISTER_TYPE,REGISTER_TIME,REGISTER_IP,type)
SELECT top 500 C.id,case when A.user_id is not null then A.user_id else ''0'' end,


--有最优版本,代码改进了很多,这个方式缺点太多废弃了,这里就不更新了 有需要商业合作:343828881


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

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


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

use att2008
if (object_id('tgr_zk2TDOA_insert', 'tr') is not null)
    drop trigger tgr_zk2TDOA_insert
go

create trigger tgr_zk2TDOA_insert on CHECKINOUT  Instead Of Insert
as    
SET XACT_ABORT ON 
--*************************************************************


if exists (select 1 from checkinout where checktime=(select checktime from inserted) )
   return;

insert checkinout(USERID,CHECKTIME,CHECKTYPE,VERIFYCODE,SENSORID,WORKCODE,sn,USEREXTFMT) 
select USERID,CHECKTIME,CHECKTYPE,VERIFYCODE,SENSORID,WORKCODE,sn,USEREXTFMT from inserted

--执行同步作业
declare @JobID uniqueidentifier
select @JobID=Job_ID from msdb.dbo.sysjobs where Name='update_TDOA' --查Job_ID
EXEC msdb.dbo.sp_start_job @job_id = @JobID

--************************************************************
go
SET XACT_ABORT OFF 
print '更新成功!';
go


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

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

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


商业合作/技术交流 : QQ 372315839

更多相关文章

  1. 以DAG方式调度作业
  2. python 的基础 学习 11天 作业题
  3. 20169210《Linux内核原理与分析》第七周作业
  4. 求助:请大侠帮我把下面的查询语句改写为可以在SQL"作业"中定时执
  5. 查看 SQL Server 作业(job)运行结果状态脚本
  6. Java第三次作业——面向对象基础(封装)
  7. 2017-2018-1 JAVA实验站 第三周作业
  8. IT十八掌作业_java基础第20天_断点续传、屏广软件
  9. 无法从其他用户的crontab作业执行java程序

随机推荐

  1. 如何用Android(安卓)Studio打多包名APK
  2. Android(安卓)Frame动画demo
  3. Android使用Fragment打造万能页面切换框
  4. Android init.rc详解
  5. Android的快速开发框架,Afinal 0.2.1 发布
  6. android 本地数据库
  7. Google Android Market疑遭屏蔽
  8. Android项目应用程序—应用程序及生命周
  9. 关于Android机型的pid vid的那些破事儿
  10. Android(安卓)开发者的 Flutter(六) —— F