有没有办法加快水晶报告的产生?

时间:2011-05-25 12:21:53

标签: asp.net crystal-reports

我们正在运行报告Web应用程序,允许用户选择几个字段,并根据所选字段生成晶体报告。为最复杂的报告生成的SQL将返回< 5秒,然而它需要报告和平均3分钟运行,有时更长导致超时。我们正在运行VS2010。报告基本上是开箱即用的,没有真正的操作或计算,只是以一种很好的格式显示数据。有没有什么我们可以尝试加快速度,预加载虚拟报告加载dll,一些黑客让水晶运行得更快,什么?

编辑:添加代码以显示数据绑定

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        string strFile = Server.MapPath(@"AwardStatus.rpt");
        CrystalReportSource1.Report.FileName = strFile;
        DataTable main = Main();
        CrystalReportSource1.ReportDocument.SetDataSource(main);

        CrystalReportViewer1.HasCrystalLogo = false;

        CrystalReportSource1.ReportDocument.ExportToHttpResponse(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, Response, false, "pmperformance");

    }
}

private DataTable Main()
{
    Guid guidOffice = Office;
    CMS.Model.ReportsTableAdapters.ViewACTableAdapter rptAdapter = new CMS.Model.ReportsTableAdapters.ViewACTableAdapter();

    Reports.ViewAwardedContractsDataTable main = new Reports.ViewAwardedContractsDataTable();

    if (Office == new Guid())
    {
        IEnumerable<DataRow> data = rptAdapter.GetData().Where(d => UserPermissions.HasAccessToOrg(d.guidFromId, AuthenticatedUser.PersonID)).Select(d => d);
        foreach (var row in data)
        {
            main.ImportRow(row);
        }
    }
    else if (guidOffice != new Guid())
    {
        main = rptAdapter.GetDataByOffice(guidOffice);
    }
    else
    {
        main = new Reports.ViewACDataTable();
    }


    return main;
}

private Guid Office
{
    get
    {
        string strOffice = Request.QueryString["Office"];
        Guid guidOffice = BaseControl.ParseGuid(strOffice);

        if (!UserPermissions.HasAccessToOrg(guidOffice, AuthenticatedUser.PersonID))
        {
            return Guid.Empty;
        }
        else
        {

            return guidOffice;
        }
    }
}



protected void CrystalReportSource1_DataBinding(object sender, EventArgs e)
{
   //TODO
}

3 个答案:

答案 0 :(得分:2)

这可能有点轻率,但可能考虑不使用水晶报告......我们最近遇到了一些麻烦(内存错误是一个),我们已经转移到其他选项并且是很开心......

答案 1 :(得分:0)

这就是我要做的事情:

从用户获得字段选择时开始计时,一直到显示报告时。查看处理时间的上升位置。

当您查看时钟时,可能会出现各种情况:

  1. 如果Crystal Reports需要时间来填写报告,请检查您是如何填写报告的。如果您将报告字段直接链接到数据表,CR可能会花时间查找数据。我建议使用动态列(Field1,Field2,.. FieldN)创建一个新表(t_rpt),并将报表模板指向该表。我不知道你是否已经这样做了。

  2. 如果您花时间查找数据本身,我建议创建一个表格视图。即使内存耗尽,这也会使您的查询变得快速,并且您可以在完成后删除视图。

  3. 如果不是上述情况,请告诉我们您的时钟节目。

答案 2 :(得分:0)

在加载任何大量数据方面,您总是希望使用存储过程。

除此之外,您将在第一次加载Crystal DLL时看到运行报告的延迟。是的,你可以像你提到的那样预加载它们,这对一些人有帮助。