Foxtable(狐表)用户栏目专家坐堂 → 中控考勤机数据的读取


  共有4904人关注过本帖树形打印复制链接

主题:中控考勤机数据的读取

帅哥哟,离线,有人找我吗?
YDS
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
中控考勤机数据的读取  发帖心情 Post By: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 的时候,说明读取考勤记录完成,把读取到的记录写
到数据库或以其他形式显示,即可完成考勤记录的下载。

 回到顶部
帅哥哟,离线,有人找我吗?
YDS
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By: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

 回到顶部
帅哥哟,离线,有人找我吗?
YDS
  3楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By: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

 回到顶部
帅哥哟,离线,有人找我吗?
YDS
  4楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2019/1/7 9:51:00 [显示全部帖子]

已经测试成功了,非常感谢

 回到顶部
帅哥哟,离线,有人找我吗?
YDS
  5楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By: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
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2019/1/7 16:58:00 [显示全部帖子]

机器表


图片点击可在新窗口打开查看此主题相关图片如下:机器.jpg
图片点击可在新窗口打开查看

人员表

图片点击可在新窗口打开查看此主题相关图片如下:人员.jpg
图片点击可在新窗口打开查看

数据采集表

图片点击可在新窗口打开查看此主题相关图片如下:采集数据.jpg
图片点击可在新窗口打开查看


 回到顶部
帅哥哟,离线,有人找我吗?
YDS
  7楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2019/1/7 17:03:00 [显示全部帖子]

三个机器,没事每个机器读取数据之前都要连接一次吗?

 回到顶部
帅哥哟,离线,有人找我吗?
YDS
  8楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2019/1/8 7:43:00 [显示全部帖子]

1.三个机器都可以正常连接
2.加入msgbox后,读取数据到内存比较慢,从内存再逐条读取更慢
3.存储和find如果不一起操作,代码应该怎么写?

 回到顶部
帅哥哟,离线,有人找我吗?
YDS
  9楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2019/1/8 8:07:00 [显示全部帖子]

还有就是数据读取到内存以后,逐步读取数据完成以后,内存需要清空一下吗?要不下次在读取数据到内存的时候会不会卡?

 回到顶部
帅哥哟,离线,有人找我吗?
YDS
  10楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:648 积分:3730 威望:0 精华:0 注册:2011/5/21 18:05:00
  发帖心情 Post By:2019/1/8 8:13:00 [显示全部帖子]

Dim s As String
vars("txt")  = "c:\data\KQ-" & Format(Date.Today,"yyyyMMdd") & ".txt"
s = "开始:" & Format(Date.now,"yyyy-MM-dd HH:mm:ss:fff")
Filesys.WriteAllText(vars("txt") ,vbcrlf & s & vbcrlf, True)
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")
    s = iMachineNumber & "号机连接:" & Format(Date.now,"yyyy-MM-dd HH:mm:ss:fff")
    Filesys.WriteAllText(vars("txt") ,s & vbcrlf, True)
    If bIsConnected = True Then
        r("状态") = "连接成功"
        r("时间") = Date.now
        r.save
        AxCZKEM1.EnableDevice(iMachineNumber, False) 'disable the device
        If AxCZKEM1.ReadAllUserID(iMachineNumber) Then
            s = iMachineNumber & "号机读取人员数据到内存:" & Format(Date.now,"yyyy-MM-dd HH:mm:ss:fff")
            Filesys.WriteAllText(vars("txt") ,s & vbcrlf, True)
            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
                    End If
                End If
            End While
            s = iMachineNumber & "号机逐条读取人员数据:" & Format(Date.now,"yyyy-MM-dd HH:mm:ss:fff")
            Filesys.WriteAllText(vars("txt") ,s & vbcrlf, True)
        End If
        If AxCZKEM1.ReadGeneralLogData(iMachineNumber) Then 'read all the attendance records to the memory
            s = iMachineNumber & "号机读取考勤数据到内存:" & Format(Date.now,"yyyy-MM-dd HH:mm:ss:fff")
            Filesys.WriteAllText(vars("txt") ,s & vbcrlf, True)
            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 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
            s = iMachineNumber & "号机逐条读取考勤数据:" & Format(Date.now,"yyyy-MM-dd HH:mm:ss:fff")
            Filesys.WriteAllText(vars("txt") ,s & vbcrlf, True)
            DataTables("采集数据").ResumeRedraw
        End If
        AxCZKEM1.EnableDevice(iMachineNumber, True)
    Else
        r("状态") = "连接失败"
        r("时间") = Date.now
        r.Save
    End If
    s = iMachineNumber & "号机结束:" & Format(Date.now,"yyyy-MM-dd HH:mm:ss:fff")
    Filesys.WriteAllText(vars("txt") ,s & vbcrlf, True)
Next
s = "结束:" & Format(Date.now,"yyyy-MM-dd HH:mm:ss:fff")
Filesys.WriteAllText(vars("txt") ,s & vbcrlf, True)

加入事件记录以后,得到的记录如下:
开始:2019-01-08 08:10:27:041
1号机连接:2019-01-08 08:10:27:263
1号机读取人员数据到内存:2019-01-08 08:10:27:438
1号机逐条读取人员数据:2019-01-08 08:10:27:444
1号机读取考勤数据到内存:2019-01-08 08:10:28:826
1号机逐条读取考勤数据:2019-01-08 08:10:29:562
1号机结束:2019-01-08 08:10:29:581
2号机连接:2019-01-08 08:10:34:958
2号机读取人员数据到内存:2019-01-08 08:10:36:295
2号机逐条读取人员数据:2019-01-08 08:10:36:303
2号机读取考勤数据到内存:2019-01-08 08:10:46:586

 回到顶部
总数 12 1 2 下一页