(作者:Turbocc,http://program.turbocc.cn)
以前我很少做财务软件,只是最近的一年里,在某公司开发一个财务处理模块,需要用到报表软件是用C#开发的,那最好不过就选择水晶报表了,以前没有用过,所以这次一用遇到很多问题。由于现在流行开发的都是面向对象ORM开发模式,不像以前表对程序那样天真了。水晶报表有两种开发方式,一种是一种就是水晶报表直接从数据库(数据源)中获取数据,就是水晶报表去拉(Pull),也叫提取;另外一种就是数据库将数据"推(Push)"给水晶报表,首先通过对象模型获取数据库数据,然后报表和对象关联起来,显示对象里的每个属性数据,这个推的关系需要你自己写代码来实现。
利用ORM开发模式开发的程序,一般都会选择Push模式,本人就使用Push模式,先看看代码示例:n)
ReportDocument rdoc = new ReportDocument();
string referencepath = @"BaseInfo/Commission/Report/";
rdoc.Load(referencepath + "DocumentReport.rpt");
rdoc.SetDataSource(Documents);
rdoc.Subreports["DocumentDealPropertyReport.rpt"].SetDataSource(((DocumentInfo)Documents[0]).DealPropertys);
rdoc.Subreports["DocumentOtherPropertyReport.rpt"].SetDataSource(((DocumentInfo)Documents[0]).OtherPropertys);
rdoc.Subreports["DocumentReceivableCommReport.rpt"].SetDataSource(((DocumentInfo)Documents[0]).ReceivableComms);
rdoc.Subreports["DocumentExteriorCommReport.rpt"].SetDataSource(((DocumentInfo)Documents[0]).ExteriorComms);
rdoc.Subreports["DocumentOtherFeeReport.rpt"].SetDataSource(((DocumentInfo)Documents[0]).OtherFees);
rdoc.Subreports["DocumentInteriorReceivableCommReport.rpt"].SetDataSource(((DocumentInfo)Documents[0]).InteriorReceivableComms);
rdoc.Subreports["DocumentInteriorRealCommReport.rpt"].SetDataSource(((DocumentInfo)Documents[0]).InteriorRealComms);
rdoc.Subreports["DocumentInteriorBadCommReport.rpt"].SetDataSource(((DocumentInfo)Documents[0]).InteriorBadComms);
其中Documents是一个继承IList接口的集合类,DocumentDealPropertyReport.rpt、DocumentOtherPropertyReport.rpt、DocumentReceivableCommReport.rpt......都是子表关联主表DocumentReport.rpt的主键Id。
在使用过程中本人遇到了两个非常棘手的问题:
1、报表不断弹出窗口要你输入数据库用户ID和密码,我一直在想,我是类来的,还输入什么密码哦~~~郁闷死了。
2、子报表不断出现关联不到主键Id的问题,更郁闷,在报表里明明设置好关联了,还说不行。
经过本人细心研究,终于知道了。
问题1原因:是由于数据源没有设置不匹配或则数据源没有设置。因为本人在测试过程中,有些子报表没给他添加数据源,就是没给子报表SetDataSource。
问题2原因:是本人在设置报表关联的时候,勾选了 【基于字段选择子报表中的数据】。勾了这个选项,子报表必须要有数据才能和主表关联起来,否则,会出现子报表没有关联主键Id的错误,没勾选子报表会根据主表的类属性来进行匹配。
好了这都是初学Push模式最常见的两个问题,本人总结了。在解决问题过程,本人找到了一个比较适合初学者学习的网站,供大家参考:阿泰的软件实用主义http://babyt.cnblogs.com/