Ayuda para recorrer registros access desde visual

Estoy creando un aplicación y tengo dificultades para hacer lo siguiente:
Tengo un formulario donde dígito el numero de identifiacion de una persona y al dar click en un botón, se me carga la información de esta... El problema es si tengo varios registros dela misma persona,, no puedo ver si no solo el primero,,, y m gustaría que digitando el numero de una persona,, pueda seguir recorriendo los registros que coinciden con el numero digitado...
Tengo el siguiente código que es el que me busca los datos,, y le puse los botones primero, anterior, siguiente, ultimo,,, pero cuando doy click pasa a otros registros que no coiniciden con el numero digitado... El problema es que tengo como 10000 registros y pues se me haría difícil tener que recorrerlos todos uno a uno.. Entoncences la forma que me sirve es escribir en un texbox el numero de identificación el cual quiero recorrer,, este es un ejemplo de lo que quiero hacer para ver si se puede hacer algo.. Y pues de funcionar me serviría como guía para aplicarlo al formulario real..
Option Explicit
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'Funcion para buscar por medio del numero de identifiacion los registros
'del usuario
Sub Busca(ByVal Usuario As String)
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strConexion As String
Dim txtSQl As String
strConexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb;Persist Security Info=False"
cn.Open strConexion
txtSQl = "select * from personas where Identificacion  =  '" & Usuario & "'"
rs.Open txtSQl, cn
If rs.EOF Then
MsgBox "Este usuario no se encuentra "
'en este texbox digito el numero que quiero buscar
Text4.SetFocus
Text4.Text = ""
Else
'Carga las coincidencias para el numero digitado
Me.Text1 = rs!id
Me.Text5 = rs!Identificacion
Me.Text2 = rs!Nombre
Me.Text3 = rs!Apellido
End If
rs.Close
cn.Close
End Sub
'Cuando doy click ejecuta la funcion Busca y llena los datos correspondiente
'al numero de identifiacion
Private Sub Buscar_Click()
Busca Me.Text4.Text
End Sub
'Para ver el siguiente registro
Private Sub Siguiente_Click()
rs.MoveNext
If rs.EOF Then
rs.MoveLast
MsgBox " Se está en el ultimo registro  ", vbInformation
Else
Call Visualizar_Datos
End If
End Sub
Private Sub Form_Load()
' establece la cadena de conexión a utilizar en la propiedad ConnectionString
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                           App.Path & "\db1.mdb" & ";Persist Security Info=False"
cnn.Open
rs.Open "Select * from personas", cnn, adOpenDynamic, adLockOptimistic
End Sub
'Para ir al primer registro
Private Sub Primero_Click()
rs.MoveFirst
Call Visualizar_Datos
End Sub
'Para ir al ultimo registro
Private Sub Ultimo_Click()
rs.MoveLast
Call Visualizar_Datos
End Sub
'Me muestra el registro anterior
Private Sub Anterior_Click()
rs.MovePrevious
If rs.BOF Then
rs.MoveFirst
MsgBox " este es el Primer registro ", vbInformation, " Primer registro"
Else
Call Visualizar_Datos
End If
End Sub
'Sub que carga los datos del recordset y los asigna a los textbox
Private Sub Visualizar_Datos()
Text1.Text = CLng(rs("Id"))
Text5.Text = rs("Identificacion")
Text2.Text = rs("Nombre")
Text3.Text = rs("Apellido")
End Sub
Agradezco la colaboración, ya que estoy terminado una aplicación y esto me tiene varado.. Si necesita el archivo también lo puedo enviar,,, o si me pueden enviar un ejemplo a la siguiente dirección [email protected]

1 Respuesta

