TreeView con base de datos (Visual Basic 6.0)
Que tal Taringueros, en este post explicare brevemente como usar un treeview con base de datos y extraer datos segun la Key almacenada al cargar, comencemos:
Nota: Obviaremos algunos pasos que los he explicado en post anteriores como por ejemplo agregar componentes o la muy conocida coneccion a la base de datos.
Utilizaremos un solo formulario, un control TreeView y un modulo para las conecciones
Paso 1: Crear una base de datos de prueba (en este caso utilizaremos access) con una tabla en este caso yo llamare
a mi base de datos "EJEMPLOS" y a mi tabla "TABUSUARIOS".
Paso 2: Abrir un nuevo proyecto de Visual Basic 6.0.
Paso 3: Agregar las referencias de ado para el proyecto, Menu Proyecto Referencias y en el cuadro de dialogo ubicar y seleccionar "Microsoft ActiveX Data Objects 2.0 Library" (en el caso de conecciones sencillas es el mas recomendable) y ubicar y seleccionar con un check y tambien "Microsoft ADO Ext. 2.8 for DLL and Security" para obtener lla cantidad de tablas en la base de datos.
Paso 4: Agregar los componentes no predeterminados nesesarios desde la biblioteca de componentes Menu Proyecto Componentes y en el cuadro de dialogo ubicar y seleccionar con un check " Microsoft Windows Common Controls 6.0 (SP6) " que es donde esta almacenado el TreeView y "Microsoft DataGrid Control 6.0 (OLEDB)" para utilizar la grilla.
Paso 5: Agregar un Nuevo Formulario aparte del que esta como predeterminado.
Nota: Los formularios se llamaran frmTreeView (el predeterminado) y frmMuestra que nos servira para mostrar los datos obtenidos en la consulta
Paso 6: Agegar un TreeView al frmTreeView y un imageList para las imagenes del comportamiento del TreeView.
Paso 7: Agregar un DataGrid en el formulario frmMuestra.
Paso 8: Agregar un Modulo .bas al proyecto.
Paso 9: Agregamos un Menu en frmTreeView (con el editor de menu) con el Nombre mnuDatos y un submenu con el nombre subVer, esto nos servira para el menu contextual que nos permitira consultar los datos del registro seleccionado.
Ahora el Codigo:
Este Codigo (en el modulo .bas) genera la coneccion a la base de datos mediante DSN del Sistema.
'Variables de Coneccion
Public cn As New Connection
Public rsTabla As New Recordset
'En este caso utilizaremos el "Sub Main" para ejecutar la coneccion y la muetra de los datos en el TreeView de un solo golpe
Sub Main()
Call Coneccion
Call AbrirTablaLectura(rsTabla, "TABUSUARIOS"; )
frmTreeView.Show
End Sub
'La coneccion
Public Sub Coneccion()
Set cn = New Connection
cn.CursorLocation = adUseClient
cn.Open "DSN=EJEMPLOS;database=EJEMPLOS", "", ""
End Sub
'Procedimiento que abre la tabla
Public Sub AbrirTabla(rs As Recordset, NomTabla As String)
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open NomTabla, cn, adOpenStatic, adLockReadOnly, adCmdTable
End Sub
Ahora el codigo en frmTreeView:
'Primero crearemos un procedimiento para cargar el TreeView:
Public Sub Obtener_Datos()
Dim n As Integer 'Variable para bucle for
Dim x As Integer 'Variable para bucle for
Dim Nodo As Node 'Variable para crear el nodo
Dim oCatalog As New ADOX.Catalog 'Variable para cargar el esquema de la base de datos
Dim Tablas As ADOX.Tables 'Variable para obtener las tablas en la base de datos
Set oCatalog.ActiveConnection = cn 'Cargamos el esquema de la base de datos
Set Tablas = oCatalog.Tables 'Pasamos el esquema de tablas a la variable
With TreeView1
.Nodes.Clear 'Limpiamos el control
For x = 6 To Tablas.Count - 1 'For que cargara las tablas
Set Nodo = .Nodes.Add(, tvwFirst, Tablas.Item(x).Name, Tablas.Item(x).Name, Me.ImageList1.ListImages("Usuario" ).Key) 'Aca se carga el Nodo de tipo tvwFirst que funcionara como raiz
Nodo.Expanded = True 'Expandimos el Nodo (Raiz)
Call AbrirTablaLectura(rsTabla, Tablas.Item(x).Name) 'Cargamos la tabla que hemos obtenido con el esquema de en la variable "Tablas"
If rsTabla.RecordCount > 0 Then 'Confirmamos si hay registros
For n = 0 To rsTabla.RecordCount - 1 'For para cargar los registros de la tabla
Set Nodo = TreeView1.Nodes.Add(Tablas.Item(x).Name, tvwChild, "NODE_" & rsTabla(0), rsTabla(0), Me.ImageList1.ListImages("normal" ).Key, Me.ImageList1.ListImages("seleccionada" ).Key) 'Cargamos Nodos de tipo tvwChild con cada registro de la tabla
rsTabla.MoveNext 'Siguiente registro
Next
Else 'En caso no hayan registros en la tabla
.Nodes.Clear
Set Nodo = .Nodes.Add(, tvwFirst, "nodo", "NO HAY DATOS EN LA TABLA", Me.ImageList1.ListImages("Usuario" ).Key) 'Un nodo tipo Raiz para hacer mencion a la tabla
End If
Next 'Pasamos a cargar la siguiente tabla
End With
'dejamos vacias las variables
Set oCatalog = Nothing
Set[/color] Tabla = Nothing
End Sub
'Este pequeño procedimiento en el TreeView nos almacena el nombre de la tabla que se muestra en el nodo tipo tvwFirst o raiz, nos servira para abrir la tabla con nuestro procedimiento AbrirTablaLectura
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
On Error Resume Next
xNomTabla = Node.Parent
End Sub
'Cargamos el procedimiento con la carga del Formulario
Private Sub Form_Load()
Call Obtener_Datos
End Sub
'Este codigo es en el menu para obtener los datos del registro seleccionado
'Esta parte puede resultar un poco confusa ya que utilizamos 2 recorset para abrir la misma tabla uno nos proveera del nombre de la primera columna que es con la que identificaremos el registro y el otro abrira la tabla segun el criterio ya obtenido al seleccionar el item en el TreeView
Private Sub subVer_Click()
Dim n As Integer
Dim rs As New Recordset
Dim rsMuestra As New Recordset
Dim xSQL As String
Call AbrirTablaLectura(rs, xNomTabla)
Set rsMuestra = New Recordset
xSQL = "SELECT * FROM " & xNomTabla & " WHERE " & rs.Fields(0).Properties.Item(1).Value & "='" & Mid(Me.TreeView1.SelectedItem.Key, 6, Len(Me.TreeView1.SelectedItem.Key)) & "'" 'En la sentencia sql abrimos la tabla almacenada en xNomTabla pidiendo como criterio el dato seleccionado en TreeView (extraido con la funcion MID) en el campo obtenido con el recorset RS
With rsMuestra
.Open xSQL, cn, adOpenKeyset, adLockOptimistic
End With
With rsMuestra
If .RecordCount <> 0 Then
Set frmMuestra.DataGrid1.DataSource = rsMuestra 'Pasamos el recordset al DataGrid en el frmMuestra
frmMuestra.Show vbModal 'Y mostramos en Modal
End If
End With
End Sub
'Esto nos mostrara el menu Contextual haciendo click derecho sobre el TreeView
Private Sub TreeView1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = 2 Then
PopupMenu mnuDatos
End If
End Sub
En mi opinion el Control TreeView es muy tedioso en el momento de la programacion pero muy util cuando queremos hacer este tipo de consultas a varias vistas. Suerte y Gracias