[分享]水晶报表 分类统计之子报表法

阿双2009 程序猿  2010-08-09 09:05:25
加精
本文为解http://topic.csdn.net/u/20100808/15/64b63191-d751-4061-8918-498493085839.html所作。

我的思想是先把所有数据“扔”给水晶报表的主报表及其子报表,即无论是主报表还是子报表,接收的都是所有数据,所以分别对主报表和子报表进行数据过滤自然成为了本文的重点。

在项目中点右键添加新项,选择数据集xsd,进入数据集设计界面,新建两个DataTable,如图示


打开rpt设计界面,在字段资源管理器中右击数据库字段,进入“数据库专家”界面,
在 项目数据->ADO.NET数据集下会出现刚新建的数据集及数据表,把它“拉”到右边的“选定的表”中,然后在左上角切换到“链接”标签页,如图示

最后点右下角的确定按钮,此时我们会发现“数据库字段”下多出两个表(Dictionary和TableA)
接下来我们按DICTNAME分组,在报表空白处点右键->插入->组,在下拉框中选择"Dictionary.DICTNAME"
然后我们插入最最重要的子报表,同样在报表空白处点右键->插入->子报表,把它放在“组头”那一节,如图示继续操作:

右击子报表对象,选择更改子报表链接,操作如下

我们对子报表对象进行格式化一下,右击子报表对象,设置对象格式,如图示


然后我们在插入一个汇总,同样右击报表空白处->插入->汇总,操作如下

现在我们对主报表进行数据过滤,方法依旧是在报表空白处点右键->报表->选择专家,在弹出的界面里点击“显示公式>>>”按钮,设置过滤条件,如图示

至此,主报表界面设计完毕,最后的设计界面应该是这样的(看起来也蛮单调的:)就一个子报表对象和一个汇总字段);


主报表设计完,还要设计子报表,右击子报表对象->编辑子报表,此时我们会发现和刚刚设计的主报表界面一样,这是正常的,因为我们刚才选的正是主报表的设计模板,我们把不需要的东西去掉,只留下组名和汇总字段,其余节也全部抑制显示,最后的子报表界面应该是这样的

在子报表右击公式字段,新建一公式,取名Condition,进入公式编辑器,编辑如下:

if {?Pm-Dictionary.DICTNAME} = '技术类' then
'10051001'
else if {?Pm-Dictionary.DICTNAME} = '产品类' then
'10051002'

公式编辑完后要记得点击左上角的“保存并关闭”按钮
同样我们要对子报表数据进行过滤,方法同主报表一样,只是过滤条件不一样,如图示

这样我们设计部分就到此,最后进入代码部分

string ConnString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Administrator\Desktop\Database1.mdb"; //我这边以Access数据库进行测试,其他数据库同理
OleDbConnection conn = new OleDbConnection(ConnString);

string strSQL = "select DISTINCT DICTNO,DICTNAME,COLNAME from (select DICTNAME,DICTNO,a.COLNAME from dictionary a union all select a.DICTNAME,b.DICTNO,a.COLNAME from dictionary a inner join dictionary b on a.DICTNO=b.COLNAME union all select a.DICTNAME,c.DICTNO,a.COLNAME from (dictionary a inner join dictionary b on a.DICTNO=b.COLNAME) inner join dictionary c on b.DICTNO=c.COLNAME) t1 left join TableA t2 on t1.DICTNO=t2.science"; //查询出TableA中science的所有所属类型
OleDbDataAdapter da = new OleDbDataAdapter(strSQL, conn);
DataSet1 ds = new DataSet1();
da.Fill(ds.Dictionary); //填充到数据集DataSet1的Dictionary表

strSQL = "select * from TableA";
da = new OleDbDataAdapter(strSQL, conn);
da.Fill(ds.TableA); //填充到数据集DataSet1的TableA表

CrystalReport1 myReport = new CrystalReport1();
myReport.SetDataSource(ds); //为报表设置数据源
crystalReportViewer1.ReportSource = myReport;

最终运行效果如下




不知道大家有什么更好的方法,欢迎讨论。。
...全文
1130 点赞 收藏 51
写回复
51 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
超凡 2010-12-07
强人.
回复
tenliwu10 2010-08-14
学习学习
回复
nxm_2008 2010-08-13
刚接触,学习中
回复
wangjingjun0 2010-08-12
q j go 找锉分分
回复
阿双2009 2010-08-12
原帖需求变更,深入到第三层,解决方案可参考:
http://blog.csdn.net/luols/archive/2010/08/12/5808139.aspx
回复
tangjiejingjing 2010-08-12
xuexile
回复
qulun 2010-08-12
我就是来看看
回复
神之泪花 2010-08-12
回复
sdxazly 2010-08-12
我就是来看看
回复
r_rr_r 2010-08-12
很不错。支持下。
回复
llllkkkk20081970 2010-08-12
很好,学习中,谢谢分享!!
回复
zhourf372 2010-08-12
好的 谢谢
回复
chenzhongzhen 2010-08-12
xue xi le
回复
a123321wang 2010-08-12
好厉害 狂顶
回复
liuczerwca 2010-08-11
很不错的帖子,顶一个
回复
qianjide 2010-08-11
好帖子 顶下
回复
阿双2009 2010-08-11
[Quote=引用 23 楼 monisara 的回复:]
不太详细,这也只是你用的那个其实水晶报表很强大的,看样子楼主才入门,加油
[/Quote]

有什么好的方法还请monisara指教 :)
回复
你是我唯一 2010-08-11
不太详细,这也只是你用的那个其实水晶报表很强大的,看样子楼主才入门,加油
回复
navy_88 2010-08-11
O 了
回复
wkd04 2010-08-11
先顶,慢慢看。
回复
加载更多回复
相关推荐
发帖
图表区
创建于2007-09-28

4808

社区成员

.NET技术 图表区
申请成为版主
帖子事件
创建了帖子
2010-08-09 09:05
社区公告
暂无公告