Respuesta
1
Luego de analizar tu código me he percatado que a "Rs" lo declaras dos veces, quizá valla por ahí tu problema.
Sugiero que conserves la declaración que haces en la parte de "(declaraciones)" de la ventana pero cambiale de ámbito a public (para que pueda ser suado en todo el proyecto) y quites el que tienes en tu evento "Buscar".
Recién me percato también haces lo mismo con tu variable de conexión, has el mismo procedimiento que sugerí para el recordset.
Luego el Rs lo abres en el open de la ventana, pero le haces select a toda la tabla. No se si sea necesaria tener abierta tu recordset, lo usaras para buscar solo lo que ingresen en tu textbox o sin necesidad de que ingresen algún dato en el (abrir toda la tabla), define eso.
Luego en tu evento buscar abres nuevamente el recordset pero no comtemplas si en caso ya esta abierta.
Antes de esta linea:
txtSQl = "select * from personas where Identificacion  =  '" & Usuario & "'"
Agrega lo siguiente:
if Rs.State = 1 then Set Rs = Nothing 'Cerrara el rs si en caso sta abierto.
Prueba los cambios que sugiero y avisas.
Gracias amigo, ya escribí las sugerencias y funciona perfecto,,, pero la parte más importante es poder recorrer los diferentes registros que tengo... teniendo como criterio el numero de identifiacion que digite en un textbox,,, poder navegar por los diferentes registros de un mismo usuario botnes primero, anterior, siguiente, ultimo,,, agradezco la colaboración..
Pues esa tarea esta linea:
txtSQl = "select * from personas where Identificacion  =  '" & Usuario & "'"
Rs. Open txtSQl ...
Weno si tu abres el recordset usando el parametro que especifica el usuario en el textbox, lo que tendras en tu recordset seran solo registros que correspondan al "numero de identificacion del usuario" como lo llamas tu.
Mejor dicho lo que hace tu evento buscar. Y por ende podrás navegar con el mismo código que usas en NUEVO, ANTERIOR, PRIMERO, ULTIMO.
Por eso sugerí que lo pruebes, ya debería funcionar, tal como lo describes. En todo caso avisa pa darle una revisada y ver que esta faltando. De lo conbtrario finaliza la pregunta y evalúa mi ayuda.
Gracias por la colbaroracion ya hice los pasos que dices, y me funciona filtra y puedo recorrer los registros el problema es que cuando doy click en el botón anterior me da un error que dice "La operación no esta permitida en este contexto".
Cuando doy click en el botón siguiente y llego al ultimo registro me aparece un error que dice "El conjunto de filas no admite recuperación hacia atrás".
Cuando doy click en ultimo registros me aparece el mensaje anterior "El conjunto de filas no admite recuperación hacia atrás"
Cuando doy click en el botón PRIMERO pero debería aparecerme un mensaje que me diga que estoy en el primer registro... así también doy click en el botón ultimo,, o voy dando click en el botón siguiente y llegue al ultimo registro debería aparecerme un mensaje que me diga que estoy en el ultimo registro..
Anexo el código para que veas como lo llevo.. agradezco el tiempo y la colaboración prestada.
Option Explicit
Public cnn As New ADODB.Connection
Public rs As New ADODB.Recordset
'Funcion para buscar por medio del numero de identifiacion los registros
'del usuario
Sub Busca(ByVal Usuario As String)
Dim strConexion As String
Dim txtSQl As String
strConexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb;Persist Security Info=False"
cnn.Open strConexion
If rs.State = 1 Then Set rs = Nothing
txtSQl = "select * from personas where Identificacion  =  '" & Usuario & "'"
rs.Open txtSQl, cnn
If rs.EOF Then
MsgBox "Este usuario no se encuentra "
'en este texbox digito el numero que quiero buscar
Text4.SetFocus
Text4.Text = ""
Else
'Carga las coincidencias para el numero digitado
Me.Text1 = rs!id
Me.Text5 = rs!Identificacion
Me.Text2 = rs!Nombre
Me.Text3 = rs!Apellido
End If
'rs.Close
'cnn.Close
End Sub
'Cuando doy click ejecuta la funcion Busca y llena los datos correspondiente
'al numero de identifiacion
Private Sub Buscar_Click()
Busca Me.Text4.Text
End Sub
'Para ver el siguiente registro
Private Sub Siguiente_Click()
rs.MoveNext
If rs.EOF Then
rs.MoveLast
MsgBox " Se está en el ultimo registro  ", vbInformation
Else
Call Visualizar_Datos
End If
End Sub
'Para ir al primer registro
Private Sub Primero_Click()
rs.MoveFirst
Call Visualizar_Datos
End Sub
'Para ir al ultimo registro
Private Sub Ultimo_Click()
rs.MoveLast
Call Visualizar_Datos
End Sub
'Me muestra el registro anterior
Private Sub Anterior_Click()
rs.MovePrevious
If rs.BOF Then
rs.MoveFirst
MsgBox " este es el Primer registro ", vbInformation, " Primer registro"
Else
Call Visualizar_Datos
End If
End Sub
'Sub que carga los datos del recordset y los asigna a los textbox
Private Sub Visualizar_Datos()
Text1.Text = CLng(rs("Id"))
Text5.Text = rs("Identificacion")
Text2.Text = rs("Nombre")
Text3.Text = rs("Apellido")
End Sub
Agrega esto de repente influye en algo
Rs. Open txtSQl, cnn 'esta es tu linea actual
rs. Open txtSQl, cnn,, adOpenStatic, adLockOptimistic
luego... probe con este codigo y me funciona bien
Private Sub Primero_Click()
rs.MoveFirst
Call Visualizar_Datos
End Sub
Private Sub Anterior_Click()
If Not rs.BOF Then rs.MovePrevious
If rs.BOF Then
    MsgBox "Primer Registro", vbInformation + 0
    rs.MoveFirst
End If
Call Visualizar_Datos
End Sub
Private Sub Siguiente_Click()
If Not rs.EOF Then rs.MoveNext
If rs.EOF Then
    MsgBox "Ultimo Registro", vbInformation + 0
    rs.MoveLast
End If
Call Visualizar_Datos
End Sub
Private Sub Ultimo_Click()
rs.MoveLast
Call Visualizar_Datos
End Sub
Pruébalo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas