VS2005中水晶报表的灵活使用(转载)

 webform
大家在基于webform中使用水晶报表时如果简单的按照网上“阿刀”的做法,肯定会提示你:登陆失败。
对于这个问题,斑竹我花了整整一天的时间研究水晶报表的帮助文件,终于得到解决方案。
我不是一个保守的人,我相信有很多的网友正和我一样在花费精力在研究这个问题,我不愿意大家再和我一样白白的花费精力。
下面是我实现该方案的几个步骤。大家不要着急,慢慢的看下去会对你有很大的帮助。
步骤一:看示例文件
水晶报表自带一个示例文件,数据库是access(不带密码的)。我首先运行示例文件(基于webform和winform)结果显示了正确的报表,正如“飞刀”的示例。
于是,我自己建立了一个报表文件和.aspx文件,结果显示登陆失败!可是我把报表文件换成示例的报表文件,不再出错。
问题出在什么地方?难道是报表格式文件有关于登陆权限的设置?通过跟踪、调试,我对比分析我的报表文件和示例报表文件,没有发现任何的不同。看来问题不在报表文件。
是数据库的问题?我建立一个access结果还是登陆失败!
不是数据库的问题(我自己的数据库是未带密码的access,帮助中的数据库也是如此)?也不是报表格式文件的问题(我仔细分析了两者的原代码是相同的)?
那么问题出现在什么地方?我白思不得其解!
步骤二:找帮助文件
于是我再次求助于帮助。我翻遍了水晶报表的帮助,终于找到“ 访问安全数据库 [C#]”字样,发现这里有下面的一段话:
通过 Crystal Reports for Visual Studio .NET 访问安全数据库的过程在 Web 窗体和 Windows 窗体之间有所不同。在 Windows 窗体中,对话框自动提示用户输入用户名和密码(测试很容易成功)。而在 Web 窗体中,您需要设计一个表单以从用户获取该信息。对于这两种情况,均可使用代码来指定用户名和密码,从而为应用程序的所有用户提供相同的安全等级。
于是我对同样的数据库(先是用帮助示例中的access数据库,后来用自己建立的access数据库)。发现对于同一个报表文件,对于winform能显示成功,而对于webform则仍然显示登陆失败!于是我有点明白上面的意思!
看来问题是出在权限的设置上。
步骤三:研究帮助,终于成功!
在帮助里我找到“设置数据库登录参数”字样,里面提供了一些后来发现是非常有用的信息:
下列示例说明如何将登录参数传递到报表的表中。该示例使用到某个安全的 SQL Server 数据库的连接。
启动一个新项目
向窗体添加一个“按钮”和四个“文本框”控件。
将“文本框”控件分别命名为:serverNameTxt、dbNameTxt、userNameTxt 和 passwordTxt。
双击“按钮”控件以指定 Click 事件的代码。根据所用语言插入适当的代码。
[C#]
// 声明所需变量。
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
int i = 0;
// 对报表中的每个表依次循环。
for (i=0;i == Report.Database.Tables.Count - 1;i++)
{
// 设置当前表的连接信息。
logOnInfo.ConnectionInfo.ServerName = serverNameTxt.Text;
logOnInfo.ConnectionInfo.DatabaseName = dbNameTxt.Text;
logOnInfo.ConnectionInfo.UserID = userNameTxt.Text;
logOnInfo.ConnectionInfo.Password = passwordTxt.Text;
Report.Database.Tables [i].ApplyLogOnInfo (logOnInfo);
}
注意 受密码保护的 Microsoft Access 和 Paradox 等 PC 数据库也使用该方法,但 LogOnInfo.ServerName 和 LogOnInfo.DatabaseName 要保留为空。
于是我仿照这个样子,尝试了一下,出错提示:没有发现TableLogOnInfo 和Report。
后来我发现TableLogOnInfo 是属于CrystalDecisions.Shared 命名空间的成员。于是我添加引用:
using CrystalDecisions.Shared ;
这次问题出现在Report。
Report?这是个什么东西,我查遍了所有的帮助,并没有这个函数或类!
[说真的!这个问题难到了我很长的时间!一直在查找Report到底是个什么东西!水景报表公司也真是的,帮助也不写得详细一点!该打!!!]
最终我终于发现Report只是一个用户定义的对象,不是系统本身的对象。
在我困惑的时候,突然我想,为什么不看看Report后面的DataBase,这是个什么东西,终于问题解决了,在帮助里找到如下信息
ReportDocument oRpt = new ReportDocument();
Report属于DocumentCrystalDecisions.CrystalReports .Engine 类的成员。
修改代码:并添加引用
using CrystalDecisions.Shared ;//负责解释TableLogOnInfo类
using CrystalDecisions.CrystalReports .Engine ;//负责解释ReportDocument类private void Page_Load(object sender, System.EventArgs e)
{
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
//这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
ReportDocument oRpt = new ReportDocument();
oRpt.Load("c:\\inetpub\\wwwroot\\exer\\pagelet\\crystal\\cr1.rpt");//修改为你自//己的正确位置
//建立安全信息
//受密码保护的 Microsoft Access 和 Paradox 等 PC 数据库也使用该方法,但 LogOnInfo.ServerName //和 LogOnInfo.DatabaseName 要保留为空
logOnInfo.ConnectionInfo.ServerName = "www";
logOnInfo.ConnectionInfo.DatabaseName = "archives";
logOnInfo.ConnectionInfo.UserID = "sa";
logOnInfo.ConnectionInfo.Password = "123456";
oRpt.Database .Tables [0].ApplyLogOnInfo (logOnInfo);
//建立.rpt文件与CryStalReportviewer文件之间的连接
CrystalReportViewer1.ReportSource = oRpt;
}
报表文件终于出现!
哇,我好高兴,禁不住站起来伸了个懒腰!
步骤四:最终的完整版的代码
上面的代码不具有系统可扩充和灵活性。缺点有二:
(1)、数据报表格式文件是采用绝对路径
(2)、数据库访问权限的设置一旦设定,在最终发布是无法修改的,特别是客户的SQL SERVER服务器不可能和你调试的程序环境是一样的
基于这个考虑。引进两个比较好的东西:
(1)、Server.Mappath函数
(2)、读取web.config(本示例同时告诉你如何操作web.config配置文件)
最终修改如下:(完整代码)数据库为sql server2000
using CrystalDecisions.Shared ;//负责解释TableLogOnInfo类
using CrystalDecisions.CrystalReports .Engine ;//负责解释ReportDocument类
private void Page_Load(object sender, System.EventArgs e)
{
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
//这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
ReportDocument oRpt = new ReportDocument();
//获取.rpt文件真实路径
string path1,path2;
path1=Server.MapPath ("\\exer\\pagelet");
path2=path1+"\\crystal\\cr1.rpt";
//oRpt.Load("c:\\inetpub\\wwwroot\\exer\\pagelet\\crystal\\cr1.rpt");
oRpt.Load (path2);
//从web.config中获取logOnInfo参数信息
string a,b,c,d;
//获取ServerName
a=System.Configuration .ConfigurationSettings .AppSettings ["servername"];
//获取DatabaseName
b=System.Configuration .ConfigurationSettings .AppSettings ["database"];
//获取UserId
c=System.Configuration .ConfigurationSettings .AppSettings ["userid"];
//获取password
d=System.Configuration .ConfigurationSettings .AppSettings ["pass"];
//设置logOnInfo参数
logOnInfo.ConnectionInfo.ServerName = a;
logOnInfo.ConnectionInfo.DatabaseName = b;
logOnInfo.ConnectionInfo.UserID = c;
logOnInfo.ConnectionInfo.Password = d;
oRpt.Database .Tables [0].ApplyLogOnInfo (logOnInfo);
//建立.rpt文件与CryStalReportviewer文件之间的连接
CrystalReportViewer1.ReportSource = oRpt;
}
整个演示的操作过程说明:
1、 在解决方案资源管理器里,你需要存放报表文件处,添加新项:CrystalReport报表,起名为cr1.rpt
2、 在随后出现的“报表专家”中选择数据源时,请务必选择OLE DB,然后根据你的数据库的要求选择响应的驱动引擎:
SQL SERVER:Microsoft OLE DB Provider for SQL server
Access:Microsoft Jet.4.0
3、 输入正确的数据库连接,这一步大家一般的情况下不会出错!
4、 建立数据报表,并保存cr1.rpt文件
5、 打开webform1.aspx。添加crystalreportviewer控件:名称为:CrystalReportViewer1
6、 在webform1.aspx.cs中的page_load事件中添加上面的代码:
(注意:引用千万不要忘了!)
*****************************************************
下面是web.config中与本内容有关的细节
<appSettings>
<add key="servername" value="www"/>
<add key="database" value="archives"/>
<add key="userid" value="admin"/>
<add key="pass" value="123456"/>
</appSettings>
***注意这里的<add key="pass" value="123456"/>是pass,所以他必须与
//获取password
d=System.Configuration .ConfigurationSettings .AppSettings ["pass"];这里
的AppSettings["pass"] 中的"pass"保持一致。 当然名字是可以随便起,但必须一致
winform
水晶报表是一个优秀的报表开发工具,本人在开发通用管理系统的时候,所有报表都使用水晶报表,其简单、易用和强大的功能令笔者倍加喜爱,现将水晶报表使用手记呈现给大家。
一、在使用自带的水晶报表时,请注册,否则只能使用30次
二、使用CrystalReportViewer进行预览
CrystalReportViewer控件允许在应用程序中查看 Crystal Report。ReportSource 属性用于设置要查看哪个报表。该属性设置之后,报表显示在查看器中。报表源可以是ReportDocument、报表文件的路径,也可以是强类型报表。
1.打开“工具箱”,并将一个 CrystalReportViewer 拖到窗体上,我们命名为rptVew。
2.通过拖放操作将 Windows 窗体查看器调整到希望的大小并将其移动到所需位置。
3.当运行应用程序时,报表将显示在查看器中。
三、创建新报表
1.指向“添加”,单击“添加新项”。
2.在“添加新项”对话框中,从“模板”区域选择 Crystal Report,将报表命名为rptClient,单击“打开”。
3.在 Crystal Report 库中,选择下列选项之一:
•使用报表专家 — 指导您完成报表的创建过程,并将您的选择添加到 Crystal Report Designer。
•作为空白报表 — 打开 Crystal Report Designer。
•来自于现有的报表 — 创建新报表,它与指定的另一报表设计相同。
注意 Crystal Report 库包含许多专家,可以指导您完成数个特定类型报表的创建工作。您可能希望使用专家来创建最初的报表,以确定哪种报表构造方法适合您的需要。
4.单击“确定”按钮。
如果选择使用“报表专家”,便会出现“报表专家”对话框,并带有数据资源管理器。为每个文件夹选择所需数据,完成“报表专家”选项卡界面上的操作,然后单击“完成”来访问 Crystal Report Designer 和您的报表
四、是否需要动态设置数据源?
Crystal Reports 通过数据库驱动程序与数据库连接。每个驱动程序都被编写为可处理特定数据库类型或数据库访问技术。
拉和推模型
为了向开发人员提供最灵活的数据访问方法,Crystal Reports 数据库驱动程序被设计为可同时提供数据访问的拉模型和推模型。
拉模型
在拉模型中,驱动程序将连接到数据库并根据需要将数据“拉”进来。使用这种模型时,与数据库的连接和为了获取数据而执行的 SQL 命令都同时由 Crystal Reports 本身处理,不需要开发人员编写代码。如果在运行时无须编写任何特殊代码,则使用拉模型。
推模型
相反,推模型需要开发人员编写代码以连接到数据库,执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中,并在 Crystal Reports 收到数据之前先将数据筛选出来。
四、从 ADO.NET 数据集制作报表
从数据库创建数据集对象
1.在项目中新建一个架构文件:
a.在解决方案资源管理器中,右击项目名,指向“添加”,然后单击“添加新项”。
b.在“添加新项”对话框的“类别”区域,展开文件夹,然后选择“数据”。
c.在“模板”区域选择“数据集”。
d.接受默认名称 Dataset1.xsd。
这就创建了一个新的架构文件 (Dataset1.xsd),以后将用它来生成强类型数据集。该架构文件将显示在 ADO.NET 数据集设计器中。
2.指定数据库位置:
a.在服务器资源管理器中,右击“数据连接”并选择“添加连接”。
b.在“数据链接属性”对话框中,单击“提供程序”选项卡,然后选择一个提供程序(例如 Microsoft OLE DB Provider for SQL Server)。
c.单击“连接”选项卡,然后指定您的数据库所在位置。在所需位置输入服务器和登录信息。
d.单击“确定”按钮。
此时,您的数据库及其表和字段就出现在服务器资源管理器的“数据连接”节点下面。
3.在解决方案资源管理器中,双击 Dataset1.xsd (如果它尚不是活动视图)。
Dataset1.xsd 现在应显示在“数据集”选项卡中。
4.若要为数据集建立架构,请将需要的表从服务器资源管理器中拖动到 Dataset1.xsd 的“数据集”选项卡上。
5.单击“保存 Dataset1.xsd”来保存“Dataset1.xsd”文件。
6.在“生成”菜单上,单击“生成”为项目生成数据集对象。
ADO.NET 数据集对象提供数据的描述,从它可以向 Crystal report 添加表。使用 Crystal Report Designer 中的“数据库专家”从 ADO.NET 数据集对象添加表。
请在使用“报表专家”创建新报表时调用“数据库专家”。或者,要从一个已经使用 ADO.NET 建立好的报表中访问“数据库专家”,请在 Report Designer 中右击,指向“数据库”,然后单击“添加/删除数据库”。
将报表连接到 ADO.NET 数据集对象
1.在“数据库专家”中,展开“项目数据”文件夹。
2.展开“ADO.NET 数据集”文件夹。
3.选择所需数据集对象。
例如,如果当时使用的是从项目“WindowsApplication1”的架构文件“Dataset1.xsd”中生成的数据集对象,则应该选择“WindowsApplication1.Dataset1”。
4.选择要向报表中添加的表,和使用其他数据源一样。
五、动态改变数据源的代码
Dim dsdataSet As New DataSet()
Dim oRpt As New rptClient() '已建立的报表rptClient
请读者自行填充数据集dsdataSet
'使用“报表引擎”对象模型将填充的数据集,传递给报表
oRpt.SetDataSource(dsdataSet.Tables(0))
' 将带有数据的报表对象绑定到 Windows 窗体查看器,rptVew(CrystalReportViewer控件)
rptVew.ReportSource = oRpt
注意 FillDataSet 方法可连接到指定的数据库,提取数据,然后断开数据库连接。如果您希望将数据库中的多个表添加到报表中,请使用 SQL JOIN 语句将这些表联接在一起;然后在 FillDataSet 方法中指定一个结果表
六、创建主从报表
在报表中,有许多报表是主从表结构,比如订单与订单商品明细,订单是一个表中的一条记录,而分录是另一个表中的多条记录,两个表通过一个字段关联起来,这种报表可利用其分组功能实现,
1.新建一个工程
2.往FORM1中添加一个CrystalReportViewer控件
3.在服务噐资源管理器中连接到SQL SERVER 2000上的Northwind数据库
4.添加一个数据集Dataset1,将服务器资源管理器中的Orders和 Order Details加入到数据集中。
5.添加一个水晶报表,使用报表专家,在项目数据中选择“ADO.NET数据集”,插入表Orders和 Order Details,“链接”中是关联字段的链接,在“字段”中选择要显示的主表和明细表的字段,组中选择分组依据为Orders表OrdersID字段,总计,图表,选择(可进行筛选),样式(可设置报表标题),可自行设置。设置完后,点击完成。
6.在报表设计器中调整需要显示的字段的位置、宽度等。
7.在窗口中添加代码。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim oRpt As New CrystalReport1()
Dim dsdataSet As New Dataset1()
Dim CN As New Data.SqlClient.SqlConnection("data source=PMSERVER;initial catalog=Northwind;user id=sa;password=sa")
CN.Open()
Dim daOrders As New Data.SqlClient.SqlDataAdapter("select * from orders", CN)
daOrders.Fill(dsdataSet, "orders")
Dim daDetails As New Data.SqlClient.SqlDataAdapter("select * from [Order Details]", CN)
daDetails.Fill(dsdataSet, "Order Details")
'使用“报表引擎”对象模型将填充的数据集,传递给报表
oRpt.SetDataSource(dsdataSet)
CrystalReportViewer1.ReportSource = oRpt
End Sub
七、用程序改变报表中text的文本
代码如下: Dim GetTextObject As TextObject
' 按名称获取 ReportObject,将其转换为 TextObject,并返回此对象。
GetTextObject = orpt.ReportDefinition.ReportObjects.Item("text13")
GetTextObject.Text = "XXXX系统"
posted on 2007-02-27 15:07  念时  阅读(2188)  评论(3编辑  收藏  举报

细节决定成败!态度决定一切!