如果你用的是中控考勤機且考勤機能聯網,那恭喜有福了! 最近發現考勤機提供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 '+@con+'''select * from attend_duty'') where register_type=2 and CONVERT(varchar(12) , register_time, 112 )= 13 (select top 1 CONVERT(varchar(12) ,CHECKTIME, 112 ) from CHECKINOUT order by CHECKTIME desc) 14 ') 15 exec sp_executesql @sqls,N'@a int output',@startID output 16 print @startID 17 exec('insert '+@con+'''select * from ATTEND_DUTY'') (outid,USER_ID,REGISTER_TYPE,REGISTER_TIME,REGISTER_IP,type) 18 SELECT top 500 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時直接在觸發器中執行 基本不會成功,需要配置很多東西,還不一定成功,直接調用作業吧;