以文本方式查看主题

-  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
--  

机器表


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

人员表

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

数据采集表

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


--  作者:有点甜
--  发布时间: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