Push模式下水晶报表的若干问题


 
最近在使用水晶报表来制作报表,在制作的过程中使用Push模式来完成,遇到了一些问题,和大家共享一下。

简介:首先介绍一下水晶报表的基本概念。

Crystal Reports是世界领先的桌面及 Web 报表工具,可用于处理数据库,帮助用户分析和解释重要信息。使用 Crystal Reports 可以方便地创建简单报表,同时它也提供了创建复杂或专用的报表所需的整套工具。

Crystal Reports 几乎可以从任何数据源生成您需要的报表。内置报表专家在您生成报表和完成一般的报表任务过程中,会一步一步地指导您进行操作。报表专家通过公式、交叉表、子报表和设置条件格式帮助表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字确实不够充分,则用地理地图和图形进行形象的信息交流。

Crystal Reports 的灵活性并未停留在创建报表这一功能上,您可以用各种各样的格式发布报表,包括用 Microsoft 的 Word 和 Excel 发布、通过电子邮件甚至 Web 发布。高级的 Web 报表功能允许工作组中的其他成员在他们自己的 Web 浏览器中查看或更新共享报表。

通过将 Crystal Reports 的报表处理功能整合到自己的数据库应用程序中,应用程序和 Web 开发人员可以节省开发时间并满足用户的需求。Crystal Reports 支持大多数流行的开发语言,可以方便地在任何应用程序中添加报表。

模式

拉模式(PULL):在拉模型中,驱动程序将连接到数据库并根据需要将数据“拉”进来。使用这种模型时,与数据库的连接和为了获取数据而执行的 SQL 命令都同时由 Crystal Reports 本身处理,不需要开发人员编写代码。如果在运行时无须编写任何特殊代码,则使用拉模型。

推模式(PUSH):推模型需要开发人员编写代码以连接到数据库,执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中,并在 Crystal Reports 收到数据之前先将数据筛选出来。在些这种情况下,通过使用连接共享以及限制记录集合的大小,可以使用报表性能最大化。

本人制作水晶报表的步骤如下:

1.  制作与报表相符合的xsd文件;

2.       新建一个水晶报表文件,在该报表中通过以下步骤来添加数据集的定义:数据库专家->创建新连接->数据库文件->选择第一步制作的xsd文件->添加xsd文件中的数据库名称;

3.       定义参数字段和计算字段,对报表的内容进行排版;

4.       新建一个WebForm,在WebForm中放置一个CrystalReportViewer控件,并设置该控件的属性,例如本人的设置如下:

<CR:CrystalReportViewer ID="repView" runat="server" AutoDataBind="true"

            DisplayGroupTree="False" EnableDatabaseLogonPrompt="False"

            EnableParameterPrompt="False" HasCrystalLogo="False"

            HasDrillUpButton="False" HasGotoPageButton="False" HasRefreshButton="True"

            HasSearchButton="False" HasToggleGroupTreeButton="False" HasViewList="False"

            HasZoomFactorList="False" onreportrefresh="repView_ReportRefresh"

            ReuseParameterValuesOnRefresh="True" />

5.       在其它的页面中设置报表的条件,通过Cookies将这些条件传递到报表预览页面,并打开报表预览页面;

6.       在报表预览界面中获取Cookies中的参数值,根据参数值生成相应的数据集(DataTable),并对数据集中的数据进行处理;

7.       加载相应的报表文件,将数据集与报表绑定,传递参数信息,预览报表文件,代码如下所示:

//设置报表信息并预览

        documentInfor.Load(strReportPath);

        documentInfor.SetDataSource(searchResult);

        documentInfor.SetParameterValue("StartDate", beginDate.ToString("yyyy-MM-dd"));

        documentInfor.SetParameterValue("EndDate", endDate.ToString("yyyy-MM-dd"));

        documentInfor.SetParameterValue("StartReserID", beginReserID);

        documentInfor.SetParameterValue("EndReserID", endReserID);

        repView.ReportSource = documentInfor;

在页面加载部分的代码如下:

if (!IsPostBack)

        {

            if (!CreateReport()) Response.Write("报表预览失败!");

}

在执行时,第一次显示的报表内容是正确的,但是进行任何工具栏上的操作之后,总是显示输入参数值的窗口,为了将该窗口去除,设置EnableParameterPrompt="False"和ReuseParameterValuesOnRefresh="True",此时要求输入参数信息的窗口不出现了,但是页面直接显示缺少参数值,对程序进行分析和跟踪后发现,原来在点击水晶报表的工具栏时,页面要进行刷新,刷新时报表中原有的信息都将丢失,包括参数信息和数据集信息,而代码中的页面加载代码中没有对这部份内容进行处理,所以需要对页面加载部分的内容进行修改,修改后的代码如下:

if (!IsPostBack)

        {

            if (!CreateReport()) Response.Write("报表预览失败!");

        }

        else

        {

            SetReportInfor();//设置报表信息并预览

    }

由于刷新时不需要重新查询数据库,所以将相关的数据集变量和参数变量定义为全局私有变量,在第一次生成报表时对这些变量进行赋值,在刷新时直接使用即可。

在刚开始定义时直接定位为普通私有变量,结果发现在刷新时,这些变量的值都已经丢失,必须使用Sessions或者Viewstate进行缓存才可以,不但影响传输量还会增加代码量,如果将这些变量定义为static变量,则不会存在这个问题,原来设置的信息会存在,不会丢失。

CrystalReportViewer控件提供的事件中包括工具栏上的一些按钮点击后触发的事件,包括Navigate,Refresh,Search,Zoom等,我们可以在这些事件中对工具栏上的按钮功能进行定义,例如可以重新定义刷新按钮的功能,但是相应地,这些按钮点击后还是会执行页面的刷新操作。

水晶报表的打印操作是将报表的信息输出到PDF文件中或者Activex中进行打印的,而输出时可以选择多种文件格式,例如pdf,doc,excel,rpt,rtf等。

本人所使用的开发工具为vs2008,水晶报表为系统自带的版本。

 

发布了43 篇原创文章 · 获赞 0 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章