none
crear vista de datos a partir de dataset con varias tablas?? RRS feed

  • Pregunta

  • Como creo una vista de datos en un dataset tipado con varias tablas??
    el problema es que necesito meter a un datagridview datos de 3 diferentes tablas eso me dicen que es mas facil con una vista de datos pero como se hace??
    domingo, 8 de noviembre de 2009 3:55

Respuestas

  • "RIAB" preguntó:

    > Como creo una vista de datos en un dataset tipado con varias tablas??

    Hola:

    Puedes rellenar un objeto DataTable como resultado de ejecutar una consulta SQL de combinación (INNER JOIN), que agrupe varias tablas de una misma base de datos.

    Por ejemplo, imagina que tienes tres tablas con campos relacionados entre ellas, Municipios, Provincias y Autonomias, y deseas mostrar el Identificador del Municipio (IdMunicipio), el nombre del Municipio (Nombre), así como los nombres de la Provincia y de la Comunidad Autónoma a la que pertenece el Municipio. Pues bien, para ello ejecutarías la siguiente consulta SQL de combinación:

            Using cnn As New OleDbConnection( _
                "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "Data Source=C:\Mis documentos\Municipios.mdb;")

                Dim sql As String = _
                    "SELECT m.IdMunicipio, m.Nombre As [Nombre Municipio], " & _
                    "p.Nombre As [Nombre Provincia], a.Nombre As [Nombre Comunidad] " & _
                    "FROM (Autonomias a INNER JOIN Provincias p ON a.IdComunidad = p.IdComunidad) " & _
                    "INNER JOIN Municipios m ON p.IdProvincia = m.IdProvincia " & _
                    "WHERE p.IdProvincia = 23 " & _
                    "ORDER BY m.Nombre"

                Dim da As New OleDbDataAdapter(sql, cnn)

                Dim dt As New DataTable("Municipios")

                da.Fill(dt)

                DataGridView1.DataSource = dt

            End Using

    Ni que decir tiene que te olvides de actualizar posteriormente la base de datos con los datos existentes en el objeto DataTable, porque no vas a poder hacerlo mediante el método Update del adaptador de datos utilizado.

    Un saludo


    Enrique Martínez [MS MVP - VB]
    • Propuesto como respuesta Enrique M. MontejoModerator domingo, 8 de noviembre de 2009 8:58
    • Marcado como respuesta RIAB domingo, 8 de noviembre de 2009 14:45
    domingo, 8 de noviembre de 2009 8:58
    Moderador
  • Si aparte de no poder vincular las tablas existentes en las dos bases de Access, tampoco conoces el lenguaje SQL, todas las soluciones que te demos aquí te van a ser difíciles de entender y de llevarlas a cabo.

    Si no puedes vincular las tablas de Access, créate dos servidores vinculados desde el propio Administrador de SQL Server: uno para la tabla de la base A, y otro para la tabla de la base B. Una vez que tengas los servidores vinculados, puedes crearte una vista en la base de SQL Server para consultar los datos combinados de las dos tablas. O también puedes ejecutar una consulta de creación de tabla (SELECT * INTO) para crear una nueva tabla en la base de datos de SQL Server con la información combinada de las dos tablas de la bases de Access.

    Pero si todo esto lo desconoces, o te suena a chino, tendrás que comenzar por buscar información en los Libros en Pantalla de SQL Server sobre cómo se crea un servidor vinculado a una base de Access, y cómo se ejecutan consultas SQL de combinación (INNER JOIN) entre dos tablas que tengan campos relacionados.

    Como ésta conversación ya se encuentra cerrada por el usuario que la inició, RIAB, yo te aconsejaría que iniciaras una nueva pregunta, si así lo crees conveniente, y que EXPUSIERAS CLARAMENTE lo que deseas que haga tu aplicación de Visual Basic .net.


    Enrique Martínez [MS MVP - VB]
    jueves, 12 de noviembre de 2009 15:11
    Moderador

Todas las respuestas

  • hola

    - los datos tendras la misma estructura de informacion, o sea los mismos campos ?

    lo pregunto porque en un datagridview no podrás representar tres tablas con distintos campos

    Para crear cada tabla en un dataset tipado simplemente ve al diseñador del dataset, y arrastre desde el Server Explorer (por supuesto conectado a tu db) las tablas que queires representar

    Igual como te comento, por ahi lo que ten conviene hacer es definir una estructura de campos, cargar tres instancias distintas y realizar un Merge entre ellas con el método  Merge

    con el merge obtendrás uno unico datatable con la información conjunta de los tres conjuntos de datos, pero aclaro tiene que tenes los mismos campos 

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 8 de noviembre de 2009 4:31
  • Compañero no te entiendo bien en canto me dices los mismo datos??puedes ser un poco mas explicito por favor.
    un saludo
    domingo, 8 de noviembre de 2009 4:32
  • hola

    me refiero a que caga conjunto de dato, en cada una de als consultas deben tener los mismo campos

    si las consultas son a tres tipos de base de datos distintas y queires consultar por ejemplos contactos, y defines que los campos sera, por ejemplo
    "id", "nombre", "mail", bueno las tres consultas deben llenar esos tres campos, y ahi si luego ahcer el merge entre estos par aunificarlo y cargarlo al datagridview

    si una de las consulta te trae datos dintintos por ejemplo "idcontacto", "alias", "calle", en ese caso no podras hacer el merge, salvo que desde tu query puedas usar alias para los campos y adaptar la informacion

    bueno espero quede mas claro, sino vemos de amplicarlo
    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 8 de noviembre de 2009 4:37
  • No son 3 bases de datos distintas compañero;es una sola base de datos de las cual necesito datos de 3 tablas diferentes en un datagridview
    domingo, 8 de noviembre de 2009 4:39
  • hola

    ahh ok queda mas claro, bien pero esas tablas tienen los mismo campos ?
    puedes unir esa información en un único grupo para ser cargada en una grilla

    o sea en datagridview no se puede representar de forma variable la informacion, o sea simpre carga de a un datatable, si necesitas mostrar información distinta, deberas usar mas de una grilla

    veras que el datagridview tiene una propiedad que se llama DataGridView.DataMember
    esta es la que le indica al datagriview que datatable debe utilizar si es que el dataset tiene mas de una tabla definida

    por eso te decía que solo una podrás cargar aunque tengas tres en el mismo dataset, para mostrar las tres juntas debes unificarla en un solo datatable

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 8 de noviembre de 2009 4:48
  • Por eso queria meter una vista de datos a partir de las 3 tablas pero no se como hacerla
    domingo, 8 de noviembre de 2009 4:53
  • "RIAB" preguntó:

    > Como creo una vista de datos en un dataset tipado con varias tablas??

    Hola:

    Puedes rellenar un objeto DataTable como resultado de ejecutar una consulta SQL de combinación (INNER JOIN), que agrupe varias tablas de una misma base de datos.

    Por ejemplo, imagina que tienes tres tablas con campos relacionados entre ellas, Municipios, Provincias y Autonomias, y deseas mostrar el Identificador del Municipio (IdMunicipio), el nombre del Municipio (Nombre), así como los nombres de la Provincia y de la Comunidad Autónoma a la que pertenece el Municipio. Pues bien, para ello ejecutarías la siguiente consulta SQL de combinación:

            Using cnn As New OleDbConnection( _
                "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "Data Source=C:\Mis documentos\Municipios.mdb;")

                Dim sql As String = _
                    "SELECT m.IdMunicipio, m.Nombre As [Nombre Municipio], " & _
                    "p.Nombre As [Nombre Provincia], a.Nombre As [Nombre Comunidad] " & _
                    "FROM (Autonomias a INNER JOIN Provincias p ON a.IdComunidad = p.IdComunidad) " & _
                    "INNER JOIN Municipios m ON p.IdProvincia = m.IdProvincia " & _
                    "WHERE p.IdProvincia = 23 " & _
                    "ORDER BY m.Nombre"

                Dim da As New OleDbDataAdapter(sql, cnn)

                Dim dt As New DataTable("Municipios")

                da.Fill(dt)

                DataGridView1.DataSource = dt

            End Using

    Ni que decir tiene que te olvides de actualizar posteriormente la base de datos con los datos existentes en el objeto DataTable, porque no vas a poder hacerlo mediante el método Update del adaptador de datos utilizado.

    Un saludo


    Enrique Martínez [MS MVP - VB]
    • Propuesto como respuesta Enrique M. MontejoModerator domingo, 8 de noviembre de 2009 8:58
    • Marcado como respuesta RIAB domingo, 8 de noviembre de 2009 14:45
    domingo, 8 de noviembre de 2009 8:58
    Moderador
  • Buenas tardes,

    Referente a este tema aprovecho para realizar una consulta que espero que puedan responderme.

    Tengo 2 tablas en 2  ficheros Access distintos. En la tabla A, tengo los campos: "Código" "Fecha" "Cajas" y en la tabla B tengo los campos: "Código" "Kg_x_caja".

    Quiero crear una vista en sql que me muestre "Código", "Fecha" y un tercer campo que sería la multiplicación de "Cajas" X "Kg_x_caja" y deseo guardar el resultado de la vista en una tabla del sql.

    He añadido al visual studio las bases de datos Access y el sql, pero no encuentro la manera de crear una vista con la combinación de las 2 tablas Access insisto en que son ficheros distintos. ¿Qué solución me pueden recomendar?

    Muchas gracias de antemano y disculpen mi ignorancia sobre el tema.

    PD: Uso Visual Studio 2005 y sql Server Express Edition 2005
    lunes, 9 de noviembre de 2009 13:48
  • hola


    bueno al usar VS2005 el uso de linq esta descartado

    en ese caso una vista no creo que sea posible ya que son archivos de Access sepadados, por ahi podrias hacerlo de forma manual, recorriendo una de las tablas y consultando en la otra, y en este proceso ir cargando una datatable adicional con el resultado del merge

    con linq esto lo haria automatico, pero al no poder usarlo necesitas hacerlo manualmente

    - una consulta la idea es que al final esto se pase a sql server?
    si es asi podrias hacer la dos consulta y el procesamientod e este directamente insertarlo en la tabla de sql server


    pasos
    - consulta la tabla1 de Access "Código" "Fecha" "Cajas", obtienes un datatable1
    - consulta la tabla2 de Acces "Código" "Kg_x_caja", obtienes un datatable2

    - recorrer el datatable1, y en cada iteracion con el valor del campo Codigo, consulta el datatable2

    - cuando tienes todos los resultados armas la consulta insert, que ejecutaras contra la tabla de sql server


    es una operacion algo manual, pero asi seguro podras procesar la info


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 9 de noviembre de 2009 14:01
  • > Tengo 2 tablas en 2  ficheros Access distintos. En la tabla A,
    > tengo los campos: "Código" "Fecha" "Cajas" y en la tabla B
    > tengo los campos: "Código" "Kg_x_caja".

    Por si lo desconoces, te comentaré que puedes VINCULAR la tabla B a la base de datos que contiene la tabla A, o viceversa, de ésta manera trabajarías con la tabla B como si estuviera en la misma base que la tabla A.

    > Quiero crear una vista en sql que me muestre "Código", "Fecha"
    > y un tercer campo que sería la multiplicación de
    > "Cajas" X "Kg_x_caja" y deseo guardar
    > el resultado de la vista en una tabla del sql.

    En tu servidor de SQL Server, puedes crearte un Servidor Vinculado que apunte a la base de datos de Access (aquella que tiene la tabla A y como vinculada la tabla B). Posteriormente podrás ejecutar una consulta SELECT * INTO para crear una nueva tabla en la base de datos de SQL Server con los datos de la consulta SQL de selección.

    > He añadido al visual studio las bases de datos Access y el sql,
    > pero no encuentro la manera de crear una vista con la
    > combinación de las 2 tablas Access insisto en que
    > son ficheros distintos. ¿Qué solución me pueden recomendar?

    Por lo que observo, poco tiene que lo que deseas hacer con Visual Basic .net, salvo que te desees complicar la vida innecesariamente, más aún, sabiendo que hay otros caminos para hacerlo de una manera más fácil.

    Como a mí no me gusta complicarme la vida haciendo estos menesteres con una aplicación de Visual Basic .NET, mi recomendación es que lo hagas todo a través de la propia interfaz de usuario de Microsoft Acces (para vincular las tablas de las dos bases de datos de Access) y del Administrador de SQL Server Express 2005 (para crear el servidor vinculado y ejecutar la consulta SELECT * INTO).

    Una vez que tengas creada tu nueva tabla en la base de SQL Server, entonces ya estarás en condiciones de recuperar los datos en un objeto DataTable de tu aplicación de Visual Basic .net.




    Enrique Martínez [MS MVP - VB]
    lunes, 9 de noviembre de 2009 14:52
    Moderador
  • Buenas tardes y gracias por las respuestas,

    Sigo sin encontrar solución,

    No puedo tocar NADA de las tablas access puesto que tienen otro fin y son usadas por otra aplicación, yo solo las utilizo para extraer cierta información que me interesa y que se va actualizando, no puedo ni realizar vínculos entre ellas, ni crear consultas dentro.

    Así pues, si las vistas no funcionan, pienso que lo mejor sería (corríjanme si me equivoco), importar y posteriormente actualizar las tablas Access en otras tablas de mi sql en cada ejecución de mi programa y a partir de aquí generar mi propia vista. No sé si lo de los Datatable que comenta Leandro iría por ahí.

    Es que debo realizar algunas operaciones antes de mostrar los datos (realmente mis tablas tienen más campos que los del ejemplo) y no veo otra manera de introducir fórmulas antes de mostrar el resultado.

    He de decir que como no conozco sql, estoy utilizando los wizard para encontrar la solución y quizá ahí está el problema.

    Les agradecería  enormemente si me pudieran orientar un poco e ilustrarme con algún pequeño ejemplo.

    Muchísimas gracias.




    miércoles, 11 de noviembre de 2009 14:57
  • Si aparte de no poder vincular las tablas existentes en las dos bases de Access, tampoco conoces el lenguaje SQL, todas las soluciones que te demos aquí te van a ser difíciles de entender y de llevarlas a cabo.

    Si no puedes vincular las tablas de Access, créate dos servidores vinculados desde el propio Administrador de SQL Server: uno para la tabla de la base A, y otro para la tabla de la base B. Una vez que tengas los servidores vinculados, puedes crearte una vista en la base de SQL Server para consultar los datos combinados de las dos tablas. O también puedes ejecutar una consulta de creación de tabla (SELECT * INTO) para crear una nueva tabla en la base de datos de SQL Server con la información combinada de las dos tablas de la bases de Access.

    Pero si todo esto lo desconoces, o te suena a chino, tendrás que comenzar por buscar información en los Libros en Pantalla de SQL Server sobre cómo se crea un servidor vinculado a una base de Access, y cómo se ejecutan consultas SQL de combinación (INNER JOIN) entre dos tablas que tengan campos relacionados.

    Como ésta conversación ya se encuentra cerrada por el usuario que la inició, RIAB, yo te aconsejaría que iniciaras una nueva pregunta, si así lo crees conveniente, y que EXPUSIERAS CLARAMENTE lo que deseas que haga tu aplicación de Visual Basic .net.


    Enrique Martínez [MS MVP - VB]
    jueves, 12 de noviembre de 2009 15:11
    Moderador
  • Sr. ENRIQUE M.MONTEJO, su respuesta esta clarísima. Gracias.
    martes, 11 de julio de 2017 11:02