none
Llenar datagrid con dos tablas relacionadas en SQL Server?

    Question

  • Hola, estoy elaborando un sistema de asistencia y he creado un datagrid con los siguientes campos:

    Fecha, Apellidos, Nombres, Ingreso, Salida, Horas Trabajadas

    Para esto, tengo dos tablas en mi BD:

    - Trabajadores: con los campos id_trab (PK), ape_trab, nom_trab

    - Registro_Asistencia: con los campos fecha, id_trab (FK), ingreso, salida, total_horas

    ¿Cómo lleno el datagrid?

    Muchas gracias.


    • Edited by xstevensx Monday, May 14, 2012 10:06 PM
    Monday, May 14, 2012 10:05 PM

Answers

  • No, no es la única opción. También puedes crear objetos al vuelo mediante linq.  No estoy muy seguro de la sintaxis, por eso le preguntaba a Leandro, pero sería algo así:

    var list = from trabajador in Trabajadores
    from asistencia in trabajador.Asistencias
    where 
    asistencia.fecha >= fechaDesde && 
    asistencia.fecha <= fechaHasta
    select new { Nombre = trabajador.Nombre, Apellido = trabajador.Apellido, Fecha = asistencia.fecha, Horas = asistencia.TotalHoras };
    

    Perdona que no sea más preciso, me falta práctica con linq :-D


    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    Wednesday, May 16, 2012 3:28 PM

All replies

  • si las tablas se relacionan podrias usar un INNER JOIN

    SELECT T.id_trab, T.ape_trab, T.nom_trab, A.fecha, A.ingreso, A.salida, A.total_horas

    FROM Trabajdores T INNER JOIN Asistencias A ON T.id_trab = A.id_trab

    como veras relaiconas la tablas

    pero ojo esto generar registro con informacion duplciando el nombre del trabjador si tiene mas de un registro en la de asistencias

    el grid no puede mostrar jerarquia de datos, sino deberias suar un combo que liste los trabjadores y al seleccionar uno cargue en el grid las asistencias ,esa es otro forma valida de lograrlo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Proposed as answer by Cristian Pérez Tuesday, May 15, 2012 1:48 PM
    • Unproposed as answer by xstevensx Wednesday, May 16, 2012 1:47 PM
    Tuesday, May 15, 2012 12:06 AM
  • Hola Leandro, olvidé decir que tengo 2 clases en mi código: Trabajador y Registro_Asistencia

    Lo que hago es obtener un List<Trabajador> y un List<Registro_Asistencia> con sus datos, pero no sé cómo relacionarlos para colocarlos en un datagrid. Lo que he estado pensando es obtener los datos en DataTable y asignar datagrid.source=Dataset, pero no estoy seguro cómo hacerlos.

    Y lo de datos duplicados no hay problema, puesto el datagrid mostrará los datos de la fecha actual y las consultas van con un where fecha=DateTime.Today.Date


    • Edited by xstevensx Wednesday, May 16, 2012 1:49 PM
    Wednesday, May 16, 2012 1:46 PM
  • hola

    no defines la clase de esta forma

    public class Trabajador{

       public int id {get; set;}

       public string nombre {get; set;}

       public List<Registro_Asistencia> Asistencias {get; set;}

    }

    o sea para cargar las asistencias de cada trabjador, y no como listas separadas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Wednesday, May 16, 2012 2:02 PM
  • Nunca se me ocurrió algo así jaj, es bien útil. Pero el problema es que no voy a mostrar los registros por trabajador si no que en una determinada fecha, 16/05/2012 por ejemplo, me mostrará un registro por trabajador.
    • Edited by xstevensx Wednesday, May 16, 2012 2:12 PM
    Wednesday, May 16, 2012 2:12 PM
  • Leandro: ¿Cómo quedaría la sentencia linq usando el patrón Agregación que tú propones? Al final lo que él necesita mostrar es una lista con miembros de las dos clases. ¿Tú recomendarías usar una clase Decorador que tenga los miembros de ambas clases que se desea mostrar; o más bien crear el objeto de tipo sin nombre al vuelo en el propio linq?

    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    Wednesday, May 16, 2012 2:27 PM
  • mm creo que mi única alternativa sería crear una nueva clase con atributos iguales a los campos del datagrid y hacerle un List<>, pero como que no me gusta la idea. ¿Qué mas podría hacer?
    Wednesday, May 16, 2012 3:15 PM
  • No, no es la única opción. También puedes crear objetos al vuelo mediante linq.  No estoy muy seguro de la sintaxis, por eso le preguntaba a Leandro, pero sería algo así:

    var list = from trabajador in Trabajadores
    from asistencia in trabajador.Asistencias
    where 
    asistencia.fecha >= fechaDesde && 
    asistencia.fecha <= fechaHasta
    select new { Nombre = trabajador.Nombre, Apellido = trabajador.Apellido, Fecha = asistencia.fecha, Horas = asistencia.TotalHoras };
    

    Perdona que no sea más preciso, me falta práctica con linq :-D


    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    Wednesday, May 16, 2012 3:28 PM
  • Dímelo a mi que nunca he usado linq to sql, voy a leer sobre el tema para ver si tu código de ejemplo pueda ayudarme en el caso. Gracias.
    Wednesday, May 16, 2012 4:36 PM