none
¿Llenar datagridview con datos de tabla de sql? RRS feed

  • Pregunta

  • Hola buenas tardes. Acudo a ustedes para pedir de su orientación, quiero generar una consulta y mostrarla en un datagridview, el problema con el que me encuentro es que hay celdas de una columna especifica del datagridview que la quiero llenar con mas de un valor, y quisiera saber si esto es posible y si me pueden dar alguna idea de como hacerlo.

    A continuación les anexo las tablas para que me entienda y el código que hasta ahorita llevo.

    En la imagen anterior se muestra un ejemplo de la consulta que quiero generar, y la columna en color amarillo es con el que tengo el problema.

    Enseguida les anexo el código que hasta ahorita llevo.

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    Dim cnn = New SqlConnection("data source = (local); initial catalog = BDControlViaticos; user id = sa; password = modatelas")

    cnn.Open()

    Aqui lleno las columnas Nnomina (Llave primaria), Nombre, Importe y Proyecto.

             Try

                Dim daA As New SqlDataAdapter("select Nnomina,Nombre,Gran_Total,Objetivo_Viaje from DatosEmpleadoYformaPago " & _
     "where Periodo_Inicial>='" & DateTimePicker1.Value.Date & "' and Periodo_Final<='" & DateTimePicker2.Value.Date & "'", cnn)
    Dim dsA As New DataSet
            daA.Fill(dsA)
            DataGridView1.DataSource = dsA.Tables(0)
            DataGridView1.ClearSelection()
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Critical)
            End Try

    Aqui lleno la columna Origen.

            Dim CdOrigen As New SqlCommand
            CdOrigen.CommandText = "select Cd_Origen from DetalleIntinerario where NmovI=(select min(NmovI) from DetalleIntinerario where Nnomina=@Nomina and Periodo_Inicial>='" & DateTimePicker1.Value.Date & "' and Periodo_Final<='" & DateTimePicker2.Value.Date & "')"
            CdOrigen.CommandType = CommandType.Text
            CdOrigen.Connection = cnn
            For Each row As DataGridViewRow In DataGridView1.Rows
                CdOrigen.Parameters.Clear()
                CdOrigen.Parameters.AddWithValue("@Nomina", CStr(row.Cells("Nomina").Value))
                Dim leerCdOrigen As SqlDataReader
                leerCdOrigen = CdOrigen.ExecuteReader
                If leerCdOrigen.Read Then
                    row.Cells("Origen").Value = leerCdOrigen(0)
                    leerCdOrigen.Close()
                End If
                leerCdOrigen.Close()
            Next

    Aqui lleno la columna Dias.

      Dim Dias As New SqlCommand
            Dias.CommandText = "select sum(Dias) from DetalleIntinerario where Nnomina=@Nomina and Periodo_Inicial>='" & DateTimePicker1.Value.Date & "' and Periodo_Final<='" & DateTimePicker2.Value.Date & "'"
            Dias.CommandType = CommandType.Text
            Dias.Connection = cnn
            For Each row As DataGridViewRow In DataGridView1.Rows
                Dias.Parameters.Clear()
                Dias.Parameters.AddWithValue("@Nomina", CStr(row.Cells("Nomina").Value))
                Dim leerDias As SqlDataReader
                leerDias = Dias.ExecuteReader
                If leerDias.Read Then
                    row.Cells("Dias").Value = leerDias(0)
                    leerDias.Close()
                End If
                leerDias.Close()
            Next

            cnn.Close()

     End Sub

    Y la consulta me queda de la siguiente manera.

    Las tablas de conde quiero estoy haciendo la consulta son las siguientes.

    Tabla DatosEmpleadoYformaPago.

    Tabla DetalleIntinerario

    Bueno esta toda la información de la que dispongo y el avance que llevo. De antemano les agradezco mucho cualquier orientación que me puedan brindar.

    Saludos desde Tijuana, BC.

    domingo, 3 de enero de 2016 21:58

Respuestas

  • Despues de darles vueltas al asunto, me encontre con la solucion a mi problema.

    Les dejo el codigo por si a alguno mas adelante se le ofrese.

    De esta manera la consulta en forma de lista, la paso a una cadena y la inserto en la columna del grid.

    Dim CdDestino As New SqlCommand
            Dim QueryCdDestino As String
            QueryCdDestino = "DECLARE @Cd_Destino VARCHAR(1000)" & _
                             " " & _
                             "SET @Cd_Destino = ''" & _
                             " " & _
                             "SELECT @Cd_Destino = @Cd_Destino + Cd_Destino + ', '" & _
                             " " & _
                             "from DetalleIntinerario where Nnomina = @Nomina" & _
                             " " & _
                             "and Periodo_Inicial>='" & DateTimePicker1.Value.Date & "'" & _
                             " " & _
                             "and Periodo_Final<='" & DateTimePicker2.Value.Date & "'" & _
                             " " & _
                             "select left(@Cd_Destino,len(@Cd_Destino)-1)"
            CdDestino.CommandText = QueryCdDestino
            CdDestino.CommandType = CommandType.Text
            CdDestino.Connection = cnn
            For Each row As DataGridViewRow In DataGridView1.Rows
                CdDestino.Parameters.Clear()
                CdDestino.Parameters.AddWithValue("@Nomina", CStr(row.Cells("Nomina").Value))
                Dim leerCdDestino As SqlDataReader
                leerCdDestino = CdDestino.ExecuteReader
                If leerCdDestino.Read Then
                    row.Cells("Destino").Value = leerCdDestino(0)
                    leerCdDestino.Close()
                End If
                leerCdDestino.Close()
            Next

    saludos, y gracias por su apoyo.

    jueves, 7 de enero de 2016 20:28

Todas las respuestas

  • hola

    Para unir en una unica consulta las tablas DatosEmpleadoYformaPago  y DetalleIntinerario  deberias usar un INNER JOIN

    de esta forma podrias obtener el resultado que buscas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 4 de enero de 2016 5:20
  • Pero lo que yo  quiero hacer es que todos los destinos que corresponden a cada unos de los empleados, los inserte verticalmente en una sola celda del datagridview, y los separe con una ",". 

    por ejemplo:

    En la fina según el empleado en la columna Destino quiero mostrar solo la primera Ciudad de Origen (Cd_Origen) dentro del rango de fecha especificado, y esto ya lo tengo resulto, pero en la en el la columna Destino quiero mostrar todas las Ciudades Destino (Cd_Destino) y quiero mostrarla en la misma celda de la misma fila que le corresponde a cada empleado. 

    No se si esto sea posible, se me ocurre quiza se pueda exportar una consulta a un txt, y de ahi importarla al datagridview.

    De antemano gracias por tu ayuda.

    martes, 5 de enero de 2016 0:14
  • Mi opinión al respecto es que crees un registro con los datos que deseas mostrar en la columna y luego se la pasas al grid. La columna destino tendría cada uno de los elementos que necesitas separados por ",". 
    martes, 5 de enero de 2016 0:23
  • Hola,

    Si no es mucha molestia me explicas un poquito mas como seria lo del registro o a que te refieres con eso por favor.

    Gracias.

    martes, 5 de enero de 2016 0:59
  • Por lo que logro entender tienes varios destinos y los deseas mostrar en una sola columna separados por ",", a lo que me refiero es que después de obtener los "destinos" pudieras hacer un método auxiliar que dado una lista de destinos de devuelva una cadena con cada uno de estos destinos separados por "," le podrías dar el formato que desees, luego lo mostrarías como si fuera un solo registro el cual ya tendrá tos los destinos, no se como estas llenando tu grid, si me especificas los datos te pudiera ayudar mejor. 

    Ex. 

    [destino1][destino2][destino....x]

    obtendrias

    [detino1,destino2,destino....x]

     Saludos

      
    martes, 5 de enero de 2016 1:21
  • Hola,

    Deja ver si me puedo explicar, y de antemano gracias por tu tiempo.

    De la tabla DatosEmpleadoYformaPago, extraigo mi valor pricipal que es "Nnomina". La consulta la filtrado por fechas (Periodo_Inicial y Periodo_Final), y lo muestro en mi Datagridview1. De acuerdo al valor "Nnomina" que en mi grid se llama "Nomina", es como hago la consulta en la tabla DetalleIntinerario, del campo "Cd_Origen" para sacar los valores de que inserto en la columna "Origen"  en mi grid.

    Hasta aqui no hay problema porque solo me interesa insertar el primer valor que hay en "Cd_Origen" de cada uno de los empleado dentro del rango de fecha especificado (Periodo_Inicial y Periodo_Final) y este dato lo obtengo con un for.

    De la misma tabla DetalleIntinerario, quiero sacar los valores que hay en "Cd_Destino" de cada uno de los empleados con "Nnomina" que ya estan cargados en mi grid he insertarlos en forma de cadena separados por una "," en la columna "Destino".

    Al no saber como cargar mi grid con una sola consulta, decidi hacerlo por separado. Es por eso que en el grid primero cargo de la tabla DatosEmpleadoYformaPago (Nomina, Nombre, Importe y Proyecto), y de la tabla DetalleIntinerario (Origen, Dias) y quiero poder sacar también los destino y ponerlos como en la imagen de arriba.

    Bueno hasta aqui espero haberme explicado y haber podido dar mas claridad en mi problema.

    saludos.

    martes, 5 de enero de 2016 2:33
  • Como muestras contenido de varias tablas yo haría un modelo que contenga los campos que deseas mostrar en tu grid, en tu caso(Nomina, Nombre, Destino....), ya que obtengas las nominas por cada una de ellas buscas sus destinos y los vas concatenando, con ello vas creando un objeto, al terminar vas a tener una lista de objetos la cual vas a mostrar en el grid.

    Algo como esto:

    public class Modelo { public string Nomina{ get; set; } public string Destino{ get; set; } } //Controller public ActionResult VistaGrid() { var br = new Entities(); var detallesInt= (from nm in br.detalleIntinerario select nm ).ToList(); //llamas al metodo que te concatena los destinos le pasas(detallesInt)

    y te devuelve una lista de Modelo. Como las nominas se repiten por

    cada una debes obtener sus destinos de modo que la 0411207 tenga (d1,d2,d3,d4) y creas

    el obj modelo. return View(Modelo); // en la vista muestras la lista en el grid }


    martes, 5 de enero de 2016 4:30
  • Hola Saludos,

    Deja pruebo lo que comentas.

    Gracias :-)...

    martes, 5 de enero de 2016 20:03
  • Despues de darles vueltas al asunto, me encontre con la solucion a mi problema.

    Les dejo el codigo por si a alguno mas adelante se le ofrese.

    De esta manera la consulta en forma de lista, la paso a una cadena y la inserto en la columna del grid.

    Dim CdDestino As New SqlCommand
            Dim QueryCdDestino As String
            QueryCdDestino = "DECLARE @Cd_Destino VARCHAR(1000)" & _
                             " " & _
                             "SET @Cd_Destino = ''" & _
                             " " & _
                             "SELECT @Cd_Destino = @Cd_Destino + Cd_Destino + ', '" & _
                             " " & _
                             "from DetalleIntinerario where Nnomina = @Nomina" & _
                             " " & _
                             "and Periodo_Inicial>='" & DateTimePicker1.Value.Date & "'" & _
                             " " & _
                             "and Periodo_Final<='" & DateTimePicker2.Value.Date & "'" & _
                             " " & _
                             "select left(@Cd_Destino,len(@Cd_Destino)-1)"
            CdDestino.CommandText = QueryCdDestino
            CdDestino.CommandType = CommandType.Text
            CdDestino.Connection = cnn
            For Each row As DataGridViewRow In DataGridView1.Rows
                CdDestino.Parameters.Clear()
                CdDestino.Parameters.AddWithValue("@Nomina", CStr(row.Cells("Nomina").Value))
                Dim leerCdDestino As SqlDataReader
                leerCdDestino = CdDestino.ExecuteReader
                If leerCdDestino.Read Then
                    row.Cells("Destino").Value = leerCdDestino(0)
                    leerCdDestino.Close()
                End If
                leerCdDestino.Close()
            Next

    saludos, y gracias por su apoyo.

    jueves, 7 de enero de 2016 20:28