【水晶报表内功心法】--PUSH模式样板招式

阿泰 2009-06-26 06:17:17
加精
索引

.【水晶报表内功心法】--序言
.【水晶报表内功心法】--推拉之间
.【水晶报表内功心法】--PULL模式样板招式
============================================================
前篇讲解了PULL模式下的操作方法,比较简单。
本文进一步详细讲解一下PUSH模式下的样板操作。
仍以Web为例

新建一个 Asp.Net CrystalReports的网站

弹出下面这个界面后,选第2项-作为空白报表,然后点确认,进入一个空白界面。

新建一个数据集合


出现此提示时,点“是”


然后还会出来连接数据库的提示,一律点否,直至界面上什么提示也没有
在这个界面上,点右键,添加一个datatable,命名为myTable。


然后在myTable里增加相应的列,我这里有3个列,注意要设置好类型。




特别说明:
因为水晶报表里不认datatime型,对于2009-06-26 9:23:15
会自动截断为2009-06-26
所以datatime型数据在xsd文件中,可设置为string型
而代码中的SQL中可把字段转换为String传入。


xsd设计完毕后,开始进入报表模板设计阶段。

在“数据库字段”上点右键,选“数据库专家”


再弹出的界面上,点“项目数据”,依次点开,找到我们刚才自己做的mytable


确定后,在“数据库专家”下面会出现表名mytable,点开后会看到字段,
把字段拖到模板上的详细资料节即完成基础模板的制作了


点一下预览,会看到虽然我们还没有任何实际的数据操作,但是界面上已经有数据了
这是水晶报表的一个虚拟数据,可以看到一个最终显示的效果。


好了,上代码

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Web;
using System.Data.OleDb;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ConfigureCrystalReports();

}

private void ConfigureCrystalReports()

{

//连接字串
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);
//创建我们的DataSet1实例
DataSet1 dt1 = new DataSet1();
//填充dt1
//注意:表名mytable必须与我们在xsd设计的表名称一致。
//本例中数据库的表实际名称为RPT_CR_TEST1,而最终是以mytable为准的
//使用 PUSH模式的优点就在此,可以自由组合SQL
//前提是表名称和字段名(需要在SQL中使用as别名的方式跟xsd中设计的字段名一致)都要一致
da.Fill(dt1, "mytable");

ReportDocument myReport = new ReportDocument();
string reportPath = Server.MapPath("crystalreport1.rpt");
myReport.Load(reportPath);

//绑定数据集,注意,一个报表用一个数据集。
myReport.SetDataSource(dt1);
CrystalReportViewer1.ReportSource = myReport;

}

}


然后运行就可以了。



这里做一下说明,在【推拉之间】没有说这个xsd,是因为当时没讲到细节操作。
说了很难理解。
这个xsd,是我们自己构造的,做个比喻吧:
就是xsd比作个一个架子,它负责把水晶报表撑起来,但是是空的,没有内容
我们用 PUSH模式,把数据塞给它,把架子塞满,这样水晶报表也就能呈现出效果来



常见问题:
1:报表可以显示出来,但是没数据,
一般有以下几种情况
a:表中确实没数据
b:da.Fill(dt1, "mytable");表名称与xsd中设计的表不一致
c: 如果你用了多个表,可能是因为表默认的关联关系导致无数据

2:出现下面这个图的提示,特别是翻页、打印、导出的时候,因为这些动作都需要重新连接数据库源。


a:如果是多表的话,可能是部分表没有赋值。
水晶报表需要对用到的每个表进行验证,即使没数据。没有的话,传个空的记录集也行。
b:代码没有放到Page_Load或Page_init里,或者是放到了,但是控制了 postback。
因为http是无状态的,如果控制了postback,水晶报表就丢失了前面的设置,会导致出现此情况的

预告:

两篇基础讲完了,也为后面做好了比较坚实的铺垫。
所以我就加快进度了。
下一篇:掌控于股掌之间-代码中传参数、传公式、操作水晶报表里的所有对象


