none
¿Se puede unir dos clase de objetos para generar un reporte en reportviewer c#? RRS feed

  • Pregunta

  • Buenas tardes, escribo en esta oportunidad porque estoy generando un reporte con reportviewer usando objetos de clases pero tengo un problema, en el procedimiento que hice tengo un 4 campos que se utilizan en otra clase, ejemplo:

    Capa datos:

    DRequerimiento:
    Idrequerimiento
    Codigorequerimiento
    Detalle
    Iddepartamento
    IdSolicitud
    
    DDepartamento:
    Iddepartamento
    NombreDepartamento
    Created_at
    
    DSolicitud:
    IdSolicitud
    NombreSolicitud
    Created_at 
    

    Al generar mi reporte necesito pasarle a la tabla el nombre del departamento y el de la solicitud pero como no están en la clase DRequerimiento no lo visualizo, como se podría hacer en ese caso?


    martes, 30 de octubre de 2018 19:10

Todas las respuestas

  • hola teresa

    Claro que si se pueden unir

    puedes usar linq

    var unirObj  = from DSolicitud in mapaDatos 
                     join req in reasons on DSolicitud.Id equals req.IdSolicitud 
                     select new { DSolicitud, DRequerimiento };
    aunque veo que son 3?
    martes, 30 de octubre de 2018 19:21
  • Sii son 3 entidades, el sql solo lo utilizo en el procedimiento almacenado, mi proyecto lo estoy desarrollando en 3 capas, en la capa datos es donde defino los campos que va tener cada entidad, por eso es que en requerimiento no me aparece el nombre de departamento ni de solicitud, pero quisiera que se pudiera ver
    martes, 30 de octubre de 2018 19:24
  • hola 

    este es un ejemplo que utiliza se parece a lo que estas buscando:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        public class Product
        {
            public class ProductData
            {
                public string PropertyName { get; set; }
                public string Description { get; set; }
                public string Value01 { get; set; }
                public string Value02 { get; set; }
                public string Value03 { get; set; }
            }
    
            public class ProductJoin
            {
                public string PropertyName { get; set; }
                public string Category { get; set; }
                public DateTime ProductDate { get; set; }
            }
    
            public class ProductRepo
            {
                public string PropertyName { get; set; }
                public string Description { get; set; }
                public string Category { get; set; }
            }
    
            public Product()
            {
                List<ProductData> productData = new List<ProductData>();
                productData.Add(new ProductData { PropertyName = "Property 001", Description = "Property 001 Desc", Value01 = "Value01", Value02 = "Value02", Value03 = "Value03" });
                productData.Add(new ProductData { PropertyName = "Property 002", Description = "Property 002 Desc", Value01 = "Value04", Value02 = "Value08", Value03 = "Value12" });
                productData.Add(new ProductData { PropertyName = "Property 003", Description = "Property 003 Desc", Value01 = "Value05", Value02 = "Value09", Value03 = "Value13" });
                productData.Add(new ProductData { PropertyName = "Property 004", Description = "Property 004 Desc", Value01 = "Value06", Value02 = "Value10", Value03 = "Value14" });
                productData.Add(new ProductData { PropertyName = "Property 005", Description = "Property 005 Desc", Value01 = "Value07", Value02 = "Value11", Value03 = "Value15" });
    
                List<ProductJoin> productJoin = new List<ProductJoin>();
                productJoin.Add(new ProductJoin { PropertyName = "Property 001", Category = "Category01", ProductDate = Convert.ToDateTime("3/20/2017")});
                productJoin.Add(new ProductJoin { PropertyName = "Property 001", Category = "Category02", ProductDate = Convert.ToDateTime("3/23/2017") });
                productJoin.Add(new ProductJoin { PropertyName = "Property 002", Category = "Category03", ProductDate = Convert.ToDateTime("3/19/2017") });
                productJoin.Add(new ProductJoin { PropertyName = "Property 002", Category = "Category04", ProductDate = Convert.ToDateTime("3/22/2017") });
    
                List<ProductRepo> results = TestProductRepo(productData, productJoin);
            }
    
            private List<ProductRepo> TestProductRepo(List<ProductData> productData, List<ProductJoin> productJoin)
            {
    
                List<ProductRepo> productRepo = (from x in productData
                                                 join y in productJoin 
                                                 on x.PropertyName equals y.PropertyName into pn
                                                 from y in pn.FirstOrDefault()
                                                 //orderby y.ProducDate
                                                 select new ProductRepo()
                                                 {
                                                    PropertyName = x.PropertyName,
                                                    Description = x.Description
                                                    Category = y.Category
                                                 }).ToList();
    
                return productRepo;
            }
        }
    }

    lo encontré en esta pagina unir 2 objetos con linq si quieres ver el nombre de departamento en el select new puedes colocar los campos que necesites, (como una consulta SQL) y el método te devuelve un list<> que puedes utilizar en el report

    martes, 30 de octubre de 2018 19:52
  • Para mi, lo más práctico es crear una clase que muestre todas las propiedades que necesitas en el informe. En el constructor de esa clase le pasas los dos o tres objetos cuyas propiedades queres mostrar. 

    A esta clase la podes usar para definir el origen de datos del reporte. Algo Así sería:

    public class Informe
      {
        public Informe(DRequerimiento Requerimiento, DDepartamento Departamento, DSolicitud Solicitud)
        {
          R = Requerimiento;
          D = Departamento;
          S = Solicitud;
        }
    
        private DRequerimiento R;
        private DDepartamento D;
        private DSolicitud S;
    
        public int Idrequerimiento { get { return R.Iddepartamento; } }
        public int Codigorequerimiento { get { return R.Codigorequerimiento;} }
        public String Detalle { get { return R.Detalle; } }
        public int Iddepartamento { get {return D.Iddepartamento; } }
        public String NombreDepartamento { get {return D.NombreDepartamento; } }
        public String Created_at_Dto { get { return D.Created_at; } }
        public int IdSolicitud { get { return S.IdSolicitud; } }
        public String NombreSolicitud { get { return S.NombreSolicitud; } }
        public String Created_at_Solicitud { get { return S.Created_at; } }
      }

    Por supuesto que tendrás que crear una lista con objetos de tipo Informe y asignarle al DataSources del reporte. La lista es así:

    List<Informe> Datos = new List<Informe>();

    Luego va el codigo para cargar la lista "Datos".


    • Editado AntiWork miércoles, 31 de octubre de 2018 11:22
    • Propuesto como respuesta Pablo RubioModerator viernes, 2 de noviembre de 2018 22:12
    miércoles, 31 de octubre de 2018 11:14