Foros del Web » Programación para mayores de 30 ;) » .NET »

Rellenar campos a partir de consulta SQL después de seleccionar en listbox

Estas en el tema de Rellenar campos a partir de consulta SQL después de seleccionar en listbox en el foro de .NET en Foros del Web. Buenas! Estoy haciendo una aplicación en VB .net con visual studio 2005 (framework 2.0, si no me equivoco jeje) y SQLite (funciona muy parecido a ...
  #1 (permalink)  
Antiguo 07/02/2010, 16:36
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Rellenar campos a partir de consulta SQL después de seleccionar en listbox

Buenas!

Estoy haciendo una aplicación en VB .net con visual studio 2005 (framework 2.0, si no me equivoco jeje) y SQLite (funciona muy parecido a SQLServer u otros, así que una respuesta con un ejemplo con estas bases de datos también me valdría para pillar la idea... o eso creo XD)

Bueno, el caso es que en dicha aplicación tengo los siguientes elementos:

textbox1
boton
listbox
Una serie de textboxes

Bueno, lo que quiero hacer es que al ingresar un texto en el textbox1 y darle a buscar me muestre los resultados en un listbox y luego en el listbox seleccionar el registro concreto sobre el que quiero mostrar datos

La una busqueda es a una base de datos con una tabla "clientes" compuesta por varias columnas (nombre, apellido1, apellido2, telefono, etc)).

El caso es que consigo mostrar los resultados en el listbox pero lo que no se como hacer es que al seleccionar el registro concreto se me rellenen los textboxes con los datos de esa persona.

Para que nos entendamos un ejemplo sería:

Escribo "Juan" en el textbox1, le doy al botón buscar (me falta ponr la busqueda a partir del textbox1)

El programa me muestra los resultados en el listbox. Un detalle es que en el listbox imprimo nombre+apellido1+apellido2. Esto lo tengo hecho ya:


Código vb:
Ver original
  1. Private Sub btnInicioBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInicioBuscar.Click
  2.         'Creamos la conexión a la base de datos definida como datasource en Settings
  3.        Dim oConexion As New SQLite.SQLiteConnection(My.Settings.Default.origConnectionString)
  4.  
  5.         'Consulta a la base de datos
  6.        Dim oComando As New SQLite.SQLiteCommand("SELECT id,nombre,apellido1,apellido2 FROM clientes ORDER BY nombre", oConexion)
  7.  
  8.         'Creamos el DataReader
  9.        Dim oDataReader As SQLite.SQLiteDataReader
  10.         'Abrimos la conexión
  11.        oConexion.Open()
  12.         'Llenamos el datareader
  13.        oDataReader = oComando.ExecuteReader() 'obtiene un objeto datareader
  14.  
  15.         'Vaciamos el Listbox antes de llenarlo
  16.        lbInicioClientes.Items.Clear()
  17.         'Recorremos las filas del DataReader y agregamos al ListBox
  18.        While oDataReader.Read
  19.             'Agregamos nombres y apellidos al ListBox
  20.            lbInicioClientes.Items.Add(oDataReader("nombre") & " " & oDataReader("apellido1") & " " & oDataReader("apellido2"))
  21.         End While
  22.         'Cerramos el DataReader
  23.        oDataReader.Close()
  24.         'Cerramos la conexión a la base de datos
  25.        oConexion.Close()
  26.     End Sub

Entonces supongamos que en el listbox me devuelve:

Juan Sanchez Martinez
Juan Lopez Díaz

Mi pregunta es: como hago para que al pulsar en uno de esos campos me rellene los textboxes con los datos de esa persona? (creo que sería con el evento click del listbox, pero no se como apuntar en concreto al campo seleccionado y como quedarme con los datos para luego hacer la consulta que me rellene los texboxes...)

Y otra cosa... como hago para buscar por nombre y apellido al darle a buscar?

Saludos y gracias desde ya!

Última edición por AlterElt; 07/02/2010 a las 17:29
  #2 (permalink)  
Antiguo 07/02/2010, 20:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

¿Cómo lo haría yo?
1) Primero recuperaría una tabla con la PK y los campos de nombre y apellido que necesito.
2) Luego usaría la tabla para llenar un listbox.
3) Al seleccionar un objeto en el ListBox me devuelve el índice del objeto seleccionado, y ese índice correspondería a la misma línea de la tabla de donde se sacó, entonces con ese índice recuperaría la PK que le corresponde.
4) Con esa PK solicitaría a la base todos los detalles para cargar.

Alternativa: Si la tabla de datos personales es relativamente corta, se puede hacer que recupere todos los datos en la tabla original, y simplemente llenarlos con ella, sin necesidad de volver a consultar a base.
Menos consultas a la base = Mejor performance.

Lo que sí no usaría es el nombre y apellido en una búsqueda, porque no son claves candidatas muy prácticas. Es preferible acudir a las PK en estos caso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 08/02/2010, 15:20
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

Gracias por la respuesta, la verdad que me estoy volviendo loco xD

Entiendo que lo correcto sería pedir a la base de datos la tabla clientes entera y luego meter en el listbox solo nombre, apellido1 y apellido2, no? Tienes razón de al decir que me será más práctico traerme toda la tabla clientes para no hacer dos consultas, pero ¿me recomiendas traerme también una segunda tabla llamada datoscliente (con un join), que contiene datos de medidas y tal que pretendo mostrar en otro listbox con columnas? o es preferible hacer una segunda consulta?

Por ahora tengo esto:

Código vb:
Ver original
  1. Private Sub btnInicioBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInicioBuscar.Click
  2.         'Creamos la conexión a la base de datos definida como datasource en Settings
  3.        Dim oConexion As New SQLite.SQLiteConnection(My.Settings.Default.origConnectionString)
  4.  
  5.         'Consulta a la base de datos
  6.        Dim oComando As New SQLite.SQLiteCommand("SELECT * FROM clientes WHERE nombre LIKE '%" & tbInicioBuscar.Text & "%' OR apellido1 LIKE '%" & tbInicioBuscar.Text & "%' OR apellido2 LIKE '%" & tbInicioBuscar.Text & "%' ORDER BY nombre", oConexion)
  7.  
  8.         'Creamos el DataReader
  9.        Dim oDataReader As SQLite.SQLiteDataReader
  10.         'Abrimos la conexión
  11.        oConexion.Open()
  12.         'Llenamos el datareader
  13.        oDataReader = oComando.ExecuteReader() 'obtiene un objeto datareader
  14.  
  15.         'Vaciamos el Listbox antes de llenarlo
  16.        lbInicioClientes.Items.Clear()
  17.         'Recorremos las filas del DataReader y agregamos al ListBox
  18.        While oDataReader.Read
  19.             'Agregamos nombres y apellidos al ListBox
  20.            'IF oDataReader.
  21.            lbInicioClientes.Items.Add(oDataReader("nombre") & " " & oDataReader("apellido1") & " " & oDataReader("apellido2"))
  22.             'selectFirst = True
  23.        End While
  24.         'Cerramos el DataReader
  25.        oDataReader.Close()
  26.         'Cerramos la conexión a la base de datos
  27.        oConexion.Close()
  28.     End Sub

lbInicioClientes: es el ListBox donde pongo lo que quiero buscar.
tbInicioBuscar: es el TextBox donde escribo lo que quiero buscar.
btnInicioBuscar: es el Botón que pulso para empezar a buscar.

Que en principio, con la consulta tal y como la he cambiado ya me busca como quería lo del textbox, es decir, introduciendo nombre o apellidos (te busca en las tres columnas), hasta ahí bien.

Solo una cuestión más de esto:

Como se hace para que al introducir texto en un textbox y pulsar enter me haga lo mismo que al hacer click en el boton? Es decir, que escribas y le des a enter y ya busque... es una tonteria, pero aporta usabilidad xD

Ahora solo me queda la duda de como pasar lo del datareader a una tabla para luego pasarlo a los respectivos textboxes y como saber que linea del textbox esta seleccionada (no hay algún tipo de índice o algo así? he visto la propiedad .Selecteditem y Selectedindex, pero no se como funcionan....)

Respecto a lo de pasar el datareader a una tabla..... exactamente que significa que "oDataReader" sea del tipo "SQLite.SQLiteDataReader"? Si que veo que se trae cada vez una fila (dentro del bucle while), pero como puedo copiar eso a una tabla?

¿Se pueden usar dos fors al estilo C usando indices? tabla[10][10]

Se que son muchas dudas, pero estoy bastante novato en VB :S

Saludos y gracias por la ayuda.

Última edición por AlterElt; 08/02/2010 a las 16:10
  #4 (permalink)  
Antiguo 08/02/2010, 15:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

Por lo que veo, estás trabajando con SQLite, por lo que lo mejor que puedes hacer es recurrir al manual de referencia: SQL como lo entiende SQLite
En el caso de la búsqueda de expresiones literales, en el WHERE el LIKE busca cualquier expresión que se indique, tomando el símbolo '%' como comodín:
Código SQL:
Ver original
  1. SELECT a, b, c, d,
  2. FROM tabla
  3. WHERE a LIKE '%expresion%';
Donde expresion es la cadena buscada.
Tienes que tener en cuenta que muy probablemente la consulta devuelva un conjunto de registros y no un único registro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 08/02/2010, 16:50
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

Buenas de nuevo!

Tras unos días dedicandome a otras secciones de mi programa vuelvo a esto... a ver he remplanteado la cosa como me has dicho gnzsoloyo. Es decir hago esto:

1) Primero recuperaría una tabla con la PK y los campos de nombre y apellido que necesito.
2) Luego usaría la tabla para llenar un listbox.
3) Al seleccionar un objeto en el ListBox me devuelve el índice del objeto seleccionado, y ese índice correspondería a la misma línea de la tabla de donde se sacó, entonces con ese índice recuperaría la PK que le corresponde.
4) Con esa PK solicitaría a la base todos los detalles para cargar.

Llego hasta el punto 3, es decir, relleno bien el listbox y tengo una tabla con todos los datos de la tabla CLIENTES. Código:

Código vb:
Ver original
  1. Private Sub btnInicioBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInicioBuscar.Click
  2.  
  3.         '************************************************************************************
  4.        '*   ESTADO: FUNCIONA                                                               *
  5.        '*   Objeto: btnInicioBuscar                                                        *
  6.        '*   Función: Busca la cadena de texto del textbox (tbInicioBuscar) en la base de   *
  7.        '*              datos y devuelve en el ListBox (lbInicioClientes) los resultados    *
  8.        '*                                                                                  *
  9.        '*   Versión: v1.0   07 Feb 2010   xxxxxxxxxxxxxxxxxxxxxxx ([email protected])     *
  10.        '*   Versión: v2.0   18 Feb 2010   xxxxxxxxxxxxxxxxxxxxxxx ([email protected])     *
  11.        '*                                                                                  *
  12.        '************************************************************************************
  13.  
  14.         ''Creamos la conexión a la base de datos definida como datasource en Settings
  15.        Dim conexion As New SQLite.SQLiteConnection(My.Settings.origConnectionString)
  16.         'Declaramos el DataTable que contendrá los datos.
  17.        Dim DataTable As New DataTable
  18.         'declaramos el DataAdapter y lo llenamos con la consulta
  19.        Dim DataAdapter As New SQLiteDataAdapter("SELECT * FROM CLIENTES WHERE nombre LIKE '%" & tbInicioBuscar.Text & "%' OR apellido1 LIKE '%" & tbInicioBuscar.Text & "%' OR apellido2 LIKE '%" & tbInicioBuscar.Text & "%' ORDER BY nombre", conexion)
  20.         'rellenamos el DataTable
  21.        DataAdapter.Fill(DataTable)
  22.  
  23.         'Vaciamos el Listbox antes de llenarlo
  24.        lbInicioClientes.Items.Clear()
  25.  
  26.         'Llenamos el listBox (lbInicioClientes)
  27.        Dim i As Integer
  28.         For i = 0 To DataTable.Rows.Count - 1
  29.             lbInicioClientes.Items.Add(DataTable.Rows(i).Item("nombre") & " " & DataTable.Rows(i).Item("apellido1") & " " & DataTable.Rows(i).Item("apellido2"))
  30.         Next
  31.  
  32.     End Sub

Como ves, creo un DataAdapter, lo copio todo a una tabla y relleno el listbox. Ahora quiero empezar a programar el evento "SelectedIndexChanged"

Código vb:
Ver original
  1. Private Sub lbInicioClientes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbInicioClientes.SelectedIndexChanged

La historia que tengo ahora, es que no se como ver la DataTable desde este evento. He probado poniendo en Public el evento del boton donde creo el DataTable y demás, pero sigo sin poder ver esa tabla.

Por otro lado como enlazo lo que es la tabla con el item seleccionado para hacer la consulta?

Mil gracias.

Última edición por AlterElt; 17/02/2010 a las 18:47
  #6 (permalink)  
Antiguo 17/02/2010, 18:50
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

Buenas de nuevo!

Tras unos días dedicandome a otras secciones de mi programa vuelvo a esto... a ver he remplanteado la cosa como me has dicho gnzsoloyo. Es decir hago esto:

1) Primero recuperaría una tabla con la PK y los campos de nombre y apellido que necesito.
2) Luego usaría la tabla para llenar un listbox.
3) Al seleccionar un objeto en el ListBox me devuelve el índice del objeto seleccionado, y ese índice correspondería a la misma línea de la tabla de donde se sacó, entonces con ese índice recuperaría la PK que le corresponde.
4) Con esa PK solicitaría a la base todos los detalles para cargar.

Llego hasta el punto 3, es decir, relleno bien el listbox y tengo una tabla con todos los datos de la tabla CLIENTES. Código:

Código vb:
Ver original
  1. Private Sub btnInicioBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInicioBuscar.Click
  2.  
  3.         '************************************************************************************
  4.        '*   ESTADO: FUNCIONA                                                               *
  5.        '*   Objeto: btnInicioBuscar                                                        *
  6.        '*   Función: Busca la cadena de texto del textbox (tbInicioBuscar) en la base de   *
  7.        '*              datos y devuelve en el ListBox (lbInicioClientes) los resultados    *
  8.        '*                                                                                  *
  9.        '*   Versión: v1.0   07 Feb 2010   xxxxxxxxxxxxxxxxxxxxxxx ([email protected])     *
  10.        '*   Versión: v2.0   18 Feb 2010   xxxxxxxxxxxxxxxxxxxxxxx ([email protected])     *
  11.        '*                                                                                  *
  12.        '************************************************************************************
  13.  
  14.         ''Creamos la conexión a la base de datos definida como datasource en Settings
  15.        Dim conexion As New SQLite.SQLiteConnection(My.Settings.origConnectionString)
  16.         'Declaramos el DataTable que contendrá los datos.
  17.        Dim DataTable As New DataTable
  18.         'declaramos el DataAdapter y lo llenamos con la consulta
  19.        Dim DataAdapter As New SQLiteDataAdapter("SELECT * FROM CLIENTES WHERE nombre LIKE '%" & tbInicioBuscar.Text & "%' OR apellido1 LIKE '%" & tbInicioBuscar.Text & "%' OR apellido2 LIKE '%" & tbInicioBuscar.Text & "%' ORDER BY nombre", conexion)
  20.         'rellenamos el DataTable
  21.        DataAdapter.Fill(DataTable)
  22.  
  23.         'Vaciamos el Listbox antes de llenarlo
  24.        lbInicioClientes.Items.Clear()
  25.  
  26.         'Llenamos el listBox (lbInicioClientes)
  27.        Dim i As Integer
  28.         For i = 0 To DataTable.Rows.Count - 1
  29.             lbInicioClientes.Items.Add(DataTable.Rows(i).Item("nombre") & " " & DataTable.Rows(i).Item("apellido1") & " " & DataTable.Rows(i).Item("apellido2"))
  30.         Next
  31.  
  32.     End Sub

