Error Accesando a Base de Datos mediante Listview

Iniciado por kicking people, 17 Junio 2006, 20:09 PM

0 Miembros y 1 Visitante están viendo este tema.

kicking people

Hola, tengo una inquietud al tratar de modificar un archivo para acceder a una base de datos. Yo había creado una agenda con el manual de la revista de HxC (Revista Número 10) en el cual tenía los teléfonos  que necesitaba, y a este programa le había agregado la opción de buscar en la base de datos una entrada.

Dejo parte del código del programa, solo lo más importante (si a alguien le interesa todo el código, postear que lo pongo entonces) :


Option Explicit
Dim Conn As ADODB.Connection
Dim RsRecordSet As ADODB.Recordset
Dim Opcion As String

Private Sub cmdBuscar_Click()
    Dim tItem As ListItem
    Dim lvwFind As ListFindItemHowConstants
    Dim lvwWhere As ListFindItemWhereConstants
    Dim i As Long
    Dim s As String
        lvwFind = lvwPartial
    Set tItem = List.FindItem(Text1, lvwWhere, 1, lvwFind)
    If Not tItem Is Nothing Then

        ListView1.SelectedItem.Selected = False
        For i = 1 To List.ListItems.Count
            If List.ListItems(i).Selected Then
                List.ListItems(i).Selected = True
            End If
        Next
        tItem.Selected = True
        Text1 = tItem.Text
        s = ""
        For i = 2 To List.ColumnHeaders.Count
            s = s & tItem.SubItems(i - 1) & vbCrLf
        Next
        Text4 = s
        tItem.EnsureVisible
            Else
        Text4 = "No se ha hallado el elemento buscado"
    End If
    Call Pintar
End Sub

Private Sub Form_Load()
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\bd.mdb;Persist Security Info=False"
Set RsRecordSet = New ADODB.Recordset
RsRecordSet.Open "Telefonos", Conn, adOpenDynamic, adLockOptimistic
Call LlenarList
End Sub

Sub LlenarList()
Dim Nodo As ListItem
List.ListItems.Clear
RsRecordSet.Requery
RsRecordSet.MoveFirst
While Not RsRecordSet.EOF
Set Nodo = List.ListItems.Add(, , RsRecordSet("Id"))
Nodo.SubItems(1) = RsRecordSet("Nombre")
Nodo.SubItems(2) = RsRecordSet("Telefono")
Nodo.SubItems(3) = RsRecordSet("Direccion")
RsRecordSet.MoveNext
Wend
List.Refresh
End Sub

Sub Pintar()
Dim Nodo2 As ListItem
Set Nodo2 = List.SelectedItem
RsRecordSet.MoveFirst
RsRecordSet.Find "Id=" & Nodo2
If Not RsRecordSet.EOF Then
TxtId.Text = RsRecordSet("Id")
TxtNombre.Text = RsRecordSet("Nombre")
TxtTelefono.Text = RsRecordSet("Telefono")
TxtDireccion.Text = RsRecordSet("Direccion")
End If
End Sub

Private Sub List_Click()
Call Pintar
End Sub

Private Sub Limpiar()
TxtId = ""
TxtNombre = ""
TxtTelefono = ""
TxtDireccion = ""
End Sub

Private Sub Salir2_Click()
Call Salir_Click
End Sub


Y El Form es este:


Ahora lo que estaba haciendo era tratar de modificar esa base de datos para que en vez de abrir una agenda telefónica, y ahora como ejercicio me propuse que pueda abrir una base de datos de un programa (Cibercontrol), lo poco que cambiaría es que en vez de abrir la tabla "Teléfonos" abra la tabla "Cuentas" (sería la que yo necesito de esa base de datos), entonces reemplace en el Form_Load:
RsRecordSet.Open "Telefonos", Conn, adOpenDynamic, adLockOptimistic

lo reemplace por esto:
RsRecordSet.Open "Cuentas", Conn, adOpenDynamic, adLockOptimistic