...全文
16413 97 打赏 收藏 转发到动态 举报
写回复
用AI写文章
97 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiyu20110727 2012-07-25
  • 打赏
  • 举报
回复
没看明白 太深奥了
wy2682672 2012-07-17
  • 打赏
  • 举报
回复
感谢楼主
briankyo82 2012-07-11
  • 打赏
  • 举报
回复
mark!!!!太實用了,謝謝!!
li4663530 2012-07-04
  • 打赏
  • 举报
回复
学习了,很详细,很好入手,牛人
xinzhuzhi 2012-06-20
  • 打赏
  • 举报
回复


我代码放在按钮里面,还没有点击,from 加载的时候就跳出这个提示了

private void button1_Click(object sender, EventArgs e)
{



string connstr = "Provider=MSDAORA;Data Source=my02;Password=my123;User ID=my";
OleDbConnection conn = new OleDbConnection(connstr);
string cmdstr = "select code from BANKINFO";
OleDbDataAdapter da = new OleDbDataAdapter(cmdstr, conn);
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
conn.Open();
DataSet ds = new DataSet1();
da.Fill(ds.Tables["mytable"]);
conn.Close();
string reportpath =Application.StartupPath+@"\CrystalReport1.rpt";
ReportDocument rd = new ReportDocument();
rd.Load(reportpath);
rd.SetDataSource(ds);
this.crystalReportViewer1.ReportSource = rd;

}
半截烟头 2012-06-15
  • 打赏
  • 举报
回复
楼主真好人,公司刚弃BI改用BO,到处找教材,还是这个系列经典易懂。
qiuhaihui 2012-06-08
  • 打赏
  • 举报
回复
还是雾水中。。。
段传涛 2012-04-04
  • 打赏
  • 举报
回复
thank you for you open code
peiwujie 2012-03-30
  • 打赏
  • 举报
回复
//连接字串
String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;";
OleDbDataAdapter da = new OleDbDataAdapter();
OleDbConnection cn = new OleDbConnection(connstr);


请问链接 sql2005 怎么写啊
山东蓝鸟贵薪 2011-10-24
  • 打赏
  • 举报
回复
终于上传上来了呀
我上传的是C#+水晶报表+WinFORM方式的
http://download.csdn.net/detail/sgzhou12345/3713325

一学就会,
一看就懂
hanyi_ 2011-09-29
  • 打赏
  • 举报
回复
push 模式,数据集有两个表,用三层架构把数据提取出来,分别用datatable存放,那我应该怎么才能把这两个table 填充到数据集中的两个表呢?或者怎么做才能把数据绑定到报表中啊? 我的报表,显示不了数据啊!啊泰,求教啊!!!

要是数据集有两个表以上,我就不会用水晶报表了!!
skybreakhaha 2011-09-27
  • 打赏
  • 举报
回复
讲的很详细
WangPengAn 2011-09-22
  • 打赏
  • 举报
回复
很受用,解决问题,谢谢楼主!
WangPengAn 2011-09-22
  • 打赏
  • 举报
回复
看了楼主的方法,很受用,终于解决我的问题!谢谢。。。
相知到永远 2011-08-19
  • 打赏
  • 举报
回复
study Ving.....
chuxuezhe200 2011-08-16
  • 打赏
  • 举报
回复
多张主从表要实现动态查询后生成报表怎么实现,,,小弟是刚接触报表大家帮帮忙,,
zjl07280316 2011-07-21
  • 打赏
  • 举报
回复
好人那!!这几天正在学报表刚好用的着~~~
stonemqy 2011-07-06
  • 打赏
  • 举报
回复
很详细,正用push模式呢,很多地方都不明白,现在就试试。
Louis-Lv 2011-05-20
  • 打赏
  • 举报
回复
up!up!
巅峰 2011-05-04
  • 打赏
  • 举报
回复
Server.MapPath 末定义啊
有vb.net 的代码吗?Server.MapPath属于哪个类?
谢谢
加载更多回复(76)

4,816

社区成员

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

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