none
Recorrer datagridview y llenar columna en c# RRS feed

  • Pregunta

  • Hola, buenas noches, tengo un datagridview con 5 columnas:

    - IdEstudiante

    - Cedula

    - Nombres

    - Apellidos

    - Horas

    Las 4 primeras columnas las lleno con información de una base de datos, la última columna esta vacía. Necesito que después que se carga el datasource del datagridview con información de las 4 primeras columnas recorrer el mismo, obtener el IdEstudiante, realizar una consulta a la base de datos con ese id y colocar el resultado de la consulta en la columna HORAS, y hacer lo mismo por cada fila.

    Cualquier ayuda estaré muy agradecido  

    lunes, 15 de enero de 2018 1:40

Respuestas

  • Hola

    no comprendo

    - Llenas tu datagridview con las 4 columnas, pero sin el idestudiante

    - El idestudiante en el datagridview de donde sale?

    - Por qué no cruzas en sql server la información y traes en tu datatable o cualquier otro contenedor, dicho cruce (en consulta) y con ello trabajas.

    Míralo por el lado de optimizar tu aplicación y no consumir recursos ni redundar en el código

    Saludos


    Brayan De la Cruz
    Lima - Perú

    lunes, 15 de enero de 2018 2:36
  • Hola

    De haber forma, la hay. Sin embargo para que viajar dos veces a la base de datos, en que se te complica el proceso? lo de la creación de la vista lo decía algo así:

    Create View VistaPrueba
    as
    SELECT idestudiante,CAST(horas AS nvarchar) + '.' + CAST(minutos AS nvarchar) AS HorasAcumuladas
       FROM (SELECT totalminutos/60 horas, totalminutos % 60 minutos
       FROM (SELECT Sum(DifMinutos) totalminutos
       FROM (SELECT r.IdEstudiante ,DATEDIFF (Minute, HoraEntrada, HoraSalida) As DifMinutos
       FROM TbRegistroAsistencia r INNER JOIN TbEstudiantesPasantes e ON r.idEstudiante = e.IdEstudiante
       INNER JOIN TbDatosPasantiaEstudiante d ON e.IdEstudiante = d.IdEstudiante
       WHERE r.IdEstudiante = @idEstudiante AND d.Proceso_A_I = 1 AND r.HoraEntrada IS NOT NULL AND r.HoraSalida IS NOT NULL
       ) consulta0
       group  by IdEstudiante
       ) consulta1
       ) consulta2
    

    Luego, te tocaría cruzar esta vista con la primera consulta:

    SELECT e.IdEstudiante, e.Cedula, e.Nombre, e.Apellido, V.HorasAcumuladas 
    from TbEstudiantesPasantes e 
    INNER JOIN TbDatosPasantiaEstudiante d ON e.IdEstudiante = d.IdEstudiante 
    inner join VistaPrueba V on e.idestudiante = V.idestudiante
    WHERE d.Proceso_A_I = 1 ORDER BY Apellido

    como verás este cruce se da por el idestudiante y lo añades en tu selección (V.HorasAcumuladas), en negrita están los cambios. Como no tengo los datos no puedo probar las consultas, pero es una ayuda que puedo brindarte.

    Saludos


    Brayan De la Cruz
    Lima - Perú

    • Marcado como respuesta JCORBETTO lunes, 15 de enero de 2018 4:33
    lunes, 15 de enero de 2018 3:54

Todas las respuestas

  • Hola, si necesitas sacar un resultado con el mismo id del estudiante porque no lo haces en la misma consulta ,otra cosa cual es el datasource de tu datagridview es un datatable o una lista?

    saludos.


    Votar es agradecer.
    Saludos.
    Lima-Perú

    lunes, 15 de enero de 2018 2:03
  • Hola Augusto, muchas gracias por responder, el datasource lo lleno mediante un datatable.

    Inicialmente no puedo realizar la consulta en la columna HORAS porque no tengo los IDESTUDIANTES, es por eso que después de cargar el datagridview, lo necesito recorrer y capturar ese id para realizar la consulta a la BD.

    Muchas gracias de antemano por al atención prestada.

    lunes, 15 de enero de 2018 2:17
  • Hola

    no comprendo

    - Llenas tu datagridview con las 4 columnas, pero sin el idestudiante

    - El idestudiante en el datagridview de donde sale?

    - Por qué no cruzas en sql server la información y traes en tu datatable o cualquier otro contenedor, dicho cruce (en consulta) y con ello trabajas.

    Míralo por el lado de optimizar tu aplicación y no consumir recursos ni redundar en el código

    Saludos


    Brayan De la Cruz
    Lima - Perú

    lunes, 15 de enero de 2018 2:36
  • Hola Brayan, gracias por responder, cuando cargo el datagridview, si se carga el IdEstudiante, esa es la primera columna, despues de cargar el datagridview lo quiero recorrer, y al recorrerlo con el id de la primera columna deseo realizar una consulta en la bd y asignar a la columna HORA el resultado de la consulta.  
    lunes, 15 de enero de 2018 2:40
  • Hola

    disculpa la insistencia, pero si la columna hora también está en la base de datos, no hay necesidad de recorrer nada, solo generarás gasta más recursos. ¿Por qué no utiliza un inner join para cruzar tus consultas y traer en la primera carga dicho campo?, perdona pero mi sugerencia es que es innecesario volver a ir a la base de datos. Por otro lado, de ser sumamente necesario, te pediría nos detalles, ya que nuestra ayuda va más allá de una codificación, quisieramos aconsejarte que hagas los más óptimo.

    Saludos


    Brayan De la Cruz
    Lima - Perú

    lunes, 15 de enero de 2018 2:58
  • Este es la query donde lleno el datagridview:

    SELECT e.IdEstudiante, e.Cedula, e.Nombre, e.Apellido from TbEstudiantesPasantes e INNER JOIN TbDatosPasantiaEstudiante d ON e.IdEstudiante = d.IdEstudiante WHERE d.Proceso_A_I = 1 ORDER BY Apellido

    Luego quiero ejecutar la siguiente query para sumar la cantidad de horas que tiene acumuladas un estudiante en la realización de sus pasantias en un departamento:

    SELECT CAST(horas AS nvarchar) + '.' + CAST(minutos AS nvarchar) AS HorasAcumuladas
       FROM (SELECT totalminutos/60 horas, totalminutos % 60 minutos
       FROM (SELECT Sum(DifMinutos) totalminutos
       FROM (SELECT r.IdEstudiante ,DATEDIFF (Minute, HoraEntrada, HoraSalida) As DifMinutos
       FROM TbRegistroAsistencia r INNER JOIN TbEstudiantesPasantes e ON r.idEstudiante = e.IdEstudiante
       INNER JOIN TbDatosPasantiaEstudiante d ON e.IdEstudiante = d.IdEstudiante
       WHERE r.IdEstudiante = @idEstudiante AND d.Proceso_A_I = 1 AND r.HoraEntrada IS NOT NULL AND r.HoraSalida IS NOT NULL
       ) consulta0
       group  by IdEstudiante
       ) consulta1
       ) consulta2

    lunes, 15 de enero de 2018 3:05

  • no te compliques, tu consulta de hora, almacénalo en una vista. Puedes exponer dos campos, hora y el idestudiante al que le pertenece. Seguido a ello, cruzas la primera consulta con la vista que generaste, así obteniendo el campo hora que necesitabas.

    Saludos


    Brayan De la Cruz
    Lima - Perú

    lunes, 15 de enero de 2018 3:26
  • Hola Brayan, gracias por contestar, y no hay forma de poder agregar una columna al datatable antes de asignarlo al datasource del datagridview y ahi llenar la columna HORA.
    lunes, 15 de enero de 2018 3:41
  • Hola

    De haber forma, la hay. Sin embargo para que viajar dos veces a la base de datos, en que se te complica el proceso? lo de la creación de la vista lo decía algo así:

    Create View VistaPrueba
    as
    SELECT idestudiante,CAST(horas AS nvarchar) + '.' + CAST(minutos AS nvarchar) AS HorasAcumuladas
       FROM (SELECT totalminutos/60 horas, totalminutos % 60 minutos
       FROM (SELECT Sum(DifMinutos) totalminutos
       FROM (SELECT r.IdEstudiante ,DATEDIFF (Minute, HoraEntrada, HoraSalida) As DifMinutos
       FROM TbRegistroAsistencia r INNER JOIN TbEstudiantesPasantes e ON r.idEstudiante = e.IdEstudiante
       INNER JOIN TbDatosPasantiaEstudiante d ON e.IdEstudiante = d.IdEstudiante
       WHERE r.IdEstudiante = @idEstudiante AND d.Proceso_A_I = 1 AND r.HoraEntrada IS NOT NULL AND r.HoraSalida IS NOT NULL
       ) consulta0
       group  by IdEstudiante
       ) consulta1
       ) consulta2
    

    Luego, te tocaría cruzar esta vista con la primera consulta:

    SELECT e.IdEstudiante, e.Cedula, e.Nombre, e.Apellido, V.HorasAcumuladas 
    from TbEstudiantesPasantes e 
    INNER JOIN TbDatosPasantiaEstudiante d ON e.IdEstudiante = d.IdEstudiante 
    inner join VistaPrueba V on e.idestudiante = V.idestudiante
    WHERE d.Proceso_A_I = 1 ORDER BY Apellido

    como verás este cruce se da por el idestudiante y lo añades en tu selección (V.HorasAcumuladas), en negrita están los cambios. Como no tengo los datos no puedo probar las consultas, pero es una ayuda que puedo brindarte.

    Saludos


    Brayan De la Cruz
    Lima - Perú

    • Marcado como respuesta JCORBETTO lunes, 15 de enero de 2018 4:33
    lunes, 15 de enero de 2018 3:54
  • Gracias Brayan, le hice unos pequeños cambios a la vista y funcionó perfecto, te agradezco mucho por tu tiempo y paciencia  
    lunes, 15 de enero de 2018 4:34