none
Generar reportes en la MVC con CrystalReport RRS feed

  • Pregunta

  • Hola a todos, pues tengo una duda respecto a como generar reportes bajo el MVC de asp.net, ya que he intentado implementar el CrystalReportViewes en un aspx dentro de la carpeta de VIEWS que genera el framework, pero  no se como agregarle los datos a este ReportViewes desde mi controlador.

    Ya que, por ejemplo, en una aplicación con Webforms creaba un aspx y utilizaba su .cs para poder comunicarme con los miembros del aspx y de esa manera mandarle los datos obtenidos de la consulta al CrystalReportViews y ya generar mi reporte. Pero no se como hacer lo mismo en una aplicación MVC. Si alguien pudiera decirme como hacer mi reporte utilizando Crystal Report se los agradecere mucho.

    martes, 15 de junio de 2010 15:26

Respuestas

  • (SOLUCIÓN)

    Bien entiendo que ya esta obsoleto el tema pero yo no encontré solución alguna para ello me la tuve que apañar solo asi que aquí dejo la solución por si a alguien mas le sirve.

    1.-Crea la carpeta Reportes en la raiz de tu proyecto.

    ---[Carpeta de proyecto]

    -------[bin]

    -------[content]

    ------[Reportes]

    -------[etc]

    2.-Ignora el ruteo del mvc para esa carpeta, eso se hace en el archivo Global.asax en el método RegisterRoutes agregando la siguiente linea

      routes.IgnoreRoute("{exclude}/{extnet}/ext.axd");
                routes.IgnoreRoute("Reportes/{resource}.aspx/{*pathInfo}");
                routes.MapRoute(
                    "Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
                );

    4.-Dentro de la carpeta reportes creen sus reportes así como las vistas aspx para llamarlos ejemplo Reporte.aspx.

    5.- desde el mvc tendrán que llamar los reportes dentro de iframes como ../Reportes/Reporte.aspx recuerden que el mvc no afecta el enrutamiento de estas vistas por lo que no podrán utilizar urls amigables haciendo uso del mvc para estos reportes

    6.- Suerte

    • Propuesto como respuesta Marlon Irving lunes, 11 de junio de 2012 3:21
    • Marcado como respuesta Eder Costa jueves, 8 de noviembre de 2012 13:40
    lunes, 2 de abril de 2012 21:00
  • Hola,

    en MVC no puedes utilizar controles de servidor, por lo que lo más probable es que no consigas mucho por esa vía.

    En este hilo de StackOverflow comentan varias posibles soluciones, como crear un directorio independiente e introducir webforms de los de toda la vida con el visor de informes, o generar el informe directamente utilizando los componentes de Crystal y enviarlos al canal de salida, más o menos así:

    using CrystalDecisions.CrystalReports.Engine; 
     
    public ActionResult Report() 
    { 
       
    ReportClass rptH = new ReportClass(); 
        rptH
    .FileName = Server.MapPath("[reportName].rpt"); 
        rptH
    .Load(); 
        rptH
    .SetDataSource([datatable]); 
       
    Stream stream = rptH.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat); 
       
    return File(stream, "application/pdf");    
    } 

    (Referenciando previamente los ensamblados CrystalDecisions.CrystalReports.Engine, CrystalDecisions.ReportSource, y CrystalDecisions.Shared)

    Espero que te sea de ayuda.

    Saludos.


    José M. Aguilar
    Variable not found
    • Propuesto como respuesta eduard tomàsMVP jueves, 13 de octubre de 2011 8:56
    • Marcado como respuesta Eder Costa jueves, 8 de noviembre de 2012 13:40
    miércoles, 16 de junio de 2010 11:09

Todas las respuestas

  • Hola,

    en MVC no puedes utilizar controles de servidor, por lo que lo más probable es que no consigas mucho por esa vía.

    En este hilo de StackOverflow comentan varias posibles soluciones, como crear un directorio independiente e introducir webforms de los de toda la vida con el visor de informes, o generar el informe directamente utilizando los componentes de Crystal y enviarlos al canal de salida, más o menos así:

    using CrystalDecisions.CrystalReports.Engine; 
     
    public ActionResult Report() 
    { 
       
    ReportClass rptH = new ReportClass(); 
        rptH
    .FileName = Server.MapPath("[reportName].rpt"); 
        rptH
    .Load(); 
        rptH
    .SetDataSource([datatable]); 
       
    Stream stream = rptH.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat); 
       
    return File(stream, "application/pdf");    
    } 

    (Referenciando previamente los ensamblados CrystalDecisions.CrystalReports.Engine, CrystalDecisions.ReportSource, y CrystalDecisions.Shared)

    Espero que te sea de ayuda.

    Saludos.


    José M. Aguilar
    Variable not found
    • Propuesto como respuesta eduard tomàsMVP jueves, 13 de octubre de 2011 8:56
    • Marcado como respuesta Eder Costa jueves, 8 de noviembre de 2012 13:40
    miércoles, 16 de junio de 2010 11:09
  • José, muchas gracias por tu respuesta, probaré tu propuesta y veremos que tal va. Gracias
    miércoles, 16 de junio de 2010 22:34
  • Hola Jose, estoy iniciando con esto de mvc, y quisiera saber de que forma puedo establecer mi dataSource del reporte a varios objetos .Net, se que se puede crear un dataset e incluir las propiedades de mi objecto como culumnas de la tabla del DataSet, pero desconoscon si extiste alguna otra forma de establacer multiples objectos como dataSoure, ojala pudieras ayudarme, Saludos!
    martes, 11 de octubre de 2011 17:38
  • (SOLUCIÓN)

    Bien entiendo que ya esta obsoleto el tema pero yo no encontré solución alguna para ello me la tuve que apañar solo asi que aquí dejo la solución por si a alguien mas le sirve.

    1.-Crea la carpeta Reportes en la raiz de tu proyecto.

    ---[Carpeta de proyecto]

    -------[bin]

    -------[content]

    ------[Reportes]

    -------[etc]

    2.-Ignora el ruteo del mvc para esa carpeta, eso se hace en el archivo Global.asax en el método RegisterRoutes agregando la siguiente linea

      routes.IgnoreRoute("{exclude}/{extnet}/ext.axd");
                routes.IgnoreRoute("Reportes/{resource}.aspx/{*pathInfo}");
                routes.MapRoute(
                    "Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
                );

    4.-Dentro de la carpeta reportes creen sus reportes así como las vistas aspx para llamarlos ejemplo Reporte.aspx.

    5.- desde el mvc tendrán que llamar los reportes dentro de iframes como ../Reportes/Reporte.aspx recuerden que el mvc no afecta el enrutamiento de estas vistas por lo que no podrán utilizar urls amigables haciendo uso del mvc para estos reportes

    6.- Suerte

    • Propuesto como respuesta Marlon Irving lunes, 11 de junio de 2012 3:21
    • Marcado como respuesta Eder Costa jueves, 8 de noviembre de 2012 13:40
    lunes, 2 de abril de 2012 21:00
  • Jorge eres lo maximo me sirvio de mucho tu info buscanod por gogle eres el uniko k encontre eso

    gracias man


    DarKgheTTo

    lunes, 11 de junio de 2012 3:21
  • Hola Jorge, tengo problemas con los reportes tambien en mvc, hice el paso num 1 y 2, me puedes explicar el paso 3 por favor y los siguiente si no es mucha molestia  porque ya me desespere con estos reportes. Saludos.

    domingo, 12 de agosto de 2012 2:47
  • Ja no habia visto tu respuesta entieno que ya es tarde una disculpa

    martes, 14 de mayo de 2013 23:43
  • de todas maneras seria bueno saber como para que asi los q lo necesiten sepan como hacerlo. grax

    lunes, 13 de enero de 2014 16:57
  • Pues los pasos asi como estansolo que el 4 es el 3 , estan mal enumerados pero con eso funciona

    lunes, 11 de agosto de 2014 19:27