Saber ultimo registro en visual

Quiero saber como hacer desde visual basic 6.0 para que pueda hacer una consulta en mi tabla Posiciones de mi base de datos sql para que se pare en el ultimo registro de la misma comparando el parámetro fecha y el móvil y si encuentra en el ultimo registro ese dato que no me permita ingresar un mismo registro con ese móvil y esa fecha, pero no logro obtener ese ultimo registro, lo que he logrado hasta el momento es encontrar un primer registro que coincida con el móvil y la fecha pero igual me sigue guardando.
En fin si alguien me puede ayudar a encontrar el ultimo registro desde visual de mi tabla sql Posiciones les agradecería, he probado con:
MiRecordset9.Open "SELECT Posi_Vehi_id, Posi_fecha, " & _
'"From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC) ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic, pero no me funciona.

1 respuesta

Respuesta
1
Te propongo que adicionalmente a lo que ya haces intentes lo siguiente:
if MiRecordset9.bof and MiRecordset9.eof then
'Esto quiere decir que no encontró ningún registro que coincida con los parametros de la consulta
MiRecordset9.update 
else
msgbox "Ya existe un regitro con los datos del MOVIL"
end if
Si esto no es lo que buscas te puedo proponer otra solución. Por cierto porque no intentas ordenar de forma DESCENDENTE tu consulta, así estarías en el último registro.
Es algo así si, lo que quiero y no logro es consultar el ultimo registro desde visual que tenga el móvil que esta entrando como dato y que tenga la ultima fecha registrada en la tablla par ese móvil y si existe que no vuelva a guardar porque sino se repite y si no esta que si guarde.
A ver cuando haces una consulta, ésta sólo te puede devolver 2 opciones para tu recordset una es que el RecordSet este vacío y la otra es que contenga datos.
Obviamente los resultados dependen directamente de los parámetros y operadores que tengas en la clausula WHERE por ejemplo cuando usas el operardor AND la consulte te devuelve menos registros para el RecorSet, en cambio cuando usas el operador OR te puede devolver muchos más.
Regresando al problema que planteas te puedo sugerir lo siguiente:
1.- Si necesitas el último registro del RecordSet haz la siguiente consulta:
MiRecordset9.Open "SELECT TOP 1 Posi_Vehi_id, Posi_fecha, " & _ 
'"From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC) ORDER BY Posi_fecha DESC", MiConexion, adOpenDynamic, adLockOptimistic
En este caso TOP 1 indica que sólo te devuelva un registro y DESC en el ORDER BY sirve para que ordene los registros de forma Descendente. Resultado te debe devolver el último registro.
2.-Usando tu consulta original puedes usar el comando MOVELAST del Recordset
Ejemplo:
MiRecordset9.Open "SELECT Posi_Vehi_id, Posi_fecha, " & _ 
'"From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC) ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic
MiRecordset9. MoveLast
Si esto no resuelve tu problema aún entonces te pido me muestres un ejemplo del resultado que tu consulta devuelve para tratar de entender mejor el problema.
Hola esta bueno lo que me pasaste pero cuando coloco en mi aplicación y entra hay debugeando se sale no entra al if y no se que podrá ser y si estoy errando en algo, muchas gracias por ayudarme. Esto me tiene loco, me esta repitiendo los datos, digo el dato que no quiero que repita es la fecha, el móvil y demás puede ser el mismo, pero la fecha no.
MiRecordset5.Open "SELECT Posi_Vehi_id, Posi_fecha, " & _
    "From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC) ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic
    MiRecordset5.MoveLast
    If MiRecordset5.EOF = False Then
        MsgBox "encontre mismo datos"
        Exit Sub
    Else
        MsgBox "puedo guardar no encontre dato"
    End If
Porque no agregas un procedimiento con manejo de errores y así cuando corras la aplicación capturas los errores que puedan presentarse y de esa manera puedas saber donde falla
Ejemplo
Public Sub BuscaUltimoDato(ByVal sDato1 as string, ByVal dFechas as Date)
On Error GoTo Err_BuscaUltimoDato
 MiRecordset5.Open "SELECT Posi_Vehi_id, Posi_fecha, " & _ 
    "From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC) ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic 
If MiRecordset5.BOF AND MiRecordset5.EOF then
<span style="white-space: pre;"> </span>MsgBox "puedo guardar no encontre dato"
Else
MiRecordset5.MoveLast  
    If MiRecordset5.EOF = False Then 
        MsgBox "encontre mismo datos" 
        Exit Sub 
    Else 
        MsgBox "puedo guardar no encontre dato" 
    End If
End IF
Exit_BuscaUltimoDato:
       Exit Sub
