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