有什么方法可以加快水晶报表的生成?

问题描述

| 我们正在运行一个报告Web应用程序,该应用程序允许用户选择一些字段,并根据所选字段生成水晶报表。为最复杂的报告生成sql将在不到5秒的时间内返回数​​据,但是运行该报告平均需要3分钟,有时会更长,从而导致超时。我们正在运行VS2010。这些报告基本上是开箱即用的,不需要进行任何实际的操作或计算,而只是以一种很好的格式显示数据。有什么我们可以尝试加快速度的方法预加载虚拟报告以加载dll,是否可以使Crystal更快运行的一些技巧? 编辑:添加代码显示数据绑定
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
}
    

解决方法

这可能有点轻率,但可能考虑不使用Crystal Reports ...最近我们在使用它们时遇到了很多麻烦(内存错误为其中之一),我们已经转而使用其他选项,对此我们感到非常高兴...     ,这是我要做的: 从您从用户那里获得字段选择的时间开始一直放置时钟,直到显示报告为止。查看处理时间在哪里增加。 当您查看时钟时,可能会出现各种情况: 如果Crystal Reports需要时间来填充报表,请检查您的填充方式。如果要将报表字段直接链接到数据表,CR可能会花一些时间查找数据。我建议使用动态列(Field1,Field2,.. FieldN)创建一个新表(t_rpt),并将您的报告模板指向该表。我不知道您是否已经在这样做。 如果您花时间查找数据本身,建议您创建表视图。即使占用了存储空间,也可以使查找快速,完成后就可以删除视图。 如果以上都不是,请告诉我们您的时钟显示什么。     ,在加载大量数据方面,您将始终希望使用存储过程。 除此之外,您将在第一次加载Crystal DLL时看到报表运行延迟。是的,您可以如前所述预加载它们,这将对您有所帮助。