1、需求
原直接通过当前生产单查询该单据下的产品明细。客户要求在该生产单下,产品之上加一层包装关系。即点击生产单查询包装,并可对包装进行编辑,再点击包装可对该包装下的产品进行操作。
2、页面布局设计
原布局
设计后布局
布局就采用最直观的方式让客户明白其中操作的逻辑,从左往右查询。
新增加的包装表格前端代码
通过Layout属性 来确定表格的排列方向水平,再由RegionPosition确定该表格的位置居中,(center是相对于left和right的),由此完成布局。
3、数据库设计
生产单(Se_producenotice)
产品表(Se_producenoticeSub)
包装表(Se_producepackaging)
原逻辑:Se_producenotice.ID = Se_producenoticeSub.PID
改变后逻辑:Se_producenotice.ID = Se_producepackaging.PID
Se_producepackaging.ID = Se_producenoticeSub.PID
4、注意
删除包装时需要校验当前包装下是否有产品,如果有,先提示。删除产品后才可删除包装。避免产品无包装囊括,不利于之后统计校验包装下的产品数量。
//判断该包装下是否有产品
Taurus tEntity = new Taurus();
Se_producenoticeSub spd = new Se_producenoticeSub();
spd = tEntity.Se_producenoticeSub.Where((Se_producenoticeSub ss) => ss.PackID == rowGid).FirstOrDefault();
if (spd != null)
{
ShowNotify("请先删除包装中产品!");
return;
}
5、产生问题
重新建立生产单、产品表、包装表的联系后,新数据正常,老数据消失。
原因:原来产品的PID为生产单,通过生产单主键进行查询,现在PID为包装,而包装是新表,作为产品的PID下只能查询到新增的产品。
解决方法:保持之前的生产单和产品的联系,同时新增加入包装表的关系。
给产品表增加一个字段(PackID)用于储存包装主键,
且Se_producenotice.ID = Se_producepackaging.PID,而原生产单和产品表关系不变。
数据呈现:点击生产单会绑定一次产品列表(原关系:生产单、产品),点击包装表会重新绑定一次产品列表(新关系:包装单、产品)。
后端保存及修改代码:
//现包装信息保存
protected void btnCenterSave_Click(object sender, EventArgs e)
{
bool isAdd = Session[IsAdd] == null ? false : ConvertEx.ToBoolean(Session[IsAdd]);
Taurus tContext = new Taurus();
Guid LeftGridID = ConvertEx.ToGuid(LeftGrid.DataKeys[LeftGrid.SelectedRowIndex][0]);
Taurus tEntity = new Taurus();
Se_producenotice spro = new Se_producenotice();
if (isAdd)
{
Se_producepackaging pack = new Se_producepackaging();
Guid ID = Guid.NewGuid();
pack.ID = ID;
pack.PID = LeftGridID;
pack.length = ConvertEx.ToDecimal(letxt_length.Text);
pack.width = ConvertEx.ToDecimal(letxt_width.Text);
pack.height = ConvertEx.ToDecimal(letxt_height.Text);
pack.volume = ConvertEx.ToDecimal(letxt_volume.Text);
pack.qty = ConvertEx.ToDecimal(letxt_qty.Text);
pack.Containernumber = ConvertEx.ToDecimal(letxt_Containernumber.Text);
tEntity.Se_producepackaging.Add(pack);
var res = tEntity.SaveChanges();
if (res > 0)
{
ShowNotify("新增成功!");
}
else { ShowNotify("新增失败!"); }
}
else
{
Guid rowGid = ConvertEx.ToGuid(LeftGrid.DataKeys[LeftGrid.SelectedRowIndex][0]);
Guid ID = ConvertEx.ToGuid(packGrid.DataKeys[packGrid.SelectedRowIndex][0]);
Se_producepackaging pack = tEntity.Se_producepackaging.Where(m => m.PID == rowGid).FirstOrDefault();
if (pack == null)
{
return;
}
pack.ID = ID;
pack = tContext.Se_producepackaging.Where(m => m.ID == (ID)).FirstOrDefault();
tContext.Entry(pack).State = System.Data.Entity.EntityState.Modified;
pack.length = ConvertEx.ToDecimal(letxt_length.Text);
pack.width = ConvertEx.ToDecimal(letxt_width.Text);
pack.height = ConvertEx.ToDecimal(letxt_height.Text);
pack.volume = ConvertEx.ToDecimal(letxt_volume.Text);
pack.qty = ConvertEx.ToDecimal(letxt_qty.Text);
pack.Containernumber = ConvertEx.ToDecimal(letxt_Containernumber.Text);
if (tContext.SaveChanges() > 0)
{
ShowNotify("修改成功!");
}
else { ShowNotify("修改失败!"); }
}
BindCenterGrid(0, "updatedTime", ConvertEx.ToGuid(LeftGrid.DataKeys[LeftGrid.SelectedRowIndex][0]));
packWindow.Hidden = true;
}
劣势:绑定方法重写,代码相对冗余,解决方法,暂无。
6、阶段成果
比较直观地展示出生产单、包装和产品之间的关系,同时保留了老数据。