我們能夠得到觀衆的報告工作,並一直在使用它在生產,過去幾個月沒有任何問題了。
- 我們有一個報告,控制器,列出了指向我們想要的鏈接之一運行
- 點擊將使一個AJAX調用後端和返回部分頁面,在這裏我們可以填寫所有的報告我們需要的參數。
- 參數填寫完成後,我們將表格提交給'\ reports \報告名稱'。
- 早在報告控制器,我們調用SQL,回報我們的數據,然後調用一個名爲「完整報告」不同的看法
- 的「完整報告」僅查看上有一個水晶報表查看器控件它會自動執行報告數據,我們通過ViewData傳遞給它,填充報告,渲染併發送給用戶
一切似乎都很好。
UPDATE
我添加一些代碼和澄清,以我原來上面列出的步驟。我遺漏的關鍵項目是最後一個View有一些代碼,所以它可以與Crystal Reports一起使用。後面的代碼是最小的,但需要。 Crystal Reports的工作,你會用下列文件到結束:
- 在您設計報表
- 持有的Crystal Reports報表控件的aspx文件的佈局file.rpt。這是將有一些代碼隱藏的文件。
詳細瞭解如何創建一個視圖,將使用Crystal Reports:
- 創建一個使用Crystal Reports設計報表的佈局。生成的文件將是一個.rpt文件。爲了這個例子,我們調用這個文件AllJobsSummaryReportLayout.rpt。
- 在設計報表時,對於'數據庫字段',選擇一個業務實體或DTO,其中包含從SQL返回的結果。我們有一個簡單的例子,我們的系統中只包含一些數據傳輸對象(DTO),它們只包含標量值和字符串,但這些DTO中沒有智能。當控制器被調用時,它調用模型,大多數這些報告的模型返回一個DTO列表,然後我們將其傳遞給View以進行渲染。這些DTO不知道如何查詢自己,顯示自己,它們只包含從SQL返回的實際值,然後其他人呈現。
佈局Crystal Report文件一旦完成,AllJobsSummaryReportLayout.rpt,我們設計我們的控制器。在我們採取在運行報表所需的任何參數的控制,調用模型,模型返回我們的DTO的列表,如以下從控制器的片段:
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);
注意幾個項目在這裏,我們正在創建一個可變的「報告」,它是我們上面創建的Crystal Report佈局文件AllJobsSummaryReportLayout.rpt的一種類型。
一旦我們創建我們設置了數據源的值的「報告」變量,我們需要的任何參數,以及高達捆綁項到ViewData的。
現在我們來看看AllJobsSummaryView.aspx。這個文件有一個水晶報表查看器就可以了形式和隱藏文件代碼:
<%@ 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>
而且隱藏文件中的代碼:
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();
}
}
}
的Page_Unload是關鍵,沒有它會導致Crystal Reports產生錯誤「您已超出管理員設置的最大報告數量trator「。
這種方法在生產環境中仍然工作了兩年多。
來源
2009-01-07 17:34:14
ben
更新了VS2010和Crystal Reports 2010:http://stackoverflow.com/questions/3902195/asp-net-mvc-vs2010-crystal-reports-beta-2-cant-print-export-zoom-or-change -pa – ben 2010-10-21 20:59:30
您是否可以預見爲什麼這可能不適用於使用MS reportviewer控件? – stan4th 2009-02-25 11:44:20