日期:2014-05-20  浏览次数:20794 次

[分享]水晶报表 分类统计之子报表法
本文为解http://topic.csdn.net/u/20100808/15/64b63191-d751-4061-8918-498493085839.html所作。

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

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


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

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

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

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


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

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

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


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

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

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

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

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

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;

最终运行效果如下




不知道大家有什么更好的方法,欢迎讨论。。

------解决方案--------------------
顶楼主,都开始出作品了。
------解决方案--------------------
很好,帮顶,给分,谢谢!
------解决方案--------------------
为啥9点发的帖子,我现在才看到啊
------解决方案--------------------
好帖子 顶了 呵呵
------解决方案--------------------
这贴很好,很不错哦!! 嘿嘿
------解决方案--------------------
字段资源管理器中右
------解决方案--------------------
不错,欣赏了

------解决方案--------------------
不错!!!
------解决方案--------------------
不错,学习了。
------解决方案--------------------
顶,支持!
------解决方案--------------------