Err_BuscaUltimoDato:
<span style="white-space: pre;"> </span>if Err.Number <>0 then
<span style="white-space: pre;"> </span>MsgBox "Error No. " & Err.Number & " - " & Err.Description & " Originado por: " & Err.Source
<span style="white-space: pre;"> </span>End If
<span style="white-space: pre;"> </span>Resume Err_BuscaUltimoDato
End Sub
Hola sabes que coloque lo que me pasaste y quedo así:
Public Sub BuscaUltimoDato(ByVal sDato1 As String, ByVal dFechas As Date)
    On Error GoTo Err_BuscaUltimoDato
     MiRecordset5.Open "SELECT Posi_Vehi_id, Posi_fecha, " & _
        "From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC) ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic
    If MiRecordset5.BOF And MiRecordset5.EOF Then
        MsgBox "puedo guardar no encontre dato"
    Else
    MiRecordset5.MoveLast
        If MiRecordset5.EOF = False Then
            MsgBox "encontre mismo datos"
            Exit Sub
        Else
            MsgBox "puedo guardar no encontre dato"
            Call ActPosiciones
        End If
    End If
Exit_BuscaUltimoDato:
           Exit Sub
Err_BuscaUltimoDato:
    If Err.Number <> 0 Then
        MsgBox "Error No. " & Err.Number & " - " & Err.Description & " Originado por: " & Err.Source
    End If
    Resume Err_BuscaUltimoDato
End Sub
.....pero al entrar aca MiRecordset5.Open "SELECT Posi_Vehi_id, Posi_fecha, " & _
        "From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC) ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic
no pasa al if y salta el error este:
Error 3705 La operación no esta permitida si el objeto esta abierto Originado por ADODB Recrdset.
Gracias por tratar de ayudarmela verdad no doy con esto se me duplican los datos en mi tabla, lo que se puede repetir es el móvil ej 1010, pero la fecha también me repite ej 10:00,10:00 y eso es lo que quiero controlar si la fecha es igual que no guarde, gracias.
Ok haz lo siguiente primero valida el estado del record set y luego procede a realizar tu acciones:
Public Sub BuscaUltimoDato(ByVal sDato1 As String, ByVal dFechas As Date) 
    On Error GoTo Err_BuscaUltimoDato 
if MiRecordset5.state<>0 then 
<span style="white-space: pre;"> </span>MiRecordset5.close
end if     

MiRecordset5.Open "SELECT Posi_Vehi_id, Posi_fecha, " & _ 
        "From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC) ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic 
    If MiRecordset5.BOF And MiRecordset5.EOF Then 
        MsgBox "puedo guardar no encontre dato" 
    Else 
    MiRecordset5.MoveLast 
        If MiRecordset5.EOF = False Then 
            MsgBox "encontre mismo datos" 
            Exit Sub 
        Else 
            MsgBox "puedo guardar no encontre dato" 
            Call ActPosiciones 
        End If 
    End If 
Exit_BuscaUltimoDato: 
           Exit Sub 
Err_BuscaUltimoDato: 
    If Err.Number <> 0 Then 
        MsgBox "Error No. " & Err.Number & " - " & Err.Description & " Originado por: " & Err.Source 
    End If 
    Resume Err_BuscaUltimoDato 
End Sub
Bueno impecable con esto sabemos los errores, muy bueno mira ahora en el código le borre el dato1 que estaba como parámetro porque no era necesario solo deje la fecha.
Public Sub BuscaUltimoDato(ByVal dFechas As Date)
    On Error GoTo Err_BuscaUltimoDato
    If MiRecordset5.state <> 0 Then
        MiRecordset5.Close
    End If
    MiRecordset5.Open "SELECT Posi_Vehi_id, Posi_fecha, " & _
            "From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC) ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic
        If MiRecordset5.BOF And MiRecordset5.EOF Then
            MsgBox "puedo guardar no encontre dato"
        Else
        MiRecordset5.MoveLast
            If MiRecordset5.EOF = False Then
                MsgBox "encontre mismo datos"
                Exit Sub
            Else
                MsgBox "puedo guardar no encontre dato"
                Call ActPosiciones
            End If
        End If
Exit_BuscaUltimoDato:
               Exit Sub
Err_BuscaUltimoDato:
        If Err.Number <> 0 Then
            MsgBox "Error No. " & Err.Number & " - " & Err.Description & " Originado por: " & Err.Source
        End If
        Resume Err_BuscaUltimoDato
