以文本方式查看主题 - Foxtable(狐表) (http://www.foxtable.com/bbs/index.asp) -- 专家坐堂 (http://www.foxtable.com/bbs/list.asp?boardid=2) ---- 中控考勤机数据的读取 (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=129763) |
-- 作者:YDS -- 发布时间:2019/1/5 16:47:00 -- 中控考勤机数据的读取 Dim axCZKEM1 As New zkemkeeper.CZKEM Dim bIsConnected = axCZKEM1.Connect_Net("192.168.1.245", "4370") If bIsConnected = False Then messagebox.show("连接失败") ElseIf bIsConnected = True Then MessageBox.show("连接成功") End If Dim dq = axCZKEM1.ReadAllGLogData("1") If dq = False Then messagebox.show("读取失败") ElseIf dq = True Then MessageBox.show("读取成功") End If 以上代码已经执行,使用ReadAllGLogData已经把数据读取到PC 的内部缓冲区,接下来该从内部缓冲区中逐一读取考勤记录,但是这里不知道怎么操作了,请指教! 5.2 数据管理相关函数 5.2.1 考勤记录数据 5.2.1.1 ReadGeneralLogData 【函数定义】 VARIANT_BOOL ReadGeneralLogData( [in] long dwMachineNumber) 【功能】 读取考勤记录到 PC 的内部缓冲区,同 ReadAllGLogData 【参数】 dwMachineNumber: 机器号 【返回值】 成功返回 True,否则返回 False 【相关函数】 ReadAllGLogData、SSR_GetGeneralLogData、ClearGLog 5.2.1.3 SSR_GetGeneralLogData 【函数定义】 VARIANT_BOOL SSR_GetGeneralLogData( [in] LONG dwMachineNumber, [out] BSTR* dwEnrollNumber, [out] LONG* dwVerifyMode, [out] LONG* dwInOutMode, [out] LONG* dwYear, [out] LONG* dwMonth, [out] LONG* dwDay, [out] LONG* dwHour, [out] LONG* dwMinute, [out] LONG* dwSecond, [out] LONG* dwWorkcode) 【功能】 从内部缓冲区中逐一读取考勤记录,使用该函数前,可使用 ReadAllGLogData 或 ReadGeneralLogData 将考勤 记录从机器读到 PC 内部缓冲区。该函数每执行一次,指向考勤记录的指针指向下一条记录,同 GetGeneralLogData 不同的是该函数适用与彩屏机 【参数】 dwMachineNumber 机器号 dwEnrollNumber 指向 BSTR 型变量的指针,值接收该考勤记录的用户 ID 号,可最大支持 24 位 dwVerifyMode 指向 long 型变量的指针,其值接收记录的验证方式,具体含义如下: 一般情况下:0 为密码验证,1 为指纹验证,2 为卡验证 多种验证方式模式下: FP_OR_PW_OR_RF_ORFACE 0 FP 1 PIN 2 PW 3 RF 4 FP_OR_PW 5 FP_OR_RF 6 PW_OR_RF 7 PIN_AND_FP 8 FP_AND_PW 9 FP_AND_RF 10 PW_AND_RF 11 FP_AND_PW_AND_RF 12 PIN_AND_FP_AND_PW 13 FP_AND_RF_OR_PIN 14 FACE 15 FACE_AND_FP 16 FACE_AND_PW 17 FACE_AND_RF 18 FACE_AND_FP_AND_RF 19 FACE_AND_FP_AND_PW 20 dwInOutMode 指向 long 型变量的指针,其值接收记录的考勤状态,具体含义如下: 默认 0—Check-In 1—Check-Out 2—Break-Out 3—Break-In 4—OT-In 5—OT-Out dwYear,dwMonth,dwDay,dwHour,dwMinute,dwSecond, 都为指向 long 型变量的指针,其值分别接收考勤记录的日期和时间 dwWorkcode 指向 long 型变量的指针,其值接收记录的 Workcode 值 【返回值】 成功返回 True,否则返回 False 【相关函数】 ReadGeneralLogData 6.1 如何下载考勤记录 首先用 ReadGeneralLogData 函数可以把所有的考勤记录读到内存中,然后使用 SSR_GetGeneralLogData 函数循环 取得考勤记录,当函数 SSR_GetGeneralLogData 返回 False 的时候,说明读取考勤记录完成,把读取到的记录写 到数据库或以其他形式显示,即可完成考勤记录的下载。 |
-- 作者:有点蓝 -- 发布时间:2019/1/5 17:02:00 -- 安装一个vs然后看看axCZKEM1.SSR_GetGeneralLogData需要什么类型的参数。估计应该是这样的 dim dwEnrollNumber as new stringbuilder dim dwVerifyMode as long …… do while axCZKEM1.SSR_GetGeneralLogData("1",dwEnrollNumber ,dwVerifyMode ,.........)
msgbox(dwEnrollNumber )
msgbox(dwVerifyMode ) loop
|
-- 作者:YDS -- 发布时间:2019/1/5 17:06:00 -- 5.2.1.3 SSR_GetGeneralLogData 【函数定义】 VARIANT_BOOL SSR_GetGeneralLogData( [in] LONG dwMachineNumber, [out] BSTR* dwEnrollNumber, [out] LONG* dwVerifyMode, [out] LONG* dwInOutMode, [out] LONG* dwYear, [out] LONG* dwMonth, [out] LONG* dwDay, [out] LONG* dwHour, [out] LONG* dwMinute, [out] LONG* dwSecond, [out] LONG* dwWorkcode) 【功能】 从内部缓冲区中逐一读取考勤记录,使用该函数前,可使用 ReadAllGLogData 或 ReadGeneralLogData 将考勤 记录从机器读到 PC 内部缓冲区。该函数每执行一次,指向考勤记录的指针指向下一条记录,同 GetGeneralLogData 不同的是该函数适用与彩屏机 【参数】 dwMachineNumber 机器号 dwEnrollNumber 指向 BSTR 型变量的指针,值接收该考勤记录的用户 ID 号,可最大支持 24 位 dwVerifyMode 指向 long 型变量的指针,其值接收记录的验证方式,具体含义如下: 一般情况下:0 为密码验证,1 为指纹验证,2 为卡验证 多种验证方式模式下: FP_OR_PW_OR_RF_ORFACE 0 FP 1 PIN 2 PW 3 RF 4 FP_OR_PW 5 FP_OR_RF 6 PW_OR_RF 7 PIN_AND_FP 8 FP_AND_PW 9 FP_AND_RF 10 PW_AND_RF 11 FP_AND_PW_AND_RF 12 PIN_AND_FP_AND_PW 13 FP_AND_RF_OR_PIN 14 FACE 15 FACE_AND_FP 16 FACE_AND_PW 17 FACE_AND_RF 18 FACE_AND_FP_AND_RF 19 FACE_AND_FP_AND_PW 20 dwInOutMode 指向 long 型变量的指针,其值接收记录的考勤状态,具体含义如下: 默认 0—Check-In 1—Check-Out 2—Break-Out 3—Break-In 4—OT-In 5—OT-Out dwYear,dwMonth,dwDay,dwHour,dwMinute,dwSecond, 都为指向 long 型变量的指针,其值分别接收考勤记录的日期和时间 dwWorkcode 指向 long 型变量的指针,其值接收记录的 Workcode 值 【返回值】 成功返回 True,否则返回 False 【相关函数】 ReadGeneralLogData
|
-- 作者:有点蓝 -- 发布时间:2019/1/5 17:34:00 -- 到vs里看,或者找硬件sdk里的c#或者vb.net例子。看这个帮助没啥用的 |
-- 作者:YDS -- 发布时间:2019/1/7 8:14:00 -- Dim sdwEnrollNumber As String = "" Dim idwVerifyMode As Integer Dim idwInOutMode As Integer Dim idwYear As Integer Dim idwMonth As Integer Dim idwDay As Integer Dim idwHour As Integer Dim idwMinute As Integer Dim idwSecond As Integer Dim idwWorkcode As Integer Dim idwErrorCode As Integer Dim iGLCount = 0 Dim lvItem As New ListViewItem("Items", 0) Cursor = Cursors.WaitCursor lvLogs.Items.Clear() AxCZKEM1.EnableDevice(iMachineNumber, False) \'disable the device If AxCZKEM1.ReadGeneralLogData(iMachineNumber) Then \'read all the attendance records to the memory \'get records from the memory While AxCZKEM1.SSR_GetGeneralLogData(iMachineNumber, sdwEnrollNumber, idwVerifyMode, idwInOutMode, idwYear, idwMonth, idwDay, idwHour, idwMinute, idwSecond, idwWorkcode) iGLCount += 1 lvItem = lvLogs.Items.Add(iGLCount.ToString()) lvItem.SubItems.Add(sdwEnrollNumber) lvItem.SubItems.Add(idwVerifyMode.ToString()) lvItem.SubItems.Add(idwInOutMode.ToString()) lvItem.SubItems.Add(idwYear.ToString() & "-" + idwMonth.ToString() & "-" & idwDay.ToString() & " " & idwHour.ToString() & ":" & idwMinute.ToString() & ":" & idwSecond.ToString()) lvItem.SubItems.Add(idwWorkcode.ToString()) End While Else Cursor = Cursors.Default AxCZKEM1.GetLastError(idwErrorCode) If idwErrorCode <> 0 Then MsgBox("Reading data from terminal failed,ErrorCode: " & idwErrorCode, MsgBoxStyle.Exclamation, "Error") Else MsgBox("No data from terminal returns!", MsgBoxStyle.Exclamation, "Error") End If End If
|
-- 作者:有点甜 -- 发布时间:2019/1/7 9:20:00 -- 参考
http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=110373&authorid=0&page=0&star=1
|
-- 作者:YDS -- 发布时间:2019/1/7 9:51:00 -- 已经测试成功了,非常感谢 |
-- 作者:YDS -- 发布时间:2019/1/7 16:48:00 -- Dim axCZKEM1 As New zkemkeeper.CZKEM Dim sdwEnrollNumber As String = "" Dim sName As String = "" Dim sPassword As String = "" Dim iPrivilege As Integer Dim bEnabled As Boolean = False Dim idwVerifyMode As Integer Dim idwInOutMode As Integer Dim idwYear As Integer Dim idwMonth As Integer Dim idwDay As Integer Dim idwHour As Integer Dim idwMinute As Integer Dim idwSecond As Integer Dim idwWorkcode As Integer Dim dr,nr As DataRow For Each r As Row In Tables("机器").Rows Dim iMachineNumber As Integer = r("机器号") Dim bIsConnected = axCZKEM1.Connect_Net(r("IP"), "4370") If bIsConnected = True Then r("状态") = "连接成功" r("时间") = Date.now r.save AxCZKEM1.EnableDevice(iMachineNumber, False) \'disable the device If AxCZKEM1.ReadAllUserID(iMachineNumber) Then While AxCZKEM1.SSR_GetAllUserInfo(iMachineNumber, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled) = True \'get all the users\' information from the memory If sName.length = 4 Then sName = sName.Substring(0,2) Else If sName.length = 6 Then sName = sName.Substring(0,3) End If End If dr = DataTables("人员").Find("编号 = \'" & sdwEnrollNumber & "\'") If dr Is Nothing Then nr = DataTables("人员").AddNew() nr("编号") = sdwEnrollNumber nr("姓名") = sName nr("密码") = sPassword nr("权限") = iPrivilege nr("启用") = bEnabled nr.save Else If dr("姓名") <> sName Then dr("姓名") = sName dr.save End If End If End While End If If AxCZKEM1.ReadGeneralLogData(iMachineNumber) Then \'read all the attendance records to the memory DataTables("采集数据").StopRedraw While AxCZKEM1.SSR_GetGeneralLogData(iMachineNumber,sdwEnrollNumber, idwVerifyMode, idwInOutMode, idwYear, idwMonth, idwDay, idwHour, idwMinute, idwSecond, idwWorkcode) dr = DataTables("采集数据").Find("编号 = \'" & sdwEnrollNumber & "\' and 时间 = \'" & idwYear.ToString() & "-" & idwMonth.ToString() & "-" & idwDay.ToString() & " " & idwHour.ToString() & ":" & idwMinute.ToString() & ":" & idwSecond.ToString() & "\'") If dr Is Nothing And idwYear.ToString() = "2018" And idwMonth.ToString() = "12" Then nr = DataTables("采集数据").AddNew() nr("编号") = sdwEnrollNumber nr("方式") = idwVerifyMode.ToString() nr("机器") = iMachineNumber nr("IP") = r("IP") nr("Y") = idwYear.ToString() nr("M") = idwMonth.ToString() nr("D") = idwDay.ToString() nr("T") = idwHour.ToString() & ":" & idwMinute.ToString() & ":" & idwSecond.ToString() nr("时间") = idwYear.ToString() & "-" & idwMonth.ToString() & "-" & idwDay.ToString() & " " & idwHour.ToString() & ":" & idwMinute.ToString() & ":" & idwSecond.ToString() nr.save End If End While DataTables("采集数据").ResumeRedraw End If AxCZKEM1.EnableDevice(iMachineNumber, True) Else r("状态") = "连接失败" r("时间") = Date.now r.Save End If Next 以上代码在计划任务里面,每天晚上10点运行一次,但是我再命令窗口测试的时候一直卡死,请教一下是不是那里代码有问题?
|
-- 作者:YDS -- 发布时间:2019/1/7 16:58:00 -- 机器表 |
-- 作者:有点甜 -- 发布时间:2019/1/7 16:58:00 -- 1、你机器那里有多少行?为什么要重复连接
For Each r As Row In Tables("机器").Rows
Dim iMachineNumber As Integer = r("机器号")
Dim bIsConnected = axCZKEM1.Connect_Net(r("IP"), "4370")
不能只连接一次?然后直接时候即可?
2、加入msgbox或者output.show,看执行到哪里耗时和出问题。
3、是不是你数据量太大或者是存储和find一起操作导致慢? http://www.foxtable.com/webhelp/scr/2225.htm
|