Después hice algunos cambios para que en vez de que me muestre en la base de datos los campos: Id, Nombre, Teléfono, Dirección; solo me muestre los campos: "Login", "Pass", "Bonotiempo".

Entonces reemplace esto:
Sub LlenarList()
Dim Nodo As ListItem
List.ListItems.Clear
RsRecordSet.Requery
RsRecordSet.MoveFirst
While Not RsRecordSet.EOF
Set Nodo = List.ListItems.Add(, , RsRecordSet("Id"))
Nodo.SubItems(1) = RsRecordSet("Nombre")
Nodo.SubItems(2) = RsRecordSet("Telefono")
Nodo.SubItems(3) = RsRecordSet("Direccion")
RsRecordSet.MoveNext
Wend
List.Refresh
End Sub


Por esto:


Sub LlenarList()
On Error Resume Next
Dim Nodo As ListItem
List.ListItems.Clear
RsRecordSet.Requery
RsRecordSet.MoveFirst
While Not RsRecordSet.EOF
Set Nodo = List.ListItems.Add(, , RsRecordSet("Login"))
Nodo.SubItems(1) = RsRecordSet("Pass")
Nodo.SubItems(2) = RsRecordSet("Bonotiempo")
RsRecordSet.MoveNext
Wend
List.Refresh
End Sub


La función On Error Resume Next, la puse porque en algunas bases de datos algunos de esos campos están vacios y me dan error.

Al hacer esos cambios cuando ejecuto el programa, se carga todo correctamente, con los login los pass y el bonotiempo, pero cuando hago click en un casillero del listview me devuelve este error:

Error 3001 en tiempo de ejecución:
Argumentos incorrectos fuera del intervalo permitido o en conflicto con otros.

Y me señala esta parte del código:
RsRecordSet.Find "Login=" & Nodo2

No encuentro el error y ya llevo un tiempo tratando de solucionarlo pero nada.
Quisiera saber si me pueden echar una mano de como solucionarlo. Gracias de antemano

Gangrel

No pues esta dificil, y el proyecto es grande, ya estuve un rato buscando asimple vista si encontraba el error y no doy con el y la verdad no creo que alguien lo adivine, si no puedes dar con el y quieres que te allude; zipea todo el proyectol, subelo a un server y pones el link y entonces si que es mas facil alludarte.
La educacion no es un privilegio, es un derecho.

http://www.usuarios.lycos.es/protg

kicking people

Cita de: Gangrel en 17 Junio 2006, 22:46 PM
No pues esta dificil, y el proyecto es grande, ya estuve un rato buscando asimple vista si encontraba el error y no doy con el y la verdad no creo que alguien lo adivine, si no puedes dar con el y quieres que te allude; zipea todo el proyectol, subelo a un server y pones el link y entonces si que es mas facil alludarte.

Muchas gracias. Estoy preparando todo en unos segunditos lo subo


karmany

Creo que el error lo tienes en cómo haces el RsRecordSet.Find

Prueba de esta forma:
RsRecordSet.Find ("Login ='" & Nodo2 & "'")

De todos modos te da errores cuando tienes registros vacíos, intenta cuando pongas un nuevo usuario o lo que sea que el registro vacío te lo ponga en 0 por ej.
Es un consejo porque cuando luego tengas por ej. 800 usuarios te va a ser más difícil poner todo a cero..
Espero te funcione bien.

kicking people

Cita de: karmany en 18 Junio 2006, 10:51 AM
Creo que el error lo tienes en cómo haces el RsRecordSet.Find

Prueba de esta forma:
RsRecordSet.Find ("Login ='" & Nodo2 & "'")

De todos modos te da errores cuando tienes registros vacíos, intenta cuando pongas un nuevo usuario o lo que sea que el registro vacío te lo ponga en 0 por ej.
Es un consejo porque cuando luego tengas por ej. 800 usuarios te va a ser más difícil poner todo a cero..
Espero te funcione bien.

Impecable... funciona perfecto.. Voy a fijarme lo de los usuarios vacios... Muchas gracias Gangrel y karmany por su ayuda!!