Huellas Reloj Biometrico Marca Zk

25 views
Skip to first unread message

Edwin Duran

unread,
9:39 AM (11 hours ago) 9:39 AM
to Comunidad de Visual Foxpro en Español
buen dia

Estoy realizando el proceso de descargar huellas y proceder guardarla en mi base de datos,  eso proceso ya lo tengo resuelto, el problema esta es que dura como 30 minutos para poder descargar 1145 registros, anexo código utilizado:

Saludos 
Edwin Duran

********************************************
*** Descargar todas las huellas
********************************************

Local oZK, cEnrollNumber, cName, cPassword, nPrivilege, lEnabled
Local nFingerIndex, cTmpData, nFlag

oZK = Createobject("zkemkeeper.ZKEM")

If oZK.Connect_Net("10.0.0.39", 4370)
? "Conectado al reloj correctamente."
? DATETIME()


Create Cursor Huellas (EnrollNumber C(10), Name C(50), FingerIndex I, Flag I, Template M )

Select Huellas


* Leer todos los usuarios
If oZK.ReadAllUserID(1)
cEnrollNumber = ""
cName = ""
cPassword = ""
nPrivilege = 0
lEnabled = .F.
nTmpLength = 2048

Do While oZK.SSR_GetAllUserInfo(1, @cEnrollNumber, @cName, @cPassword, @nPrivilege, @lEnabled)



* Recorrer dedos (0 al 9)
For nFingerIndex = 0 To 9
cTmpData = ""
nFlag = 0



* If oZK.SSR_GetUserTmpExStr(1, @cEnrollNumber, @nFingerIndex, @nFlag, @cTmpData)

If oZK.SSR_GetUserTmpStr(1, cEnrollNumber, nFingerIndex,  @cTmpData, nTmpLength)


Insert Into Huellas(EnrollNumber, Name, FingerIndex, Flag, Template);
           Values (cEnrollNumber,cName,nFingerIndex,nFlag,cTmpData)
Endif
Endfor
Enddo
Else
? "No se pudieron leer los usuarios."
Endif

* Mostrar resultados
? DATETIME()
Browse Normal

oZK.Disconnect()

Else
? "No se pudo conectar al reloj."
Endif

HERNAN D. A.

unread,
10:19 AM (10 hours ago) 10:19 AM
to publice...@googlegroups.com
Hola
*Cheka esto, no lo pude probar

* Programa: DescargarHuellas_ZK_Fast.prg
* Propósito: Descargar TODAS las huellas de un reloj ZKTeco de forma lo más rápida posible
* Fecha: Octubre 2025
* Notas: 
*   - Requiere ZKEMKeeper.dll registrado (regsvr32 zkemkeeper.dll)
*   - Usa SSR_GetUserTmpExStr (mejor que SSR_GetUserTmpStr en la mayoría de modelos recientes)
*   - IP y puerto ajusta según tu reloj
*   - Si tu modelo NO soporta ReadAllTemplate, comenta esa línea y prueba sin ella (será más lento)

LOCAL oZK
LOCAL cEnrollNumber, cName, cPassword, nPrivilege, lEnabled
LOCAL nFingerIndex, cTmpData, nFlag, nTmpLength
LOCAL lcIP, lnPort

lcIP   = "10.0.0.39"     && ← Cambia a la IP de tu reloj
lnPort = 4370

oZK = CREATEOBJECT("zkemkeeper.ZKEM")

? "Intentando conectar al reloj " + lcIP + ":" + TRANSFORM(lnPort) + " ..."
? DATETIME()

IF oZK.Connect_Net(lcIP, lnPort)
    ? "¡Conectado exitosamente!"
    ? "Hora: " + TTOC(DATETIME())

    * Crear cursor para almacenar las huellas
    CREATE CURSOR Huellas ;
        (EnrollNumber C(10), ;
         Name        C(50), ;
         FingerIndex I, ;
         Flag        I, ;
         Template    M)

    SELECT Huellas

    * Cargar todos los usuarios
    IF oZK.ReadAllUserID(1)
        ? "Usuarios cargados en memoria."

        * Intentar cargar TODAS las plantillas en buffer (clave para velocidad)
        IF oZK.ReadAllTemplate(1)
            ? "¡Todas las plantillas cargadas en buffer! (Modo rápido activado)"
        ELSE
            ? "Advertencia: ReadAllTemplate falló. Continuando en modo lento..."
        ENDIF

        * Recorrer todos los usuarios
        DO WHILE oZK.SSR_GetAllUserInfo(1, @cEnrollNumber, @cName, @cPassword, @nPrivilege, @lEnabled)

            * Limpiar variables por si acaso
            STORE ""   TO cTmpData
            STORE 0    TO nFlag, nTmpLength

            * Probar los 10 posibles dedos (0-9)
            FOR nFingerIndex = 0 TO 9

                cTmpData   = SPACE(4096)   && Pre-alojar espacio grande (muchos templates >2048)
                nFlag      = 0
                nTmpLength = 4096          && Ajusta si sabes el tamaño max de tu modelo

                * Método recomendado: SSR_GetUserTmpExStr (devuelve flag + template en string)
                IF oZK.SSR_GetUserTmpExStr(1, cEnrollNumber, nFingerIndex, @nFlag, @cTmpData, @nTmpLength)

                    * Guardar solo los bytes válidos
                    INSERT INTO Huellas ;
                        (EnrollNumber, Name, FingerIndex, Flag, Template) ;
                        VALUES ;
                        (cEnrollNumber, cName, nFingerIndex, nFlag, LEFT(cTmpData, nTmpLength))

                    ? "Huella guardada → ID:" + cEnrollNumber + " Dedo:" + TRANSFORM(nFingerIndex) + " Flag:" + TRANSFORM(nFlag)
                ENDIF

            ENDFOR

        ENDDO

        ? "Descarga finalizada."
        ? "Total huellas descargadas: " + TRANSFORM(RECCOUNT("Huellas"))
        ? DATETIME()

        * Mostrar resultados
        BROWSE NORMAL TITLE "Huellas Descargadas del Reloj"

    ELSE
        ? "Error: No se pudieron leer los usuarios (ReadAllUserID falló)."
    ENDIF

    oZK.Disconnect()
    ? "Desconectado del reloj."
ELSE
    ? "¡Error de conexión! Verifica IP, puerto, firewall o que el reloj esté encendido."
    ? "Código error (si aplica): " + TRANSFORM(oZK.GetLastError())
ENDIF

RELEASE oZK

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/3507a7c2-264b-4f98-9371-98f063db2e0fn%40googlegroups.com.

Jorge L. Florez C.

unread,
12:18 PM (8 hours ago) 12:18 PM
to publice...@googlegroups.com
Hola
Y después de leer los registros de la marcación eliminas esos datos del lector?

Saludos
Jorge Florez

--

Edwin Duran

unread,
2:20 PM (6 hours ago) 2:20 PM
to Comunidad de Visual Foxpro en Español
Saludos  Jorge, esto es para guardar las huellas en la base de datos, 

Para lo que comentas,  yo cuando descargo los datos del Reloj si los borro.

Saludos 
Edwiin Duran

Edwin Duran

unread,
3:16 PM (5 hours ago) 3:16 PM
to Comunidad de Visual Foxpro en Español
Saludos al codigo que coloque solo le hacia fata este codigo
? "Usuarios cargados en memoria."
        * Intentar cargar TODAS las plantillas en buffer (clave para velocidad)
        IF oZK.ReadAllTemplate(1)
            ? "¡Todas las plantillas cargadas en buffer! (Modo rápido activado)"
        ELSE
            ? "Advertencia: ReadAllTemplate falló. Continuando en modo lento..."
        ENDIF

y ahí si esta rapido, seguire haciendo pruebas
Reply all
Reply to author
Forward
0 new messages