搜档网
当前位置:搜档网 › vs2005中水晶报表实现

vs2005中水晶报表实现

vs2005中水晶报表实现

【说明】
水晶报表在应用时分两种方法,分别是拉模式(PULL)、推模式(PUSH)。拉模式:在水晶报表生成时的数据源是从水晶报表文件中的SQL语句从数据库中提取的,在编程时不用重写SQL语句,但要加上登录信息(具体方法,后面介绍)。推模式:在水晶报表生成时的数据源,是用编程时重写水晶报表中SQL语句而生成的dataset对像。也就是说,推模式是用dataset组装水晶报表。
水晶报表组件介绍。水晶报表在VS2005中有两种组件,在WEB项目是分别是CrystalReportSource,CrystalReportViewer。在FORM项目里是分别是crystalReport,CrystalReportViewer。
CrystalReportSource,crystalReport是水晶报表的数据提供者;CrystalReportViewer是水晶报表的浏览器。另外还要介绍一下水的报表的文件是以rpt为扩展名的文件,该文件可以用VS2005生成。
下面分别介绍具体操作方法:
拉模式(PULL):
在拉模式中如要在水晶报表中的SQL语句加上条件参数时要用{?参数名}方式给出。例:“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是参数名

以下例子中所用到的水晶报表文件中使用的SQL语句是“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是参数名。
【WEB方式下】
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
///


///功能:拉模式提取水晶报表
///

///
///
protected void Button_pull_Click(object sender, EventArgs e)
{
// CrystalReport.rpt是水晶报表文件的名称;CrystalReportSource1是从工具箱加到页面上的水晶报表数据源对像。

CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));
// SetDatabaseLogon 拉模式中必须用这个方法来设置登录信息,参数一:用户名;参数二:密码;参数三:服务器;参数四:数据库名
CrystalReportSource1.ReportDocument.SetDatabaseLogon("sa", "123456", @"SYWZSWL\SQLEXPRESS", "Test");
//给水晶报表传参数,参数一:是参数名,参数二:参数值;
CrystalReportSource1.ReportDocument.SetParameterValue("Title", "这是一个测试报表");
CrystalReportSource1.ReportDocument.SetParameterValue("Parm", "1");
//绑定水晶报表数据源。
CrystalReportSource1.DataBind();
// CrystalReportViewer1是水晶报表浏览器,下面是给该浏览器赋上对像
CrystalReportViewer1.ReportSource = CrystalReportSource1;
CrystalReportViewer1.DataBind();

}

【FORM方式下】
//在FORM方式下代码同WEB方式,用crystalReport控件换掉了CrystalReportSource;用crystalReportViewer换掉了CrystalReportViewer;这两个控件都可以在工具箱里找到。同时在编程时去掉DataBind()方法。
private void Form1_Load(object sender, EventAr

gs e)
{

crystalReport1.Load(Application.StartupPath + "CrystalReport.rpt");

crystalReport1.SetDatabaseLogon("sa", "123456", @"SYWZSWL\SQLEXPRESS", "Test");

crystalReport1.SetParameterValue("Title", "这是一个测试报表");
crystalReport1.SetParameterValue("Parm", "1");
crystalReportViewer1.ReportSource = crystalReport1;

}


推模式(PUSH):
在推模式中编程组装的Dataset里的SQL语句中的字段要与水晶报表里的SQL语句字段一致。简单的说,推模式中的水晶报表是个模板,把在设计器里报表的格式设好后,再组装DataSet就可以生成报表了。


【WEB方式下】

using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using System.Data.SqlClient;
protected void Button_push_Click(object sender, EventArgs e)
{
string sql = "Select T1, T2, T3 FROM T where T1=''a''";
string DBConfig_sql =@"Data Source=SYWZSWL\SQLEXPRESS;Initial Catalog=Test;User ID=sa;Password=123456";
DataSet ds = new DataSet();
SqlConnection sqlCon = new SqlConnection(DBConfig_sql);
SqlCommand sqlCmd = new SqlCommand(sql, sqlCon);
SqlDataAdapter sqlAd = new SqlDataAdapter();
sqlAd.SelectCommand = sqlCmd;
sqlAd.Fill(ds, "sql");
CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));
//注意此处必需指明Dataset中的表的名称,否则会提示“您请求的报表需要更多信息.”
CrystalReportSource1.ReportDocument.SetDataSource(ds.Tables["sql"]);
//{?}中的参数可以不用赋值,即使赋了值也不起作用。
// CrystalReportSource1.ReportDocument.ParameterFields["Parm"].CurrentValues.AddValue("1234567");
CrystalReportSource1.ReportDocument.ParameterFields["Title"].CurrentValues.AddValue("这时推模式的报表样例!");
CrystalReportSource1.DataBind();

