下面介绍主从表(Master/Detail Report)报表:
报表设计 (Report Designer)
Group Header/Group Footer (主/从表组定义)
主/从表报表必须增加一组Group及至少两个DataBand(Data1,Data2),Group的条件设置为主/从表的主外键关联字段名,如单据号码SONO,在GroupHeader绿色区域双击打开窗体如下:
Group Condition区域设置为[tb_SO.SONO], tb_SO是表名,SONO是销售订单的单号, FastReport引擎是跟据组的条件和Band.Relation定义的关联实现主从报表的。
增加主/从表的两个DataBand
主菜单: Report/Configure Bands…
在Configure Bands窗体内定义DataBand主从关系,如下图:
绑定数据字段 (Binding Data Field)
在Data1(主表)内拖放TextObject组件,设置Text的属性对应字段名,如[tb_SO.SONO]
在Data2(从表)内拖放TextObject组件,设置Text的属性对应字段名,如[tb_SOs.StockCode]
拖放的TextObject组件可以对其绑定字段,具体作法是给Text属性赋值,比如:
[tb_SO.SONO] ,tb_SO是DataTable的名称(DataTable.Name),SONO是字段名,绑定的字段必须加中括号!(重要)
网上有很多复杂的做法,比如:写代码给TextObject .DataBindings属性增加一个DataBinding对象,其实不必要这样做,在Designer内给Text属性指定一个字符串就可以了。
报表金额或数量汇总
报表内会有金额汇总,数量汇总等数据汇总要求,在Report内增加一个Report Summary , 然后
在Data 操作面板内选择Σ Total ,右键New Total.
Edit Total 窗体:
Total Name: 汇总名称定义。
Function: 函数类型,有Sum/Min/Max/Average/Count函数可选。
Data Column or Expression: 字段名或表达式。(重要)
Evaluate on each row of the band: 用于统计计算指定Band的记录。(重要)
Evaluate if the following condition is met: 仅统计计算符合以下条件的记录。
Print on the band: 在指定的Band上放置Total对象。(重要)
Options , 只勾选Reset after print选项即可。
金额或数量小计 (Group Footer , SubTotoal)
用户可能按日期范围一次性查询多张单据,这时需要对每张业务单据的金额或数量分别进行汇总作为小计,
只要在Group Footer区域内拖放一个刚定义的Σ Total 组件就行了。
金额或数量汇总 (Report Summary, Grant Total)
对多张单据的总金额汇总,只要在Report Summary区域内拖放一个刚定义的Σ Total 组件就行了。
系统变量/系统函数 System Variables
设计好报表,然后动态加载数据源
代码设计
主/从报表需要定义一组Group及两个DataBand,然后给DataBand绑定数据源。(重要)
更重要是给明细表设置主外键关系。(重要)
代码如下:
C# Code:
private void button4_Click(object sender, EventArgs e)
{
//打印主从表数据
string file = Application.StartupPath @"\MasterDetail.frx";
rptMasterDetail.Load(file);//加载报表模板文件
DataSet ds = DAL.GetMasterDetailData();//取报表数据
rptMasterDetail.RegisterData(ds.Tables[0], "tb_SO"); //注册数据源,主表
rptMasterDetail.RegisterData(ds.Tables[1], "tb_SOs"); //注册数据源,从表
//
//直接注册DataSet也行,但必须对DataSet.Tables指定表名!
//FastReport是跟据表名取DataTable对象的。
//
//rptMasterDetail.RegisterData(ds);
//
//给DataBand(主表数据)绑定数据源
DataBand masterBand = rptMasterDetail.FindObject("Data1") as DataBand;
masterBand.DataSource = rptMasterDetail.GetDataSource("tb_SO"); //主表
//给DataBand(明细数据)绑定数据源
DataBand detailBand = rptMasterDetail.FindObject("Data2") as DataBand;
detailBand.DataSource = rptMasterDetail.GetDataSource("tb_SOs"); //明细表
//重要!!给明细表设置主外键关系!
detailBand.Relation = new Relation();
detailBand.Relation.ParentColumns = new string[] { "SONO" };
detailBand.Relation.ParentDataSource = rptMasterDetail.GetDataSource("tb_SO"); //主表
detailBand.Relation.ChildColumns = new string[] { "SONO" };
detailBand.Relation.ChildDataSource = rptMasterDetail.GetDataSource("tb_SOs"); //明细表
//准备工作,显示报表预览窗体
rptMasterDetail.Prepare();
rptMasterDetail.ShowPrepared(true, this);
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
具体步骤:
1. 加载报表模板文件,Load()。
2. 通过DAL层获取报表数据,返回DataSet类型,包含两张数据表(主表tb_SO, 明细表tb_SOs)。
3. RegisterData,注册数据源。(重要)
4. 给DataBand对象绑定数据源,名为Data1绑定主表,Data2绑定明细表。(重要)
5. 给明细表DataBand设置主外键关系。 (重要)
6. 准备报表,显示预览窗体。
总结:
主/从表报表比较复杂,主要是两方面:报表设计和编写源码,但通过本文的详细介绍我相信您完全可以开发一份简单的主从报表了。
FastReport for .Net 报表开发实例(C#源码下载)
http://www.csframework.com/archive/1/arc-1-20110610-1532.htm