Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Treeview error 35610

Estas en el tema de Treeview error 35610 en el foro de Visual Basic clásico en Foros del Web. Amigos, intento cargar un arbol con marcas de autos y sus respectivos modelos, pero me sale "El objeto no es válido" en la linea en ...
  #1 (permalink)  
Antiguo 02/07/2008, 12:31
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Pregunta Treeview error 35610

Amigos, intento cargar un arbol con marcas de autos y sus respectivos modelos, pero me sale "El objeto no es válido" en la linea en rojo.
Código:
tvw_marca.Nodes.Clear
Marca = ""
While Not rtmp.EOF
    If Marca <> rtmp("MARCA") Then
        tvw_marca.Nodes.Add , , rtmp("MARCA"), rtmp("MARCA")
    End If
    Do
        tvw_marca.Nodes.Add rtmp("MARCA"), tvwChild, rtmp("MODELO"), rtmp("MODELO")
        Marca = rtmp("MARCA")
        rtmp.MoveNext
        If rtmp.EOF Then Exit Do
    Loop While Marca = rtmp("MARCA")
Wend
A que se debe esto?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #2 (permalink)  
Antiguo 02/07/2008, 12:47
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Pregunta Respuesta: Treeview error 35610

¿Dónde está definido rtmp?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 02/07/2008, 13:34
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Treeview error 35610

Código:
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp_get_marcas_modelos"
Set rtmp = cmd.Execute
No te preocupes que datos hay.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #4 (permalink)  
Antiguo 02/07/2008, 16:11
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Treeview error 35610

Hola!

Todo parece correcto, pero ¿puede ser que haya una marca sin modelos en la base de datos? Tal y como has definido el algoritmo, es estrictamente necesario que cada marca contenga al menos un modelo. ¿Puede ser que hayas hecho un OUTER JOIN en el procedimiento almacenado?

Un método rápido (y peligroso) si tienes poquitos datos (¡pero poquitos!), es poner un On Error Resume Next, dejar que termine esa función y ver qué ha insertado en el treeview. Recuerda quitar el On Error etc al terminar las pruebas, que luego puede ser un lío.

De todas formas, yo te recomendaría que llenases el treeview en dos pasos: uno leyendo sólo las marcas (usa la claúsula DISTINCT o UNIQUE en SQL) y después otro leyendo las marcas y los modelos. De esta manera, aunque requiera más código, es más rápido, ya que hace menos comprobaciones y menos propenso a errores, ya que todos los nodos padre existen antes de crear los hijos.
  #5 (permalink)  
Antiguo 02/07/2008, 16:33
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Treeview error 35610

Gracias por responder. Como dije, no es problema de datos. Una condicion basica en el SP es que todas las marcas tengan un modelo.
A mi me parece muy extraño este error, ya que lo hice basandome en este codigo.
Ademas, he probado hasta lo mas simple, que es poner algo asi:
tvw_marca.Nodes.Add rtmp("MARCA"), tvwChild, "modelo "&cint(k), "Modelo "&cint(k)
Sin embargo, sigue saliendo el mismo error.
Espero que alguien pueda ayudarme.
Por si acaso uso VB6.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #6 (permalink)  
Antiguo 02/07/2008, 16:49
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Treeview error 35610

Mmmmm... raro, raro...

¿Puede haber alguna marca que sólo contenga números? Las claves del treeview deben ser de texto, ya que de lo contrario se interpretan como índices, que lo normal es que se salgan del rango.

Prueba lo del on error y cuéntanos a ver si inserta algún nodo o ninguno.

Por otra parte, si pones la siguiente línea justo antes de tvw_marca.Nodes.Add (sin usar el on error):
Código:
Debug.Print "Marca: """ & rtmp("MARCA") & """, Modelo: """ & rtmp("MODELO") & """"
podrás ver en la vista inmediata qué datos se van a agregar al siguiente nodo cuando se produce el error, y los que se han agregado hasta ese momento.

Creo que sí hay que revisar primero la consistencia de los datos y el orden en que se añaden al treeview, ya que sintácticamente parece todo correcto y no debería fallar en tiempo de ejecución.
  #7 (permalink)  
Antiguo 03/07/2008, 10:27
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Treeview error 35610

Claro que puede haber, por ejemplo, Peugeot 306. Pero este no es el caso, porque en el primer registro da el error, donde, logicamente, el modelo es un texto.
Voy a probar lo que me recomiendas.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #8 (permalink)  
Antiguo 04/07/2008, 11:52
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Treeview error 35610

Solucionado!
Al parecer VB6 no acepta la asignacion de la 'llave padre' desde un recordset cuando se añade un 'nodo hijo'.
De esta manera funciona mi codigo:
Código:
tvw_marca.Nodes.Clear
rtmp.MoveFirst
While Not rtmp.EOF
    tvw_marca.Nodes.Add , , rtmp("MARCA"), rtmp("MARCA")
    ID_Marca = rtmp("MARCA")
    Do
        tvw_marca.Nodes.Add ID_Marca, tvwChild, rtmp("MODELO"), rtmp("MODELO")
        Marca = rtmp("MARCA")
        rtmp.MoveNext
        If rtmp.EOF Then Exit Do
    Loop While Marca = rtmp("MARCA")
Wend

rtmp.Close
Set rtmp = Nothing
Gracias Txoco por tu ayuda!
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:47.