最近的一个Web项目中,由于有打印和导出成PDF格式的应用,而之前都是通过html语法来直接写的,虽然实现了功能,总有一些瑕疵,了解到水晶报表可以解决之前的问题,So,不得不换成水晶报表来做

 

 今天是我第一次接触水晶报表,之前一直都做服务器开发(网络编程),老实说,有点忐忑,又有点兴奋。

 

 和解决大多数问题一样,先看水晶报表的优点,再看水晶报表的缺点,然后了解资料,园子里面的百来篇我关于水晶报表的,我基本上都看过

 优点太多:

1.适合快速开发,能很方便的出各种饼图,柱图,等

2.方便 灵活的导出功能,兼容大多数文件格式

3. 多钟语言的支持

4.齐全的网络资料

5.可以直接访问各种数据源 

缺点也不少:

1.不支持png图片透明(我的这个应用也还是有这个问题,因为是电子签名的)

2.执行效率太慢

3.无源码,无真相

 

经初步了解,水晶报表加载数据有两种方式

1.Pull(拉模式),直连数据库,但要注意连接参数的设置 优点: 方便,快捷 缺点:灵活性太差,适用面窄

2.Push(推模式),该模式允许程序员通过组装在内存中的表来封装数据 当然就更加灵活,丰富多样

 

使用时遇到几个问题

1.数据源的生成:

 举个例子:当我的报表中需要显示多个表的字段,而这些字段又没法在一条SQL语句中查询(当然,可以在内存中构建临时表的方式来做),我只能打破我原有的三层架构,把数据操作层提了上来,通过传输SQL语句的方式来作词组装DataSet

 1 using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(Ecms.DbHelper.DbHelperSQL.connectionString))
 2         {
 3             SQLString = "Select ProductCode,ProductName,ProductModel,Unit as Uint,Amount,Price,Amount*Price as Money,Convert(nvarchar(10),DeliveryDate,111) as DeliveryDate,Remark,ContractID From Tbl_Shop Where ContractID=" + m_ContractID;
 4             try
 5             {
 6                 connection.Open();
 7                 System.Data.SqlClient.SqlDataAdapter command = new System.Data.SqlClient.SqlDataAdapter(SQLString, connection);
 8                 command.Fill(contractDataSet, "ContractDetail");
 9             }
10             catch (System.Data.SqlClient.SqlException ex)
11             {
12                 throw new Exception(ex.Message);
13             }
14         }

 

 1 using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(Ecms.DbHelper.DbHelperSQL.connectionString))
 2         {
 3             SQLString = "Select CompanyName,Address,CompanyPhone,Fax,Bank,AccountNumber,Heading,Chop From Tbl_CompanyUser Where CompanyID=" + leftComanyID;
 4             try
 5             {
 6                 connection.Open();
 7                 System.Data.SqlClient.SqlDataAdapter command = new System.Data.SqlClient.SqlDataAdapter(SQLString, connection);
 8                 command.Fill(contractDataSet, "leftCompanyModel");
 9             }
10             catch (System.Data.SqlClient.SqlException ex)
11             {
12                 throw new Exception(ex.Message);
13             }

14         } 

 

 

  通过类似上面4次组装,才算把数据源给搞定,然后又通过查询单独数据的方式组装了另一个表

contractDataSet.ImageTable.AddImageTableRow(temprightSignatureBuff,
                                                            temprightSignatureBuff,
                                                            templeftChopBuff,
                                                            temprightChopBuff);

2.自动补白,由于我的报表是合同报表,用户要求合同产品清单少于7条的时候,能用空白填充

说到这里,不得不感谢一下泰哥, 看了他几个DEMO才稍微了解 报表里面的专家是个什么东西

3.ToolBar图片不显示的问题

这个简单,缺少了文件而已

4.报表中显示图片的问题,这个问题折磨了我长达3个小时

问题其实是个小问题,事情是这样的:

在我的数据文件中,我把四个显示图片的字段做成了一个单独的DataTable,然后就拖到报表中,然后给他们赋值,一切都很快(很享受这感觉,呵呵),到要运行的时候,才突然想起来字段的数据类型没有更改。改过之后,又犯了个错误,没有马上刷新数据集,重新设计报表,最终导致了我长达3个小时的杯具,教训啦· 后来,没办法啊,我就开始写Winform使用报表的Demo,结果 很顺利的就出来了,图片 啥的都显示的好好的。最后,找到问题原因 的时候,都快吐血了,记得星爷的唐伯虎点秋香吗,对 ,就像那样狂喷。

问题解决了,所以记录一下。如果文章有人观赏,请勿拍砖,谢谢!最好是能给点您在这方面更加好的经验,期待。。。

上个DataSet图 

 

作者: HK——BB 发表于 2011-08-22 20:10 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"