CrystalReportViewer1.ReportSource = CrystalReportSource1;
CrystalReportViewer1.DataBind();
}
【FORM方式下】
private void Form1_Load(object sender, EventArgs e)
{
//推模式
string sql = "Select T1, T2, T3 FROM T where T1=''a''";
string DBConfig_sql = @"Data Source=SYWZSWL\SQLEXPRESS;Initial Catalog=Test;User ID=sa;Password=123456";
DataSet ds = new DataSet();
SqlConnection sqlCon = new SqlConnection(DBConfig_sql);
SqlCommand sqlCmd = new SqlCommand(sql, sqlCon);
SqlDataAdapter sqlAd = new SqlDataAdapter();
sqlAd.SelectCommand = sqlCmd;
sqlAd.Fill(ds, "sql");
crystalReport1.Load(Application.StartupPath + "CrystalReport.rpt");
crystalReport1.SetDataSource(ds.Tables["sql"]);
//{?}中的参数可以不用赋值,即使赋了值也不起作用。
// CrystalReportSource1.ReportDocument.ParameterFields["Parm"].CurrentValues.AddValue("1234567");
crystalReport1.ParameterFields["Title"].CurrentValues.AddValue("这时推模式的报表样例!");

crystalReportViewer1.ReportSource = crystalReport1

报表的数据来源已经不是报表模板使用拉模式获得了,是推模式的

一种实现
这样实现的好处是这里的sql是由页面输入条件动态构造出的,可以实现按条件的动态查询。不使用强类型dataset,用datatable非常方便。
这种方式和以前用pb构造动态datawindow的方式一样,我使用起来觉的还是很顺手的。
容易实现的优点从安全性上看就变成了缺点,页面输入拼装sql,安全性不高。

如果涉及多个表,sql很长构造麻烦的情况,使用第二种可能不是很方便。那么在第一种方法下能否实现where条件的动态变化呢
这时可以使用公式筛选记录的方法实现:
ReportDocument.DataDefinition.RecordSelectionFormula = "{**}= " textBox1.Text ;
筛选条件也可以根据页面输入动态构造
我的理解是数据从数据库中拉来后再使用过滤条件进行过滤的方式,性能会不好控制。
当然也可以使用CrystalReportViewer控制过滤,比如
crystalReportViewer1.SelectionFormula = "{**}= " textBox1.Text;
但是按照表示层和基础业务逻辑分开的原则,用ReportDocument更加自然。在vs2005的帮助中有完整的帮助和示例。

要按照使用环境限制,适当选择实现方式。
去年有个多维报表的项目用sqlserver2005的reportservice做的,现在来看水晶报表也完全可以,而且水晶报表也能实现切片和钻取的效果。建立交叉表,两个数据在两个维度变化。尤其是数据源非sqlserver2005的情况下,还是非常好的选择。

技巧:
1.非交叉表实现单元格合并,网上的意见都是无法实现,后来在一个网站上看到了实现方法,虽然不自然,但是效果可以出来,需要合并的单元格都设置为组,并在“节专家”,选择你的组页眉,右边“公用”中选中“延伸到后续节”。设置对象格式,上边框为单线。
在设计时预览都没有问题,但是嵌入网页运行后,不知道为什么线都丢失了。没办法,再插入线,在设计时预览线条会粗些,但是运行时刚好。
这是野路子的实现。
 回复 引用 查看

#2楼[楼主] 2008-04-29 15:54 freeliver54
[转]
如果要用水晶报表设计需要向下穿透的主从报表时好像不容易,今天找了一些资料,水晶报表向下钻取的功能很有限,从表需要连接的关键字必须在主表中,如果要实现在主报表的某条数据点击后穿透到从表对应该纪录的子表信息,而子表信息需要其他参数(主表中没有)才能组织报表数据 。还好可以用推模式自己组织数据。

例子:

SqlConnection conn = new SqlConnection(@"Data Source=CNCTU006630W\SQLEXPRESS;Initial Catalog=MyDB;Integrated Security=True;Pooling=False;");
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("select * from mytable ",conn);
da.Fill(ds,"mytable");

da = new SqlDataAdapter("select * from mytable2 ",conn);
da

.Fill(ds,"mytable2");

ReportDocument oRpt = new ReportDocument();
oRpt.Load(Server.MapPath("CrystalReport.rpt"));
oRpt.SetDataSource(ds);
ReportDocument suboRpt = oRpt.OpenSubreport("mysub01");
suboRpt.SetDataSource(ds);
CrystalReportViewer1.ReportSource = oRpt;
CrystalReportViewer1.DataBind();
 回复 引用 查看

#3楼[楼主] 2008-04-29 15:58 freeliver54
[转]
如何在水晶报表的某一表项超链接到另一报表

using Microsoft.Reporting.WinForms;
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace zhishi.rdlc
{
///


/// .net2005 rdlc报表的使用 2007-07-16
///
/// 主要是可以对报表进行打印功能比较不错,可以时候不规则文件的打印功能
///

class rdlc
{
//报表查看控件
private ReportViewer ReportViewer1=new ReportViewer();
//数据原
private ReportDataSource dsReport = null;

///
/// 显示报表
///

private void Show()
{
//报表呈现的地址
ReportViewer1.LocalReport.ReportEmbeddedResource = "zhishi.rdlc.Report1.rdlc";
ReportViewer1.RefreshReport();
}

///
/// 设置报表的数据原
///

public void rdlcDataSource(DataSet ds)
{
//取消原来的报表
ReportViewer1.Reset();
//报表的数据愿名称
https://www.sodocs.net/doc/e914631891.html, = "rdlcDataSource";
//报表数据
dsReport.Value = ds.Tables["rdlcDataSource"];
//添加报表数据愿
ReportViewer1.LocalReport.DataSources.Add(dsReport);
}

///
/// 设置报表参数
///

public void SetReportParameter()
{
//Report_Parameter_0
ReportParameter[] parameters = new ReportParameter[3];
parameters[0] = new ReportParameter("Report_Parameter_1", "Report_Parameter_0_Value");
parameters[1] = new ReportParameter("Report_Parameter_2", "Report_Parameter_1_Value");
parameters[2] = new ReportParameter("Report_Parameter_3", "Report_Parameter_2_Value");
ReportViewer1.LocalReport.SetParameters(parameters);
}

//报表连接事件
//Report1.rdlc里面对应的时间处理
//报表处理器的Drillthrough事件
private void ReportViewer1_Drillthrough(object sender, DrillthroughEventArgs e)
{
//可以冲别的地方传入 这里没有数据
DataSet ds=new DataSet();
LocalReport localReport = (LocalReport)e.Report;
ReportParameterInfoCollection Parameter = localReport.GetParameters();
//以前报表传给新报表的参数Report_Parameter_01 Report_Parameter_11
//就是目前点击报表表格行的 X Y的值 他是重新导航到Report1.rdlc
string Report_Parameter_01 = Parameter["Report_Parameter_01"].Values[0].ToString();
string Report_Parameter_11 = Parameter["Report_Parameter_11"].Values[0].ToString();
if (Report_Parameter_01 == "" || Report_Parameter_11 == "")
{
//新报表呈现的数据愿
localReport.DataSources.Add(new ReportDataSource("rdlcDataSource", ds.Table

s["rdlcDataSource"]));
}
}

}
}

//我使用不是水晶报表 但应该差不多的 你参考下
 回复 引用 查看

#4楼[楼主] 2008-04-29 16:05 freeliver54
[转]
Report子表与钻取开发注意
最近使用Report的子表功能,可一直无法显示,看完MSDN再到网上下代码,还是改不过来,后来经尝试(总时间累计10小时)终于发现问题得以解决,希望能为和我有同样问题的朋友帮上点忙


设定好参数后,要对ReportViewer的本地报表变化进行事件订阅(LocalReport.SubProccesing)
this.rptMain.LocalReport.SubreportProcessing += new Microsoft.Reporting.WinForms.SubreportProcessingEventHandler(SubReportProcessingEventHandler);
private void SubReportProcessingEventHandler(object sender, Microsoft.Reporting.WinForms.SubreportProcessingEventArgs e)
{
e.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataOrder_订单明细", this.dsOrders.Tables["OrderDetails"]));

}
注意ReportDataSource( string SourceName,object DataSource.Value)中的“SourceName”要与报表文件.rdlc中的数据集绑定的名称相同,否则是新建一个表与先前的数据相关项无关,换句话说就是你新建了一个Table,所以这里要传入你想填充的数据就要写对名称,如果不知道可在报表设计模式下的“报表”菜单下的数据源中查看表名称,使惯了平时的https://www.sodocs.net/doc/e914631891.html,的要注意了,你可能就犯了这个错误,这次不会智能的给你实例表格的,别忘了你加了new关键字,所以以后大家看家new就要注意名称了。
否则,将会出示子表无法显示的问题,其原因就是数据表没有实例化,不过这里不会显示这个错误信息,而是“错误:子表不能正确显示”,大家就要注意了,看看是否是这个原因。
最后要说的是,报表的相关设置都在“报表”菜单中,自己看就行了。
还有报表中的语言是VB语言,有时间也学学吧,反正其他的水晶报表也用的上,钻取就Drillthrough
void DemoDrillthroughEventHandler(object sender, DrillthroughEventArgs e)
{
LocalReport localReport = (LocalReport)e.Report;
localReport.DataSources.Add(new ReportDataSource("Employees",
LoadEmployeesData()));
}


相关主题