【水晶报表内功心法】--第一阶段小结

阿泰 2009-07-13 06:44:03
加精
索引

.【水晶报表内功心法】--序言
.【水晶报表内功心法】--推拉之间
.【水晶报表内功心法】--PULL模式样板招式
.【水晶报表内功心法】--PUSH模式样板招式
.【水晶报表内功心法】--信手拈来,掌控对象
.【水晶报表内功心法】--数据过滤

...
...
.【水晶报表内功心法】--完美Excel(上)
.【水晶报表内功心法】--完美Excel(下)
============================================================
今天数据库狂慢,数据库服务器是百万大元的超强机器,还是被折腾得半死不活的。刚好有点时间,写一下这篇。

本文是第一阶段的小结,第一阶段主要讲解了推拉模式,以及基本操作,和数据的过滤。它的主要目的就是解决怎么把数据与报表的交互问题。
前后历时近一月,反响一如我当初所料,不会很强烈。而且很多人,也是因为推荐到首页后,习惯性的顶一下。并没有认真的去看内容。
毕竟水晶报表的应用范围比较小。不过我也很高兴能看到几位朋友,能真正的去看了,还参与了讨论。
我本来的目的,就是为了系统地介绍水晶报表的应用,一来是方便大家在用到的时候查阅和学习,二来也能减少自己的重复回复。

下一阶段,则主要讲解报表在拿到数据后的进一步处理。

大致会分为以下几个章节:
参数、函数与公式、运行时总计
分组
子报表
交叉表
图表


仍然是讲解基本概念和应用技巧以及应用场景,这些讲完,也基本完成了整个报表功能的基本介绍了。这些预计在7月份完成。
有时间的话,我会零散讲一下水晶易表(水晶报表的兄弟产品)的应用,看一下这个工具的酷炫效果。

1:PULL模式和PUSH模式的选择

PULL执行效率高,开发简单,适用于WinForm程序,用户不是很多的系统。
但是多了一个数据库连接,而且这个链接的占用时间还比较长,所以不适合用户多的系统。
有一种特例,就是数据量特别大的情况,我推荐用PULL。

PUSH则很灵活,可以承接任何数据源。比如不是从数据库里直接出来的数据,或者是来自于WebService等其他应用的数据接口。


2:WebForm开发的一个重要技巧:小代码,大作用

在前面的文章中,我一直是用WebForm演示的,主要是因为 HTTP是无状态的,在此链接的操作,不会带到下一连接中。
所以我们经常会遇到这样的情况,当前显示好的,在翻页、导出、打印等动作的时候,出出现无数据,或者需要重新登陆数据库的提示。
这是因为这些动作都重新触发了页面,导致我们前一次的操作丢失了。
所以之前的代码,我一直是写在Page_load里的,但是这样一是不能解决所有的问题,特别是涉及到有参数传递等情况。
二是可能会多次请求数据库,导致资源的消耗。

前面说到既然是状态丢失,那么我们可以用.Net里的session,cache或viewstate来进行保持状态

这里我用session做一个范例,场景是这样的:
一个PUSH模式的报表,带一个参数p1.
界面上有一个Button,点击后展现报表。然后报表可以进行翻页、打印和导出(这些是工具条实现的,不进行编码实现)而不会出现错误提示。

其实只要改造两处地方即可,注意红色的部分

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//使用Session保持ReportDocument对像
//每次页面更新时,不再需要重新走数据库
//注意:如果是VS2008,这段代码要放到Page_Init事件中

If (Session["myRpt"]!=null) then
{
CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
}


}

//点击按钮后,报表进行第一次呈现
protected void Button1_Click(object sender, EventArgs e)
{
//连接字串
String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;";
OleDbDataAdapter da = new OleDbDataAdapter();
OleDbConnection cn = new OleDbConnection(connstr);

da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn);
DataSet2 dt1 = new DataSet2();
da.Fill(dt1, "RPT_CR_TEST1");
ReportDocument myReport = new ReportDocument();
string reportPath = Server.MapPath("crystalreport1.rpt");
myReport.Load(reportPath);

//绑定数据集,注意,一个报表用一个数据集。
myReport.SetDataSource(dt1.Tables[0]);
myReport.SetParameterValue("p1","参数测试");
CrystalReportViewer1.ReportSource = myReport;

//保存到Session

Session["myRpt"]=myReport;

}

}


本文将持续更新一段时间。
...全文
23464 105 打赏 收藏 转发到动态 举报
写回复
用AI写文章
105 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigheadsheep 2012-05-10
  • 打赏
  • 举报
回复
楼主讲的太细了,正好适合我们这样的初学者,谢谢
bigheadsheep 2012-05-07
  • 打赏
  • 举报
回复
正在学习水晶报表,多谢楼主的教诲,又不懂的地方还要多多讨扰
chenwei151 2012-03-12
  • 打赏
  • 举报
回复
顶,正好是我需要的资料!
再见寒冰玉 2011-12-13
  • 打赏
  • 举报
回复
楼主,帮你顶一下,虽然以前我从来不回帖的,但是看到你这样的为大家贡献资源,破例为你顶下,虚心学习
longzhongyuan 2011-11-21
  • 打赏
  • 举报
回复
顶起!!!虽然我是用vb.net 也照样学习了,楼主真是个好淫啊,辛苦辛苦!
zhongjh_ORZ 2011-11-13
  • 打赏
  • 举报
回复
好贴啊!解决了我一直以来的困惑,谢谢高人!力顶!!
cdz1022 2011-10-21
  • 打赏
  • 举报
回复
学习。
mainer007 2011-10-19
  • 打赏
  • 举报
回复
阿泰,
救命啊!
我这里是个winform的app,调用水晶报表打印方法,在开发机器上测试都可以的,可是在部署到客户机上时,有一个单打印150张的,结果打印到125张的时候报错了,提示加载报表失败,请问是什么问题?
麻烦给点指点或者思路。

谢谢了!
a474841314 2011-09-29
  • 打赏
  • 举报
回复
mark
山东蓝鸟贵薪 2011-09-19
  • 打赏
  • 举报
回复
谢谢分享,有没有完整点的下载包呀???????
dapengytt163 2011-08-31
  • 打赏
  • 举报
回复
关注中,学习学习
meilingaiyiff 2011-05-17
  • 打赏
  • 举报
回复
阿泰的东西对我太有用了,万分感谢阿泰
daodao0704 2011-05-04
  • 打赏
  • 举报
回复
阿泰,我想问下,水晶报表做报表容易,还是active reports做报表容易?我学了两个礼拜的水晶报表,结果上司说,水晶报表不好控制,效率低。。。他是因为报表的显示对于内容多少的不同不够智能,做出来的报表,会造成纸质的浪费。。。
Zhen (Evan) Wang 2011-04-20
  • 打赏
  • 举报
回复
很强大
lianshuaike 2010-12-31
  • 打赏
  • 举报
回复
服了!1294792470编程爱好者,有兴趣的可以加我QQ
yangzn76 2010-11-18
  • 打赏
  • 举报
回复
收藏了,很有参考价值。
风情飘逸 2010-10-28
  • 打赏
  • 举报
回复
protected void Page_Unload(object sender, EventArgs e)
{
//doc.Close();
// doc.Dispose();//取消注释后有空指针异常
}


我在代码中加了这个方法后,

CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
这句会报空指针异常,怎么解决,我想用到doc.dispose();

其中doc是类成员:ReportDocument doc = new ReportDocument();
猎人日记 2010-09-17
  • 打赏
  • 举报
回复
学习中
reason159 2010-08-26
  • 打赏
  • 举报
回复
膜拜~~~~~~~~~~~~~
yangfanai1010 2010-08-23
  • 打赏
  • 举报
回复
不錯,頂一下!!!!收藏。。。
加载更多回复(83)

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