Pregunta

Estamos utilizando el marco MVC (versión 5) y el control CrystalReportViewer para mostrar nuestros informes. No puedo hacer funcionar ninguno de los botones en la parte superior del control del visor de informes.

Si estoy trabajando con el informe 'HoursSummary'. Si paso el cursor sobre cualquiera de los botones del visor de informes en IE, el enlace que se muestra en la parte inferior de las páginas es '../HoursSummary'. Esto crea una url de ' http: // localhost / HoursSummary '. No hay un controlador 'HoursSummary', por lo que sigo recibiendo errores 404.

  • Creo que quiero redireccionar a ' http: // localhost / reports / HoursSummary "ya que tengo Un controlador de informes. Si este es el método correcto, ¿alguien sabe qué propiedad debo configurar en el control CrystalReportViewer para que eso suceda?
  • ¿Existe un método más fácil para manejar esta situación?
¿Fue útil?

Solución 2

Pudimos hacer funcionar el visor de informes y lo hemos estado utilizando durante los últimos meses en producción sin ningún problema.

  • Tenemos un controlador de informes que enumera los enlaces a los informes que queremos ejecutar
  • Al hacer clic en uno de los enlaces, se realizará una llamada ajax al back-end y se devolverá una página parcial donde podemos completar todos los parámetros que necesitamos.
  • Luego de completar los parámetros, enviamos el formulario a '\ reports \ Name of Report'.
  • De vuelta en el controlador de informes, llamamos a SQL, devolvemos nuestros datos y luego llamamos a una vista diferente llamada 'Informe completo'
  • La Vista de 'Informe completo' solo tiene un control de visor de informes de cristal en el que toma automáticamente los datos del informe que pasamos a través de ViewData, rellena el informe, lo presenta y lo envía al usuario

Todo parece funcionar muy bien.

ACTUALIZACIÓN

He añadido algunos códigos y aclaraciones a los pasos que enumeré anteriormente. El elemento clave que omití fue que hay un código detrás de la Vista final, por lo que funcionará con Crystal Reports. El código detrás es mínimo, pero necesario. Para que Crystal Reports funcione, terminarás con los siguientes archivos:

  • Un archivo de diseño.rpt donde se diseña el informe
  • Un archivo aspx que contiene el control de informes de Crystal Reports. Este es el archivo que tendrá algún código detrás.

Detalles sobre cómo crear una vista que funcionará con Crystal Reports:

  • Cree el diseño de su informe con el Diseñador de Crystal Reports. El archivo resultante será un archivo .rpt. Por el bien de este ejemplo, llamemos a este archivo AllJobsSummaryReportLayout.rpt.
  • Al diseñar su informe, para los 'Campos de la base de datos' seleccione una de las entidades comerciales o DTO que contiene los resultados que vienen de SQL.
  • Aparte de eso, tenemos algunos objetos de transferencia de datos (DTO) en nuestro sistema que no contienen nada más que valores y cadenas escalables, no hay inteligencia en estos DTO. Cuando se llama al Controlador, llama al Modelo, el Modelo para la mayoría de estos informes devuelve una Lista de DTO que luego pasamos a la Vista que se procesará. Estos DTO no saben cómo consultarse a sí mismos, se muestran a sí mismos, solo contienen valores reales devueltos por SQL que otra persona luego presenta.
  • Una vez que se completa el archivo de Crystal Report de diseño, AllJobsSummaryReportLayout.rpt, diseñamos nuestro Controlador. En el Controlador, tomamos todos los parámetros necesarios para ejecutar el informe, llame al Modelo, el Modelo devuelve nuestra lista de DTO, como se ve en el fragmento a continuación del Controlador:

    var reportViewData = model.AllJobsSummaryQuery(startDate, endDate);
    if (0 != reportViewData.Count())
    {
        var report = new AllJobsSummaryReportLayout();
        report.SetDataSource(reportViewData);
        report.SetParameterValue("startDate", startDate);
        report.SetParameterValue("endDate", endDate);
        ViewData["ReportData"] = report;
        returnView = "AllJobsSummaryView";
    }
    else
        returnView = "noReportView";
    return View(returnView);
    
  • Tenga en cuenta un par de elementos aquí, estamos creando un 'informe' variable que es un tipo de archivo de diseño de Crystal Report, AllJobsSummaryReportLayout.rpt, que creamos anteriormente.

  • Una vez que creamos la variable 'informe', establecemos los valores de la fuente de datos y todos los parámetros que necesitamos, y agrupamos el elemento en el ViewData.

  • Ahora echemos un vistazo a AllJobsSummaryView.aspx. Este archivo tiene un formulario con un Visor de Crystal Reports y un código detrás del archivo:

<%@ Page Title="All Jobs Summary Report" Language="C#" AutoEventWireup="true" CodeBehind="AllJobsSummaryView.aspx.cs" Inherits="V.Views.Reports.AllJobsSummaryView"%>     
<%@ Register Assembly="CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %> 
<form id="form1" runat="server">
<div>
<a href="/Reports" id="Report"><< Return to Report Main
    Page</a><br />
<CR:CrystalReportViewer ID="ReportViewer" runat="server" AutoDataBind="True" EnableDatabaseLogonPrompt="False"
    EnableParameterPrompt="False" HasCrystalLogo="False" DisplayGroupTree="False" 
    HasDrillUpButton="False" HasToggleGroupTreeButton="False" HasViewList="False" 
    HasSearchButton="False" EnableDrillDown="False" EnableViewState="True" 
    Height="50px" ReportSourceID="CrystalReportSource1" Width="350px" />    
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
    <Report FileName="AllJobsSummaryReportLayout.rpt">
    </Report>
</CR:CrystalReportSource>
</div>
</form>
  • Y el código detrás del archivo:

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Web;
     using System.Web.Mvc;
    
     namespace V.Views.Reports
     {
        public partial class AllJobsSummaryView : ViewPage
        {
            protected void Page_Init(object sender, EventArgs e)
            {
                ReportViewer.ReportSource = ViewData["ReportData"];
            }
    
            protected void Page_Unload(object sender, EventArgs e)
            {
                ((AllJobsSummaryReportLayout)ViewData["ReportData"]).Close();
                ((AllJobsSummaryReportLayout)ViewData["ReportData"]).Dispose();
            }
        }
     }
    
  • La descarga de la página es clave. Sin ella, Crystal Reports generará un error. "Ha superado el número máximo de informes establecido por su administrador".

Este método sigue funcionando en un entorno de producción durante más de dos años.

Otros consejos

Si eso es un control de servidor, no funcionará. ASP.NET MVC no utiliza devoluciones de datos, por lo que la mayoría de los controles de servidor de formularios web no funcionan.

Lo que puede hacer es incrustar el visor de informes en un iFrame y mostrarlo en su vista de MVC. El iframe puede apuntar a una página fuera de las cosas de MVC, digamos en una subcarpeta llamada Legacy o algo así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top