End Sub
EN MIRecordset5.state me da que es igual a 1 y de hay se cierra y salta el error
SINTAXI INCORRECTA CERCA DE LA PALABRA CLAVE FROM, Y HAY QUEDA EN EL ERROR Y NO SALE
Te sobra una coma después de Posi_fecha Checalo de nuevo
Así quedaría:
Public Sub BuscaUltimoDato(ByVal dFechas As Date) 
    On Error GoTo Err_BuscaUltimoDato 
    If MiRecordset5.state <> 0 Then 
        MiRecordset5.Close 
    End If 
    MiRecordset5.Open "SELECT Posi_Vehi_id, Posi_fecha " & _ 
            "From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = fechaC)
ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic 
        If MiRecordset5.BOF And MiRecordset5.EOF Then 
            MsgBox "puedo guardar no encontre dato" 
        Else 
        MiRecordset5.MoveLast 
            If MiRecordset5.EOF = False Then 
                MsgBox "encontre mismo datos" 
                Exit Sub 
            Else 
                MsgBox "puedo guardar no encontre dato" 
                Call ActPosiciones 
            End If 
        End If 
Exit_BuscaUltimoDato: 
               Exit Sub 
Err_BuscaUltimoDato: 
        If Err.Number <> 0 Then 
            MsgBox "Error No. " & Err.Number & " - " & Err.Description & " Originado por: " & Err.Source 
        End If 
        Resume Err_BuscaUltimoDato 
End Sub
Creo que con esto que me distes vamos a llegar a la solución me salio otro error en la fecha, te paso el código
Public Sub BuscaUltimoDato(ByVal dFechas As Date) 
    On Error GoTo Err_BuscaUltimoDato 
    If MiRecordset5.state <> 0 Then 
        MiRecordset5.Close 
    End If 
    MiRecordset5.Open "SELECT Posi_Vehi_id, Posi_fecha " & _ 
            "From Posiciones WHERE (Posi_Vehi_id =" & Movil & ") AND (Posi_fecha = dfechas) ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic 
        If MiRecordset5.BOF And MiRecordset5.EOF Then 
            MsgBox "puedo guardar no encontre dato" 
        Else 
        MiRecordset5.MoveLast 
            If MiRecordset5.EOF = False Then 
                MsgBox "encontre mismo datos" 
                Exit Sub 
            Else 
                MsgBox "puedo guardar no encontre dato" 
                Call ActPosiciones 
            End If 
        End If 
Exit_BuscaUltimoDato: 
               Exit Sub 
Err_BuscaUltimoDato: 
        If Err.Number <> 0 Then 
            MsgBox "Error No. " & Err.Number & " - " & Err.Description & " Originado por: " & Err.Source 
        End If 
        Resume Err_BuscaUltimoDato 
End Sub
Ahora el error cambio otra vez es:
En el nombre de columna dfechas no es válido originado por microsoft ole db provider for sql server
gracias por tu tiempo esto me esta dando dolor de cabeza pero estoy cerca con tu ayuda
Intenta con esto
Public Sub BuscaUltimoDato(ByVal dFechas As Date)   
    On Error GoTo Err_BuscaUltimoDato   
    If MiRecordset5.state <> 0 Then   
        MiRecordset5.Close   
    End If   
    MiRecordset5.Open "SELECT Posi_Vehi_id, Posi_fecha " & _   
            "From Posiciones WHERE (Posi_Vehi_id ='" & Movil & "') AND (Posi_fecha = '" &  dfechas & "') ORDER BY Posi_fecha", MiConexion, adOpenDynamic, adLockOptimistic  
 
        If MiRecordset5.BOF And MiRecordset5.EOF Then   
            MsgBox "puedo guardar no encontre dato"   
        Else   
        MiRecordset5.MoveLast   
            If MiRecordset5.EOF = False Then   
                MsgBox "encontre mismo datos"   
                Exit Sub   
            Else   
                MsgBox "puedo guardar no encontre dato"   
                Call ActPosiciones   
            End If   
        End If   
Exit_BuscaUltimoDato:   
               Exit Sub   
Err_BuscaUltimoDato:   
        If Err.Number <> 0 Then   
            MsgBox "Error No. " & Err.Number & " - " & Err.Description & " Originado por: " & Err.Source   
        End If   
        Resume Err_BuscaUltimoDato   
End Sub
Sólo le agregué comilla sencilla a la línea donde abres el recordset
Hola sabes que puse tal cual me pasaste como he hecho hasta ahora y ahora me sale este error:
Sintaxis incorrecta cerca de '19' Originado por Ole db provider microsoft sql server
hay me mato la estoy viendo de nuevo no tengo palabras para agradecer que me ayudes ya que nadie ha podido hasta ahora y con esto me estas ayudando a ver los errores notable
La verdad estoy feliz porque estoy debugeando y por finnnnnnnnnnnnnn esta controlando la fecha del ultimo registro, esta funcionando no me esta repitiendo, voy a seguir porbando pero por ahora esta funcionando, no tengo palabras de agradecimiento y espero puedas ayudarme cuando este trancado como ahora, la verdad todos han dado opiniones pero tu le diste a la tecla notable te felicito y de corazón gracias y perdona las molestias por ahora ja porque capaz necesitare más adelante pero el control de errores esta excelente y esta funcionando.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas