Pudimos hacer que el visor de informes funcionara y lo hemos estado usando durante los últimos meses en producción sin ningún problema.
- Tenemos un controlador de informes que las listas de enlaces a los informes que desea ejecutar
- Al hacer clic en uno de los enlaces hará una llamada AJAX a la parte de atrás y devolver una parte de la página donde podemos llenar toda los parámetros que necesitamos
- Después 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 'Informe completo' solo tiene un control de visor de informes de cristal donde toma automáticamente el informar los datos que le pasamos a través de ViewData, rellena el informe, lo renderiza y lo envía al usuario
Todo parece funcionar muy bien.
ACTUALIZACIÓN
he añadido algo de código y la clarificación de los pasos que se enumeran más arriba originalmente. El elemento clave que dejé fue que hay algún código detrás con la Vista final, por lo que funcionará con Crystal Reports. El código detrás es mínimo, pero necesario. Para Crystal Reports para trabajar se va a terminar con los siguientes archivos:
- Un diseño file.rpt donde se diseña el informe
- Un archivo aspx que mantiene el control de Crystal Reports Informe. Este es el archivo que tendrá algún código detrás.
detalles sobre cómo crear una vista que va a trabajar con Crystal Reports:
- crear el diseño del informe mediante 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 provenientes de SQL.
- Dejando a un lado, tenemos algunos objetos de transferencia de datos (DTO) en nuestro sistema que no contienen nada más que valores escalares y cadenas, 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 va a representar. Estos DTO no saben cómo autoexplicarse, mostrarse a sí mismos, solo contienen los valores reales devueltos desde SQL que luego alguien más representa.
Una vez que se completa el archivo del informe de Crystal Reports, AllJobsSummaryReportLayout.rpt, diseñamos nuestro controlador. En el controlador que tomamos en los parámetros necesarios para ejecutar el informe, llame a la Modelo, Modelo vuelve nuestra lista de dtos, como se ve en el siguiente fragmento de código 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);
Nota un par de artículos que aquí, estamos creando un 'informe' variable que es un tipo del archivo de diseño de Informe de Crystal, AllJobsSummaryReportLayout.rpt, que creamos anteriormente.
Una vez que creamos la variable 'informe', establecemos los valores de fuente de datos y cualquier parámetro que necesitemos, y agrupamos el elemento en ViewData.
Ahora echemos un vistazo a AllJobsSummaryView.aspx. Este archivo tiene una forma en él con un visor de Crystal Reports y un código detrás de 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 de 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();
}
}
}
El La carga de página es la clave, sin ella tendrá un error generado por Crystal Reports. Ha excedido el número máximo de informes establecidos por su administrador. trator. '
Este método todavía funciona en un entorno de producción desde hace más de dos años.
Actualizado para VS2010 y Crystal Reports 2010: http://stackoverflow.com/questions/3902195/asp-net-mvc-vs2010-crystal-reports-beta-2-cant-print-export-zoom-or-change -pa – ben
¿Puede prever alguna razón por la cual esto podría no aplicarse al uso del control del visor de informes MS? – stan4th
Probé el visor de informes MS, pero por alguna razón nunca funcionó del todo bien. Sin embargo, también tuve Crystal Reports trabajando en este punto y nunca lo llevé a cabo. – ben