一般的单据都是由主从关系的,比如部门与人员、单据表头与表身、仓库与存货、分类与档案等等 所以主从关系是报表用的最多的
1.准备数据库 简单方便
--主表create table RdRecord (id int primary key identity(1,1),BillCode nvarchar(32) unique not null,BillVenOrCus nvarchar(64),BillDate datetime default (getDate()))--从表create table rdrecords(autoid int primary key identity(1,1),id int not null,InvCode nvarchar(32),Quantity decimal(18,3) default 0)insert into rdrecord (BillCode,BillVenOrCus) values('001','华为')insert into rdrecord (BillCode,BillVenOrCus) values('002','长虹')insert into rdrecords(id,invCode,Quantity) values(1,'彩电',2000)insert into rdrecords(id,invCode,Quantity) values(1,'手机',2000)insert into rdrecords(id,invCode,Quantity) values(1,'手表',2000)insert into rdrecords(id,invCode,Quantity) values(4,'彩电',5000)insert into rdrecords(id,invCode,Quantity) values(4,'手机',20)insert into rdrecords(id,invCode,Quantity) values(4,'手表',100)
1.窗体还用上节的form1,报表新建一个ParentAndSonReport 控件有点多 我就用图表示了。
2 form1 加一个button 一个textBox 双击button2写下代码 查出主从表,并确定关系
private void btnPAndS_Click(object sender, EventArgs e) { using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=123;database =test")) { DataSet ds = new DataSet(); int iID; if (int.TryParse(textBox1.Text, out iID)) { } else { iID = 0; } con.Open(); SqlCommand cmd = new SqlCommand("select * from rdrecord --where id =@id "); //可查询单个数据 这个就不说了 这样 主从体现不出来 所以注释掉了 cmd.Connection = con; cmd.Parameters.Add(new SqlParameter("@id", iID)); SqlDataAdapter ada = new SqlDataAdapter(cmd); ada.Fill(ds, "RD");//查出 主表 填充 dataset 名为RD cmd = new SqlCommand("select * from rdrecords --where id =@id ");//同上 cmd.Connection = con; cmd.Parameters.Add(new SqlParameter("@id", iID)); ada = new SqlDataAdapter(cmd); ada.Fill(ds, "RDS");//细表 同上 //建立主从关系 DataColumn ParentColumn = ds.Tables["Rd"].Columns["ID"]; DataColumn ChildColumn = ds.Tables["Rds"].Columns["id"]; DataRelation rel = new DataRelation("Rel", ParentColumn,ChildColumn); ds.Relations.Add(rel); ParentAndSonReport psr = new ParentAndSonReport(ds); documentViewer1.DocumentSource = psr; psr.CreateDocument(); } }
3.报表重载构造函数 数据绑定
namespace XtrReportLearn{ public partial class ParentAndSonReport : DevExpress.XtraReports.UI.XtraReport { public ParentAndSonReport() { InitializeComponent(); } //重载 最好复制无参构造函数再修改 我总会忘掉初始化 public ParentAndSonReport(DataSet ds) { InitializeComponent(); //如果出现 只有一条数据问题那么绑定出问题了 要检查下边的绑定 this.DataSource = ds; this.DataMember = "RD"; this.DetailReport.DataMember = "Rel";//这个地方一定要是关系的名字 不然 从表数据就全出来了 分不开了 this.DetailReport.DataSource = ds; RDID.DataBindings.Add("Text", ds, "rd.ID"); BillCode.DataBindings.Add("Text", ds, "rd.BillCode"); BillDate.DataBindings.Add("Text", ds, "rd.BillDate"); RDIDs.DataBindings.Add("Text", ds, "Rel.ID"); InvCodoe.DataBindings.Add("Text", ds, "Rel.InvCode"); Quantity.DataBindings.Add("Text", ds, "Rel.Quantity"); } }}
是终效果图: