通達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時直接在觸發器中執行 基本不會成功,需要配置很多東西,還不一定成功,直接調用作業吧;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM