Registro inmediatamente anterior incorrecto

Dudas sobre código
Avatar de Usuario
leadrudi
Nivel 6
Mensajes: 221
Registrado: Sab Oct 14, 2017 7:55 am

Registro inmediatamente anterior incorrecto

Mensajepor leadrudi » Mar Oct 06, 2020 12:48 am

En la base de datos que tengo los usuarios quedan registrados con horas de ingreso y salida. Y, a modo de informe, se le muestra los datos de la última sesión anterior a la de hoy.
Hasta hace un tiempo, me traía los datos correctos, pero ha comenzado a devolver datos erróneos.
Por ejemplo, con el Usuario X, inició sesión con ID 69 y la inmediatamente posterior (del usuario) es la 74. Pero, por algún motivo me devuelve 51 (y debo aclarar que entre la 51 y la 74 ha habido al menos 15 sesiones.
¿Cómo puedo obtener de forma más precisa la sesión inmediatamente anterior?

Código: Seleccionar todo

vSesActual = vDAOUsr.Fields(2) 'Sesión actual (obtenido mediante consulta que trae solamente la sesión actual del Usuario).
vIDSesActual = vDAOUsr.Fields(0)
vIDSesAnterior = DLast("[ID]", "[tabUsuarios_Bitacora]", "[ID] < " & vIDSesActual & " AND [USUARIO] = '" & Me.txtUsuario.Value & "'") '"[INGRESO] < #" & vSesActual & "# AND [ID] < " & vIDSesActual & " AND [USUARIO] = '" & Me.txtUsuario.Value & "'") 'ID sesión actual
vSesAnterior = DLookup("[INGRESO]", "[tabUsuarios_Bitacora]", "[ID] = " & Nz(vIDSesAnterior, 1) & "") 'Sesión anterior (Ingreso)
vSalidaUltimaSesion = DLookup("[SALIDA]", "[tabUsuarios_Bitacora]", "[ID] = " & Nz(vIDSesAnterior, 1) & "") 'Sesión anterior (Salida)
vDurSes = DLookup("[SESION]", "[tabUsuarios_Bitacora]", "[ID] = " & Nz(vIDSesAnterior, 1) & " AND [USUARIO] = '" & Me.txtUsuario.Value & "'") 'Duración de la sesión

Cabe aclarar que para vIDSesAnterior también usé DLookUp devolviéndome, en este caso, 2. Y ni falta hace aclarar que entre 2 y 74 hubo al menos 41 sesiones. A su vez, en vIDSesAnterior también usé vSesActual (que trae la fecha actual) ("[INGRESO] < #" & vSesActual & "# AND ...) y de igual manera trae un valor incorrecto.
Controlé los valores (que por algún motivo se haya añadido un espacio o algo así) y todo me dio correcto.
A su vez, he borrado TODOS los registros y habiendo 2 registros solamente y del mismo usuario, devuelve nulo. No devuelve el registro 1.
Ya no sé qué puedo hacer.
:?: :!: :idea: :arrow: :oops: :( :o :) :D :geek: :ugeek:

cbou
Nivel 1
Mensajes: 12
Registrado: Vie Nov 03, 2017 8:24 am

Re: Registro inmediatamente anterior incorrecto

Mensajepor cbou » Mar Mar 02, 2021 10:43 am

detalla las tablas que utilizas

Avatar de Usuario
Neckkito
Moderador
Mensajes: 1092
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Registro inmediatamente anterior incorrecto

Mensajepor Neckkito » Mar Mar 02, 2021 9:03 pm

Hola:

Mi recomendación en estos casos es que simplifiques al máximo tanto los datos como los procedimientos, de tal manera que seas tú quien controle las variables.

Te pongo un ejemplo de lo que quiero decir:

En las tablas que analizas deja, por ejemplo, tres registros del mismo usuario. Supongamos que el usuario es Pepe y los Id's son 12 15 18.
De tu código elimina todos los valores que vienen dados por variables. Escribe las expresiones indicándole tú directamente los parámetros que te hacen de filtro. Por ejemplo, dlast("Id","TuTabla", "Id<18 And Usuario='Pepe'")
Al mismo tiempo, haz que se muestren los resultados a través de un msgbox o de un debug.print. Con lo anterior el dlast debería devolverte 15.
Si hasta aquí te devuelve bien los valores empieza a probar pasando los parámetros de filtro por variables, pero asegúrate de que están devolviendo los valores que realmente crees que devuelven. Por ejemplo:
vUser="Pepe"
dlast("Id","TuTabla", "Id<18 And Usuario='" & vUser & "'")

Y así vas complicando el proceso controlando, con cada adición de complejidad, que el código se está comportando como esperas. Si al final devuelve los valores correctos, pues ya lo tienes solucionado; si no, sabrás en qué momento y con qué condiciones estás operando cuando el código casca, y tendrás más fácil analizar qué está pasando.

Como comentario, intenta utilizar dmax() en lugar de dlast().

Saludos.
Access MVP 2017-2021
http://bit.ly/NckAccess

Avatar de Usuario
leadrudi
Nivel 6
Mensajes: 221
Registrado: Sab Oct 14, 2017 7:55 am

Re: Registro inmediatamente anterior incorrecto

Mensajepor leadrudi » Jue Abr 08, 2021 5:01 pm

Buenas tardes:
No respondí más porque de un momento a otro me arrojaba el resultado esperado. No entendí el motivo ni el origen del error. Como se dice en Argentina: "Cosa e' mandinga".
Ahora, respondiendo a tu respuesta, es buena idea. Ya lo implementaré ante otra necesidad.
Ahora, la duda que me surge es la diferencia entre DLast y DMax en cuanto a lo que se obtiene y posibles errores en los resultados. Porque en el uso que les he dado, han obtenido lo mismo, pero sus diferencias han de tener.
:?: :!: :idea: :arrow: :oops: :( :o :) :D :geek: :ugeek:

Avatar de Usuario
Neckkito
Moderador
Mensajes: 1092
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Registro inmediatamente anterior incorrecto

Mensajepor Neckkito » Jue Abr 08, 2021 6:46 pm

Access MVP 2017-2021
http://bit.ly/NckAccess


Volver a “Código VBA”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado