Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Llenar un datagridview con datos de varias tablas

383 views
Skip to first unread message

jcp...@dpstudio.es

unread,
Jun 2, 2008, 7:57:06 AM6/2/08
to
Hola a todos!

Trabajo con una base de datos SQL.
Tengo dos tablas. Una contiene datos de la otra, haciendo referencia
al índice correspondiente. Osea dos tablas maestro-detalle, creo. Si
lleno un datagridview con una tabla, me aparecería en una columna una
serie de números, y yo quiero que aparezcan el valor correspondiente a
ese indice en la otra tabla.

Imaginemos la tabla Clientes, con dos columnas: la primera con
Integers desde el 1, autonumerados y la otra columna los nombres de
los clientes. Tengo otra tabla de facturas, donde una columna marca el
numero del cliente. Pero en el datagridview lleno de facturas no
quiero que aparezca el número del cliente, sino su nombre, que está en
la otra tabla. Como puedo hacer para que en vez de poner el numero,
busque en la otra tabla y aparezca el nombre. Claro que lo he
intentado llenarla con los numeros y luego mirar uno por uno y
escribir el nombre, pero cuando hay muchos registros, tarda demasiado,
hay otra forma que lo haga automáticamente? Un saludo.

Juan Carlos Pinto.

SoftJaén

unread,
Jun 2, 2008, 10:03:54 AM6/2/08
to
<jcp...@dpstudio.es> escribió:

> Tengo dos tablas. Una contiene datos de la otra, haciendo referencia

> al índice correspondiente. Osea dos tablas maestro-detalle, creo...


>
> Imaginemos la tabla Clientes, con dos columnas: la primera con
> Integers desde el 1, autonumerados y la otra columna los nombres de
> los clientes. Tengo otra tabla de facturas, donde una columna marca el
> numero del cliente. Pero en el datagridview lleno de facturas no
> quiero que aparezca el número del cliente, sino su nombre, que está en
> la otra tabla. Como puedo hacer para que en vez de poner el numero,
> busque en la otra tabla y aparezca el nombre.

Juan Carlos, lo que tienes que hacer es ejecutar una simple consulta de
selección que te combine ambas tablas, para que de ésta manera te muestre
los campos que desees de cada tabla.

La siguiente consulta SQL de selección combinará las tablas Clientes y
Facturas por el campo común «IdCliente». Como resultado obtendremos todas
las facturas que tengan establecido un número de cliente existente en la
tabla Clientes:

Dim sql As String = _
"SELECT f.IdFactura, c.Nombre, f.Fecha, f.Total " & _
"FROM Facturas f INNER JOIN Clientes c " & _
"ON c.IdCliente = f.IdCliente " & _
"ORDER BY f.IdFactura"

--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.

jcp...@dpstudio.es

unread,
Jun 2, 2008, 12:05:56 PM6/2/08
to
On 2 jun, 16:03, SoftJaén <grupo_notic...@softjaen.es> wrote:
> <jcpi...@dpstudio.es> escribió:

Hola y gracias Enrique.

Y si uso datasets tipados y conexión automática? Como que no, no?
(Imagino que todo no se puede tener...)

SoftJaén

unread,
Jun 2, 2008, 12:30:12 PM6/2/08
to
<jcp...@dpstudio.es> preguntó:

>
> Y si uso datasets tipados y conexión automática? Como que no, no?
> (Imagino que todo no se puede tener...)

Efectivamente, todo no se puede tener.

¿Para qué quieres un Dataset tipado con una consulta de selección que
combina dos tablas? Creo que éste tipo de consultas se utilizan mayormente
para un informe, o una vista de los datos. Pero si quieres actualizar el
origen de datos, tendrás que buscarte la vida por otros derroteros,
configurando "a mano" los objetos DataAdapter oportunos. Pero, ahora, ¿a ver
cómo configuras la propiedad «InsertCommand» o «UpdateCommand» del objeto
DataAdapter, para que te añada nuevas filas o te actualice los registros en
las dos tablas de la base de datos? :-)

jcp...@dpstudio.es

unread,
Jun 2, 2008, 1:02:02 PM6/2/08
to
On 2 jun, 18:30, "SoftJaén" <grupo_notic...@softjaen.es> wrote:
> <jcpi...@dpstudio.es> preguntó:

Pues sí, efectivamente, es solo para mostrar los datos en un
datagridview, y , opcionalmente, pasarlos a imprimir. La verdad es que
es la costumbre por lo que utilizo los datasets tipados, bueno,
costumbre y comodidad, porque así me ahorro todos los comandos y
conexiones con la base de datos. Bueno, lo que he hecho ha sido añadir
una columna más al datagridview manualmente, la columna del numero del
cliente ponerla no visible, y hacer un ciclo for-next que me recorra
el datagridview, pasando en cada row por fillby la columna no visible,
y escribiendo el resultado en la nueva columna. Tarda un poco más,
dependiendo del numero de datos... pero va.

Un saludo.
Juan C. Pinto.

SoftJaén

unread,
Jun 2, 2008, 1:26:04 PM6/2/08
to
<jcp...@dpstudio.es> escribió:

> Pues sí, efectivamente, es solo para mostrar los datos en un
> datagridview, y , opcionalmente, pasarlos a imprimir. La verdad es que
> es la costumbre por lo que utilizo los datasets tipados, bueno,
> costumbre y comodidad, porque así me ahorro todos los comandos y
> conexiones con la base de datos. Bueno, lo que he hecho ha sido añadir
> una columna más al datagridview manualmente, la columna del numero del
> cliente ponerla no visible, y hacer un ciclo for-next que me recorra
> el datagridview, pasando en cada row por fillby la columna no visible,
> y escribiendo el resultado en la nueva columna. Tarda un poco más,
> dependiendo del numero de datos... pero va.

Pero, Juan Carlos. Si sólo deseas mostrar los datos de la consulta de
combinación en el control DataGridView, no es necesario que configures un
DataSet tipado; simplemente tienes que ejecutar algo parecido a lo
siguiente:

' Configuramos la conexión con la base de SQL Server
'
Dim cnn As SqlConnection = New SqlConnection( _
"Data Source=(local);" & _
"Initial Catalog=Nombre_Base_Datos;" & _
"Integrated Security=SSPI")

' Creamos la consulta de combinación
'


Dim sql As String = _
"SELECT f.IdFactura, c.Nombre, f.Fecha, f.Total " & _
"FROM Facturas f INNER JOIN Clientes c " & _
"ON c.IdCliente = f.IdCliente " & _
"ORDER BY f.IdFactura"

' Creamos un adaptador de datos
'
Dim da As SqlDataAdapter = New SqlDataAdapter(sql, cnn)

' Creamos un objeto DataTable
'
Dim dt As DataTable = New DataTable("ClientesFacturas")

' Rellenamos el objeto DataTable
'
da.Fill(dt)

' Y por último, mostramos los datos en el control DataGridView
'
Me.DataGridView1.DataSource = dt

No creo que esto sea muy complicado de hacer. :-)

jcp...@dpstudio.es

unread,
Jun 2, 2008, 1:51:29 PM6/2/08
to
On 2 jun, 19:26, "SoftJaén" <grupo_notic...@softjaen.es> wrote:
> <jcpi...@dpstudio.es> escribió:

No Enrique, no es muy complicado, y más si lo das masticadito y
todo... jejeje.

Pero, a ver si estoy equivocado..., yo hago las conexiones
automáticas, osea que no las hago. Puedo hacer otra manualmente como
aparece en el código que escribes, y luego cerrarla? o se cerrará
tambien la que crea el propio programa... Yo pensaba que si las
conexiones las hace el propio programa, no se pueden mezclar con las
hechas manualmente mediante codigo... SI es así, que sí se puede
hacer, claro... lo hago rápido...
Gracias.

Juan C. Pinto.

SoftJaén

unread,
Jun 2, 2008, 2:42:39 PM6/2/08
to
<jcp...@dpstudio.es> escribió:

> Pero, a ver si estoy equivocado..., yo hago las conexiones
> automáticas, osea que no las hago. Puedo hacer otra manualmente como
> aparece en el código que escribes, y luego cerrarla? o se cerrará
> tambien la que crea el propio programa... Yo pensaba que si las
> conexiones las hace el propio programa, no se pueden mezclar con las
> hechas manualmente mediante codigo... SI es así, que sí se puede
> hacer, claro... lo hago rápido...

Si dos objetos Connection NO TIENEN NADA QUE VER EL UNO CON EL OTRO, cada
objeto ABRIRÁ Y CERRARÁ su propia conexión. Es decir, tú puedes tener una
conexión "automática" que se abrirá y cerrará por una lado, y también puedes
crear una conexión "no automática" que se abra y cierre por otro lado
distinto. No es lo habitual, pero digamos que se puede hacer, SIEMPRE que la
conexión "automática" y "no automática" se cierre inmediatamente después de
haber realizado el trabajo para la que fue abierta. Por tanto, no vayas
abrir una conexión y la cierres tres horas después de haberla abierto. :-)

SoftJaén

unread,
Jun 2, 2008, 2:52:19 PM6/2/08
to
Aparte, te comento que en el ejemplo que te he indicado, no es necesario
abrir expresamente la conexión, porque de abrirla y cerrarla se encarga el
propio objeto DataAdapter, ya que está especialmente diseñado para dejar la
conexión tal cual estaba:

Si la conexión está abierta --> Utiliza la conexión para hacer
el trabajo y la deja abierta

Si la conexión está cerrada --> La abre, hace el trabajo y la
vuelve a cerrar

Por tanto, no tenemos que estar pendientes de abrir y cerrar la conexión.

jcp...@dpstudio.es

unread,
Jun 2, 2008, 3:26:29 PM6/2/08
to

OK. Muchas gracias, lo pondré en práctica sin abrir de nuevo la
conexión. Imagino que de esta forma lo que tengo que hacer es coger la
cadena de conexión que aparece en Settings...

cnn= my.settings.BaseDatosConnectionString


Dim da As SqlDataAdapter = New SqlDataAdapter(sql, cnn)

Un saludo... y gracias. Esto es muy útil para poder utilizar los
datasets tipados para cosas sencillas y hacer cosas manuales para más
concretas... Muchas Gracias.

Juan Carlos Pinto.

Lord Voldemort

unread,
Jun 2, 2008, 4:51:36 PM6/2/08
to
JC.

Agarrandole el ladito si puedes trabajar con datasets tipados con multiples
tablas, para las funciones de insercion, actualizacion y eliminacion.

al menos con SQLServer y MySql lo he comprobado, Con los Store Procedures de
estos motores es muy facil generar dataset tipados y usen estas
funcionalides.

Tienes que generar 4 SP para dicha operacion. un SP para el Get (el select
principal), otro para el Insert, el Update y el Delete. cuando agregues tu
tableadapter selecciona que vas usar SP, y los indicas el SP para cada
operacion.

Actualmente ya logre trabajar con multiples tablas y lograr insert, update
sin usar los SP pero es un poco mas complicado de explicar pero tambien se
puede.

Toy asumiento que creas tus datasets y configuras tus tablaadapter no que
los genere el VS a partir de hacer el Drag and Drop en los formularios
porque esta ultima forma no ayuda en mucho.


Saludos

SoftJaén

unread,
Jun 2, 2008, 5:51:15 PM6/2/08
to
"Lord Voldemort" escribió:

> Toy asumiento que creas tus datasets y configuras tus tablaadapter no que
> los genere el VS a partir de hacer el Drag and Drop en los formularios
> porque esta ultima forma no ayuda en mucho.

Pues eso, que hay que configurar los adaptadores de datos "a mano", porque
los Asistentes que utiliza Visual Studio para crear orígenes de datos, me
huelo mucho que utilizan objetos CommandBuilder para tales tareas, y éstos,
que yo sepa, sólo admiten una única tabla para configurar las propiedades
«XXXCommand» del adaptador de datos.

Pero vuelvo a insistir que, para seleccionar un conjunto de datos de unas
tablas combinadas, para imprimir un informe o simplemente para
visualizarlos, no hay crear ningún DataSet "tipado" ni nada que se le
parezca, al menos, es mi opinión personal. Éstos objetos habría que crearlos
si nuestra intención es actualizar el origen de datos, pero si no es así,
¿para qué crearlos? :-)

Un saludo

Lord Voldemort

unread,
Jun 2, 2008, 7:30:51 PM6/2/08
to
Hola SoftJaén..


"SoftJaén" <grupo_n...@softjaen.es> escribió en el mensaje de noticias
news:5300AAFD-49A4-4402...@microsoft.com...


> "Lord Voldemort" escribió:
>
>> Toy asumiento que creas tus datasets y configuras tus tablaadapter no
>> que los genere el VS a partir de hacer el Drag and Drop en los
>> formularios porque esta ultima forma no ayuda en mucho.
>
> Pues eso, que hay que configurar los adaptadores de datos "a mano", porque
> los Asistentes que utiliza Visual Studio para crear orígenes de datos, me
> huelo mucho que utilizan objetos CommandBuilder para tales tareas, y
> éstos, que yo sepa, sólo admiten una única tabla para configurar las
> propiedades «XXXCommand» del adaptador de datos.

pero.. Con un simple un truquillo se puede hacer que muestre datos de
multiples tablas y solo actualice una.


> Pero vuelvo a insistir que, para seleccionar un conjunto de datos de unas
> tablas combinadas, para imprimir un informe o simplemente para
> visualizarlos, no hay crear ningún DataSet "tipado" ni nada que se le
> parezca, al menos, es mi opinión personal. Éstos objetos habría que
> crearlos si nuestra intención es actualizar el origen de datos, pero si no
> es así, ¿para qué crearlos? :-)

Muy de acuerdo.

>
> Un saludo
>
> --
> Enrique Martínez
> [MS MVP - VB]
>

Un abrazo desde honduras.

Jairo Hernandez

jcp...@dpstudio.es

unread,
Jun 3, 2008, 4:11:25 AM6/3/08
to
On 3 jun, 01:30, "Lord Voldemort" <lordvoldem...@gmail.com> wrote:
> Hola SoftJaén..
>
> "SoftJaén" <grupo_notic...@softjaen.es> escribió en el mensaje de noticiasnews:5300AAFD-49A4-4402...@microsoft.com...

Por cierto Enrique, en SQL no tengo problemas, pero en OLEDB, como
será esa misma consulta que me has puesto...?
Lo he intentado tal cual esta pero me da error de sintaxis en JOIN.

Un saludo.

SoftJaén

unread,
Jun 3, 2008, 8:19:57 AM6/3/08
to
<jcp...@dpstudio.es> preguntó:

> Por cierto Enrique, en SQL no tengo problemas, pero en OLEDB, como
> será esa misma consulta que me has puesto...?
> Lo he intentado tal cual esta pero me da error de sintaxis en JOIN.

La consulta SQL que te indiqué digamos que es estándar, por tanto sirve para
recuperar registros combinados de dos tablas de una base de datos de Access
como de SQL Server, por lo que ignoro el motivo para que obtegas un error de
sintaxis.

Revisa bien la consulta, porque la más mínima equivocación en la escritura,
es suficiente para obtener un error de sintaxis.

--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el

0 new messages