Crystal Report开发报表

3059人阅读 评论(1) 收藏 举报
    最近研究了Crystal Report的报表开发,感觉非常好用。特将开发要点小结如下:
    一、Crystal Report的几个重要组件
    1、Crystal Report Designer
         Crystal Report之所以“可见即所得”就是靠这个组件,Crystal Report Designer用于编辑.rpt报表文件。
    2、Crystal Report Viewer
        将Crystal Report Designer设计的报表展示在Web页面或Windows Form 上就是用到这个组件。
    3、Crystal Report Engine
         Crystal Report Engine允许开发人员在运行阶段对报表的结构与内容进行完整的控制,但是 Crystal Report Engine必须和Crystal Report Viewer一同使用。
    
   二、理解报表节(Report Section)
    1、报表页眉节
    报表页眉节中的数据在整份报表中只出现一次,而且只会显示在第一页的上方。  
    2、页眉节
    页眉节中的数据会固定显示在每一页的顶端。
    3、详细资料节
    显示报表实际信息,如果绑定的数据库表(DataSet)有多个记录,则这些记录都将显示在详细资料节中。
    4、报表页脚节
     报表页眉节中的数据在整份报表中只出现一次,而且只会显示在最后一页之详细资料节中最后一个数据记录的下方。
    5、页脚节
   页脚节中的数据会固定显示在每一页的尾端。
 
   三、水晶报表的执行模式
   1、Pull模式
   被请求时生成报表时,驱动程序自动连接数据库,并视需要提取数据。一般,简单的报表用Pull模式就可以了。
   2、Push模式
   使用Push模式,开发人员必须自行编写代码来连接数据库,运行SQL命令来创建DataSet,并将DataSet传递给报表。Push模式比较灵活,并且效率高。
 
   四、使用Push模式
   1、设计一个DataSet
   (1)“解决方案浏览器”,选择“添加”--“添加新项”--“数据集(DataSet)”--"命名为DSCustomer";
   (2)从“服务器资源管理器”中的SQL Server中拖放一个数据表到DataSet(如CustomerList表),此时在DataSet中就会有一个CustomerList表的结构图,保存DataSet(这步不能忘)。(当然一个DataSet中可以有多个数据表)
   2、创建.rpt文件
   (3)“解决方案浏览器”,选择“添加”--“添加新项”--“Crystal Report“;
   (4)建立.rpt文件之后,右击报表设计界面的空白处--"添加/删除数据库";
 (5)在"数据库专家"窗口中,展开"项目数据"-"展开ADO.NET数据集"--"DSCustomer(DataSet)"--"选择CustomerList表";
   (6)将"CustomerList"表填加到"选定的表中",点击"确定";
 (7)设计报表界面,这时可以在界面中拖放CustomerList表中的字段;
 3、建立一个Crystal Report Viewer控件,编写后台代码
 (8)在.aspx页面上建立一个Crystal Report Viewer,根据需要设置其属性;
 (9)在代码中访问数据库并把数据填充到DataSet;
  private void BindReport()
  {
   RptRenderContract ReportDoc = new RptRenderContract();//.rpt文件对应的类
   SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["connStr"]);
   DsCustomer ds = new DsCustomer();                             //创建DataSet对象ds
   string strSelect = "SELECT * FROM CustomerList ;
   SqlDataAdapter dadCustomer = new SqlDataAdapter(strSelect,conn);
   dadRender.Fill(ds,"CustomerList");                                  //向ds填充CustomerList表        
   ReportDoc.SetDataSource(ds);                                      //设置.rpt文件对应类的数据源
   CRVContract.ReportSource = ReportDoc;       //设置Crystal Report Viewer的报表源
  }
 (10)在Page_Load方法中使用BindReport()函数。
 
 五、Crystal Report的使用技巧
 1、使用公式字段
 Crystal Report的的公式编辑器,允许开发人员用Basic语法和Crystal(类Pascal)语法来编辑公式字段。Example,如下:
  Dim strCpuType As String
   Select Case {CpuLeaseList.CpuType}
    Case 1
        strCpuType = "惠普CPU"
    Case 2
        strCpuType = "曙光CPU"
    Case 3
        strCpuType = "苹果CPU"
   End Select  
  formula = strCpuType
   有点遗憾的是Crystal Report的公式编辑器没有提供函数的帮助说明,有些函数的用法需要猜了。比如获取日期字段中月份的公式为:
      formula = Month({CpuLeaseList.LeaseStartTime})
   总之,要开发出满足客户需求的复杂报表,必须熟练使用公式字段。
 
   2、数据的排序
   数据排序可以利用两种方式。
  方式1--用SQL语句先排序,然后把排序好的数据绑定到报表。
  方式2--利用Crystal Report的排序功能。右击报表设计界面的空白处--“报表”--“排序记录”--根据需要设置排序字段。
 
   3、分组报表数据
   个人认为,Crystal Report的分组报表的功能非常强大,内置了功能强大的根据字段分组的功能,这个功能非常好用,如果仅仅用SQL 语句的Group BY 有些功能是不能实现的。比如如下SQL 语句:
SELECT DateName(mm, LeaseStartTime) AS [Month], sum(datediff(hh,LeaseStartTime,LeaseEndTime)) AS [Hour] FROM CpuLeaseList where LeaseStartTime  
   BETWEEN '2006-1-1' AND '2006-12-31'
       GROUP BY DateName(mm,LeaseStartTime)
    SELECT 所能筛选出来的字段只能是和和 GROUP BY 跟这的相同字段或聚合函数运算的字段,但这个问题在Crystal Report分组报表中却很容易解决。
 
   4、使用图表和交叉表
   快速创建图表和交叉表也是Crystal Report的一大优点,只要在适当的节(sector)中插入图表或交叉表,然后设置一些要显示的字段就OK了。
 
   5、报表的导出和打印
   将报表集成在Web应用程序中,需要自己编写代码实现报表的导出和打印(报表在Windows应用中已经集成了导出和打印的功能).不过据说,在Visual studio 2005中Crystal report在Web中的应用也集成了导出和打印功能.
   遗憾的是,Visual studio2003下面用代码实现导出和打印时,Crystal Report不是很稳定,有时会出现莫名其妙的运行时错误: ( 这个问题让我郁闷了好多天)
   异常详细信息: CrystalDecisions.CrystalReports.Engine.LogOnException: 登录失败。
   报表的导出需要注意的是:1)必须设置导出目录相应的安全权限,否则是无法往本地计算机的磁盘上写文件的.   2)如果要实现打印和导出时,每次Page_Load()必须要绑定DataSet上的数据到报表上去.(这一点要非常注意!)
   导出代码如下:
     private void btnExport_Click(object sender, System.EventArgs e)
   {
        CrystalDecisions.Shared.DiskFileDestinationOptions DiskOpts = new  CrystalDecisions. Shared. DiskFileDestinationOptions();
   ReportDoc.ExportOptions.ExportDestinationType =  CrystalDecisions. Shared.ExportDestinationType.DiskFile;
      switch (ddlFormat.SelectedItem.Text)
     {
          case "Rich Text (RTF)":
       ReportDoc.ExportOptions.ExportFormatType =        CrystalDecisions.Shared.ExportFormatType.RichText;//
       DiskOpts.DiskFileName = "D://Output.rtf";
         break;

          case "Portable Document (PDF)":
       ReportDoc.ExportOptions.ExportFormatType =   CrystalDecisions.Shared.ExportFormatType.PortableDocFormat;//
       DiskOpts.DiskFileName = "D://Output.pdf";
          break;

          case "MS Word (DOC)":
       ReportDoc.ExportOptions.ExportFormatType =   CrystalDecisions.Shared.ExportFormatType.WordForWindows;//
       DiskOpts.DiskFileName = "D://Output.doc";
         break;

          case "MS Excel (XLS)":
       ReportDoc.ExportOptions.ExportFormatType =   CrystalDecisions.Shared.ExportFormatType.Excel;//
       DiskOpts.DiskFileName = "D://Output.xls";
         break;

        default:
        break;
   }
      ReportDoc.ExportOptions.DestinationOptions = DiskOpts;
    ReportDoc.Export(); 
  }

   
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:575214次
    • 积分:7056
    • 等级:
    • 排名:第3210名
    • 原创:44篇
    • 转载:298篇
    • 译文:0篇
    • 评论:413条
    最新评论