Como ves, creo un DataAdapter, lo copio todo a una tabla y relleno el listbox. Ahora quiero empezar a programar el evento "SelectedIndexChanged"

Código vb:
Ver original
  1. Private Sub lbInicioClientes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbInicioClientes.SelectedIndexChanged

La historia que tengo ahora, es que no se como ver la DataTable desde este evento. He probado poniendo en Public el evento del boton donde creo el DataTable y demás, pero sigo sin poder ver esa tabla.

Por otro lado como enlazo lo que es la tabla con el item seleccionado para hacer la consulta?

Mil gracias.
  #7 (permalink)  
Antiguo 17/02/2010, 19:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

El tema es que en ese evento tienes que la propiedad lbInicioClientes.SelectedIndex te devuelve un entero que se corresponde al valor de x de DataTable.Rows(x).Item("id") (suponiendo que "id" sea el campo de la PK de esa tabla "CLIENTES".
Así pues, solamente deberías usar ese valor para acceder a la tabla, y con él cargar los TextBox o Label que estés usando:
Código vb.net:
Ver original
  1. Dim x as Integer = lbInicioClientes.SelectedIndex
  2. TextBox1.Text = Convert.ToString(DataTable.Rows(x).Item("id"))
  3. TextBox2.Text = Convert.ToString(DataTable.Rows(x).Item("nombre"))
  4. TextBox3.Text = Convert.ToString(DataTable.Rows(x).Item("apellido"))
  5. TextBox4.Text = Convert.ToString(DataTable.Rows(x).Item("direccion"))
  6. TextBox5.Text = Convert.ToString(DataTable.Rows(x).Item("telefono"))
  7. TextBox6.Text = Convert.ToString(DataTable.Rows(x).Item("ciudad"))
Cosa que puedes hacer en el mismo evento...
Como ya todos los datos de todos los clientes están cargados en la tabla, y el ComboBox se argó secuencialmente con los registros de ella, los subíndices coinciden (a menos que le hayas puesto ordenar a ese control), así que 0 de la tabla y 0 del CB, deben corresponderse...
Más o menos así es la idea.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 17/02/2010, 19:49
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

Ya veo por donde vas jeje

La historia es que si lo pongo en el evento click del botón, no se me actualiza cada vez que seleccione un nuevo index. (en este caso se muestra correctamente si le pongo yo manualmente un indice seleccionado. Me refiero a que muestra los datos del elemento seleccionado "manualmente" en los respectivos textboxes)

Código vb:
Ver original
  1. lbInicioClientes.SelectedIndex = 0

Si lo pongo en el evento click del listbox (que es donde creo debería ponerlo...) no puedo ver el DataTable :S

Yo creo que el problema quedaría más o menos solucionado de esta forma.

saludos y gracias

edito: una cosilla que me mosquea un poco y que me acabo de dar cuenta es, que cuando copio la tabla de la bdd al datatable la fecha me la convierte al formato DD/MM/YYYY HH:HH:HH, cuando yo en la base de datos solo tengo YYYY-MM-DD (HH:HH:HH se muestra como ceros) y en cualquier caso lo único que me interesaría mostrar sería DD/MM/YYYY. Bueno, luego iré a eso, de momento a ver si puedo ver el DataTable desde el evento Click del ListBox

Última edición por AlterElt; 17/02/2010 a las 19:55
  #9 (permalink)  
Antiguo 17/02/2010, 19:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

Cita:
Iniciado por AlterElt Ver Mensaje
Ya veo por donde vas jeje

La historia es que si lo pongo en el evento click del botón, no se me actualiza cada vez que seleccione un nuevo index. (en este caso se muestra correctamente si le pongo yo manualmente un indice seleccionado)

Código vb:
Ver original
  1. lbInicioClientes.SelectedIndex = 0

Si lo pongo en el evento click del listbox (que es donde creo debería ponerlo...) no puedo ver el DataTable :S

Yo creo que el problema quedaría más o menos solucionado de esta forma.

saludos y gracias
Perdón, si, me refería a ese evento...


No me fijé bien en el contenido de la sentencia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 17/02/2010, 19:57
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

gracias por la aclaración gnzsoloyo, pero como te digo desde el evento click del listBox no puedo ver el datatable y entonces pues me salta el error de que DataTable no está definido etc...

A ver si me puedes aclarar esto :P

Saludos

EDITO:

Bueno, ya está XD Al final he declarado la variable dentro del form en vez de en el evento, vaya fail xD (No se si hay otra forma de hacerlo que sea más correcta.... esto es como una variable global del form... bueno.. xD)

Ahora funciona como quiero jeje Bueno, me queda pendiente esto que dije antes:

Cita:
Una cosilla que me mosquea un poco y que me acabo de dar cuenta es, que cuando copio la tabla de la bdd al datatable la fecha me la convierte al formato DD/MM/YYYY HH:HH:HH (HH:HH:HH se muestra como ceros), cuando yo en la base de datos solo tengo YYYY-MM-DD y en cualquier caso lo único que me interesaría mostrar sería DD/MM/YYYY. Bueno, luego iré a eso, de momento a ver si puedo ver el DataTable desde el evento Click del ListBox
A ver como puedo solucionar esto, porque lo de las fecha antes me ha costado lo suyo meterlo en el formato correcto en la bdd xD

Última edición por AlterElt; 17/02/2010 a las 20:15
  #11 (permalink)  
Antiguo 17/02/2010, 20:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

En primer lugar, no uses nombres de clases para crear variables u objetos. DataTable es una clase que define una tabla de datos. No se debe usar para lo que figura en tu código.
Es lo que se denomina palabra reservada.

En segundo lugar, cuando vayas a usar un objeto en varios métodos de un form, debes usar objetos de clase y no de método. Si defines una variable dentro de un método, morirá cuando se termine de ejecutar el método (problema de la POO).
Para que puedas acceder en todo el Form, deben estar definidos fuera de cualquier método
En tu ejemplo:
Código vb.net:
Ver original
  1. Dim conexion As SQLite.SQLiteConnection
  2. Dim Table As DataTable
  3. Dim Adapter As SQLiteDataAdapter
  4.  
  5.     Private Sub btnInicioBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInicioBuscar.Click
  6.  
  7.         '************************************************************************************
  8.         '*   ESTADO: FUNCIONA                                                               *
  9.         '*   Objeto: btnInicioBuscar                                                        *
  10.         '*   Función: Busca la cadena de texto del textbox (tbInicioBuscar) en la base de   *
  11.         '*              datos y devuelve en el ListBox (lbInicioClientes) los resultados    *
  12.         '*                                                                                  *
  13.         '*   Versión: v1.0   07 Feb 2010   xxxxxxxxxxxxxxxxxxxxxxx ([email protected])     *
  14.         '*   Versión: v2.0   18 Feb 2010   xxxxxxxxxxxxxxxxxxxxxxx ([email protected])     *
  15.         '*                                                                                  *
  16.         '************************************************************************************
  17.  
  18.         ''Creamos la conexión a la base de datos definida como datasource en Settings
  19.         conexion = New SQLite.SQLiteConnection(My.Settings.origConnectionString)
  20.         'Declaramos el DataTable que contendrá los datos.
  21.         Table = New DataTable
  22.         'declaramos el DataAdapter y lo llenamos con la consulta
  23.         Adapter = New SQLiteDataAdapter("SELECT * FROM CLIENTES WHERE nombre LIKE '%" & tbInicioBuscar.Text & "%' OR apellido1 LIKE '%" & tbInicioBuscar.Text & "%' OR apellido2 LIKE '%" & tbInicioBuscar.Text & "%' ORDER BY nombre", conexion)
  24.         'rellenamos el DataTable
  25.         Adapter.Fill(Table)
  26.  
  27.         'Vaciamos el Listbox antes de llenarlo
  28.         lbInicioClientes.Items.Clear()
  29.  
  30.         'Llenamos el listBox (lbInicioClientes)
  31.         Dim i As Integer
  32.         For i = 0 To Table.Rows.Count - 1
  33.             lbInicioClientes.Items.Add(Table.Rows(i).Item("nombre") & " " & Table.Rows(i).Item("apellido1") & " " & Table.Rows(i).Item("apellido2"))
  34.         Next
  35.  
  36.     End Sub

Entonces será accesible por fuera.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 17/02/2010, 20:54
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

gracias, me quedó mucho más claro!

Respecto a lo otro:

Cita:
Una cosilla que me mosquea un poco y que me acabo de dar cuenta es, que cuando copio la tabla de la bdd al datatable la fecha me la convierte al formato DD/MM/YYYY HH:HH:HH (HH:HH:HH se muestra como ceros), cuando yo en la base de datos solo tengo YYYY-MM-DD y en cualquier caso lo único que me interesaría mostrar sería DD/MM/YYYY. Bueno, luego iré a eso, de momento a ver si puedo ver el DataTable desde el evento Click del ListBox
Podrías darme alguna indicación sobre como solucionar esto?

Saludos

Última edición por AlterElt; 17/02/2010 a las 21:10
  #13 (permalink)  
Antiguo 17/02/2010, 21:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Rellenar campos a partir de consulta SQL después de seleccionar en listbox

Ese es un problema que confunde mucho a los programadores, pero la cosa es simple:
A nivel de base de datos, siempre se almacenan en el formato YYYY-MM-DD HH:mm:ss, eso es indefectible, y se lo hace por cuestiones de simplicidad de ordenamiento: No importa como lo hagas, el orden siempre será perfecto cuando el año está al principio...
Lo que muchos no saben, es que en realidad ese formato es una interpretación que el DBMS hace del dato guardado como binario. Las fechas y las horas, en realidad se guardan como DOUBLE. Y es un Double con atributo de Date lo que el VB recibe y también interpreta como fecha. Pero en el VB, la representación está determinada por la regionalización de la PC y no por lo que la base supuestamente devuelve.
Estas conversiones son invisibles para el usuario, y además no interesan. Lo que tu tienes que hacer es recordar que estás recibiendo un Date o DateTime y actuar en consecuencia, así como recordar que le debes enviar un DATE (estándar de BBD) o DATETIME o TIME a la base.

El resto es irrelevante.

Ahora bien, lo que sí tienes que tener en cuenta es que debes administrar bien en tu programa la regionalización de la pc (administrada por el Namespace System.Globalization) para evitar problemas de formateo de fecha y de decimales.

Si quieres hacer un experimento para ver cómo es que las fechas son en realidad decimales haz esto:
Abre una hoja de Excel y en una celda cualquiera pon una fecha completa, con hora y todo. Una vez que lo hayas hecho, selecciona la celda y ponle el formato de celda Numero con varios decimales y ¡voilà! Tienes allí el decimal que en realidad representa la fecha...

Cosas escondidas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campos, listbox, partir, rellenar, seleccionar, sql
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:41.