概念部分
(1).什么是报表?
用表格、图表等来展示动态的数据。报表=多言的格式+动态的数据
(2).什么是水晶报表(Crystal Reports)?
是的一系列报表应用组件。
有什么样的数据库访问模式?
1.使用ODBC的驱动程序的数据库
2.使用OLE DB驱动程序的数据库
3.Access或Excel
水晶报表的使用
(1).水晶报表下载安装(针对vs,针对旧版本的一搜一大把):
http://124.205.69.162/files/50470000052E741A//akdlm/cr4vs/CRforVS_13_0_18.exe
(2). VS安装了水晶报表没反应怎么办?
解决方案:/topics/391017532
你试试到工具--》选择工具箱项,在.NET Framework列表里,找到CrystalReports,前面打钩-确定
水晶报表菜单问题OK了,但使用报表组件,网页加载时又报如下错了怎么办?
报错:0x800a1391 - JavaScript运行时报错:"bobj"未定义
解决方案:/muzinian/p/4721690.html
按这个步骤走完,并且每个用报表组件的.aspx引用crv.js脚本,就OK了
(3).报表的访问模式:
提取模式:驱动程序自己去连接数据库,即在.aspx页面创建报表组件指定报表文件作为数据源
推入模式:代码关联指定报表数据源
(4).水晶报表组件用法:
1.先创建一个空的Web窗体;
2.然后创建一个水晶报表文件,Web窗体关联引用这个文件:
如下是水晶报表的使用过程:
、
但是创建窗体和报表并不等于百分百能用,我用VS网页加载时就抛出了"bobj"未定义那个报错,因此除了gif里的.aspx配置,还要耐心的看"3"。
3.最后,检查修改Web.config配置文件:
黄色部分都是使用完整水晶报表的配置必要项,不过大部分都会在使用报表向导创建报表的过程中自动生成,如下只有蓝色区域是我新添加的。
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="businessObjects">
<sectionGroup name="crystalReports">
<section name="rptBuildProvider" type="CrystalDecisions.Shared.RptBuildProviderHandler, CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, Custom=null"/>
<section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler"></section>
</sectionGroup>
</sectionGroup>
</configSections>
<connectionStrings>
<add name="WindowsFormsApplication1.Properties.Settings.NorthwindConnectionString"
connectionString="Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=abc123..."
providerName="System.Data.SqlClient"/>
<add name="ConnectionString" connectionString="Provider=SQLOLEDB.1;Data Source=STEPHANIE;Persist Security Info=True;User ID=sa;Initial Catalog=MyDB" providerName="System.Data.OleDb"/>
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.5">
<assemblies>
<add assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304" />
<add assembly="CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304" />
<add assembly="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304" />
<add assembly="CrystalDecisions.ReportSource, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304" />
<add assembly="CrystalDecisions.ReportAppServer.Controllers, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304" />
<add assembly="CrystalDecisions.ReportAppServer.DataDefModel, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304" />
<add assembly="CrystalDecisions.CrystalReports.Engine, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304" />
<add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" />
<add assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845DCD8080CC91" />
<add assembly="mon, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845DCD8080CC91" />
<add assembly="Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
</assemblies>
<buildProviders>
<add extension=".rpt" type="pilation.RptBuildProvider, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" />
<add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</buildProviders>
</compilation>
<httpRuntime targetFramework="4.5"/>
<httpHandlers>
<add path="CrystalImageHandler.aspx" verb="GET" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" />
<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutrsyal, PublicKeyToken=89845dcd8080cc91"
validate="false" />
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<add name="CrystalImageHandler.aspx_GET" verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" preCondition="integratedMode"/>
</handlers>
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="WebForms"/>
<!--数据库自定义配置参数-->
<add key="ConnectionSetting" value="Server=.;UID=sa;PWD=********;DataBase=MyDB"/>
</appSettings>
<businessObjects>
<crystalReports>
<rptBuildProvider>
<add embedRptInResource="true"/>
</rptBuildProvider>
<crystalReportViewer>
<add key="ResourceUri" value="/aspnet_client/system_web/4_0_30319/crystalreportviewers13"/>
</crystalReportViewer>
</crystalReports>
</businessObjects>
</configuration>
4.除了使用组件直接关联指定报表文件展示数据外,还可以代码关联报表组件数据源,即推入模式访问报表:
如下新建一个Web窗体ReportPrintDemo1.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ReportPrintDemo1.aspx.cs" Inherits="Report_ReportPrintDemo1" %>
<%@ Register assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" namespace="CrystalDecisions.Web" tagprefix="CR" %>
<%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %>
<!DOCTYPE html>
<html xmlns="/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<!--使用水晶报表时 添加文crv文件引用,否则报bobj空对象-->
<script src='<%=ResolveUrl("~/crystalreportviewers13/js/crviewer/crv.js")%>'type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<!--添加一个空的报表组件,代码中去关联铺页面-->
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" OnInit="CrystalReportViewer1_Init" />
</form>
</body>
</html>
其中黄色部分加粗并圈黄的是新加的部分。类型为CrystalReportViewer的组件在工具箱拖过来的如图:
然后去页面ReportPrintDemo1.aspx的对应逻辑类ReportPrintDemo1.aspx.cs编写报表数据源的绑定,其中以下紫色圈起来的部分比较重要。实现了加载我们刚刚建好的报表文件并将查询结果填到报表文件。最后将界面报表组件和报表数据关联起来。完整代码如下:
using System;
using System.Configuration;
using System.Data.SqlClient;
using CrystalDecisions.CrystalReports.Engine;//ReportDocument的命名空间
//备注:通过代码的方式关联报表数据源
public partial class Report_ReportPrintDemo1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//使用CrystalReportDemo.rpt报表文件将表查询结果铺到CrystalReportViewer1空间上
string connstr = ConfigurationManager.AppSettings["ConnectionSetting"].ToString();
SqlConnection conn = new SqlConnection(connstr);
conn.Open();
try
{
SqlDataAdapter sda = new SqlDataAdapter("select * from table_2 order by student_id", conn);
DataSet ds = new DataSet();
sda.Fill(ds, "table_2");
ReportDocument rd = new ReportDocument();
//相对路径加载
rd.Load(Server.MapPath(@"Report\PrintDemo1\CrystalReportDemo1.rpt"));
//绝对路径加载 //rd.Load(@"E:\Documents\Code\ASPDNet\WebStudy2\Report\PrintDemo1\CrystalReportDemo1.rpt");
rd.SetDataSource(ds);
this.CrystalReportViewer1.ReportSource = rd;
}
catch (System.Exception ex)
{
Response.Write(ex.Message);
}
finally
{
conn.Close();
}
}
}
水晶报表的其他知识
报表文件有很多配置选项:指定检索条件、分组、排序等等。
抑制显示
formula 抑制显示字段值,如下以Basix语法为例 指定默认不显示,满足条件后formula为false时才显示
formula = true
if {table_2.sex} = "gril" and {table_2.age} > 5 then
formula = false
end if
图标插件
水晶报表中包含一些基础的统图表,可以在报表文件插入“图表”选择使用