CSFrameworkV6旗舰版 - 主从子表(多级明细表)设计方案
目录
1、前言
主从子表(多级明细表)在我们开发软件时比较常见,主要特点是数据结构至少有三张表以上。包含主表、明细表、二级明细表。
表现的形式多样化,标准格式是主从子表结构(如:ABC结构),主从从子表结构(ABBC)、ABBCC,ABCC结构等。
2、界面效果
3、数据表结构设计
主表 tb_PN
isid:记录主键(雪花id值),标识该记录的唯一性。
PNNO:单据号码
明细A tb_PNDtlA
isid:记录主键(雪花id值),标识该记录的唯一性。
RowID:如果当前表有2级明细表,作为主键使用,用于关联2级明细表。界面新增记录时自动给RowID赋值。
PNNO:单据号码,作为外键,对应主表的PNNO字段。
明细B tb_PNDtlB
isid:记录主键(雪花id值),标识该记录的唯一性。
RowID:如果当前表有2级明细表,作为主键使用,用于关联2级明细表。界面新增记录时自动给RowID赋值。
PNNO:单据号码,作为外键,对应主表的PNNO字段。
二级明细(明细A的子表)tb_PNDtlASub
isid:记录主键(雪花id值),标识该记录的唯一性。
RowID:作为外键,对应父级表的RowID字段。
PNNO:单据号码,作为外键,对应主表的PNNO字段。
4、UI 界面层
如果是业务单据窗体,继承 frmBaseBusinessForm 基类。
基础资料窗体,继承 frmBaseDataDictForm 基类。
C# 全选
public partial class frmPN : frmBaseBusinessForm
{
private bllPN _BLL;
public frmPN()
{
InitializeComponent();
}
private void frmtb_PN_Load(object sender, EventArgs e)
{
this.InitializeForm();
}
//省略代码.....
}
5、BLL 业务逻辑层
主从子表的BLL层,因为数据结构和逻辑比较复杂,建议使用单独的类(不需要继承bllBase基类)。
C# 全选
/// <summary>
/// 主从子表(三层表或多明细表)建议使用独立的类,不需要继承bll基类。
/// </summary>
public class bllPN
{
private IBridge_PN _Bridge;
/// <summary>
/// 构造器
/// </summary>
public bllPN()
{
_Bridge = this.CreateBridge();
}
/// <summary>
/// 当前实体数据
/// </summary>
public BusinessData_PN CurrentBusiness { get; set; }
/// <summary>
/// 主表数据
/// </summary>
public tb_PN DataBinder => this.CurrentBusiness.Master;
/// <summary>
/// 创建策略接口实例
/// </summary>
/// <returns></returns>
private IBridge_PN CreateBridge()
{
if (BridgeFactory.IsADODirect)
return new dalPN(Core.Loginer.CurrentUser);
if (BridgeFactory.IsWebApi)
return new WebApi_PN();
throw new Exception(BridgeFactory.UNKNOW_BRIDGE_TYPE);
}
//省略代码......
}
6、DAL 数据层
DAL层参考:
C# 全选
[DefaultORM_UpdateMode(typeof(tb_PN), true)]
public class dalPN : dalBaseBusiness, IBridge_PN
{
public dalPN(Core.Loginer loginer) : base(loginer)
{
//
}
//省略代码......
}
7、特殊模型设计
界面数据实体模型设计
如点【查看】按钮,需要从数据库读取完整的主从子表数据,数据模型参考:
C# 全选
/// <summary>
/// PN工艺单:主从子表复合模型
/// </summary>
public class BusinessData_PN
{
public BusinessData_PN()
{
this.Master = new tb_PN();
this.DetailsA = new List<tb_PNDtlA>();
this.DetailsASub = new List<tb_PNDtlASub>();
this.DetailsB = new List<tb_PNDtlB>();
}
/// <summary>
/// 主表数据
/// </summary>
public tb_PN Master { get; set; }
/// <summary>
/// 第1个明细表
/// </summary>
public List<tb_PNDtlA> DetailsA { get; set; }
/// <summary>
/// 第2个明细表
/// </summary>
public List<tb_PNDtlB> DetailsB { get; set; }
/// <summary>
/// 三级表
/// </summary>
public List<tb_PNDtlASub> DetailsASub { get; set; }
}
DAL层实现
C# 全选
public BusinessData_PN GetDataByKey(string docNo)
{
var data = new BusinessData_PN();
var q_PN = _Database.GetQueryable<tb_PN>();
var q_PNDtlA = _Database.GetQueryable<tb_PNDtlA>();
var q_PNDtlB = _Database.GetQueryable<tb_PNDtlB>();
var q_PNDtlASub = _Database.GetQueryable<tb_PNDtlASub>();
data.Master = q_PN.Where(w => w.PNNO == docNo).FirstOrDefault();
data.DetailsA = q_PNDtlA.Where(w => w.PNNO == data.Master.PNNO).ToList();
data.DetailsASub = q_PNDtlASub.Where(w => w.PNNO == data.Master.PNNO).ToList();
data.DetailsB = q_PNDtlB.Where(w => w.PNNO == data.Master.PNNO).ToList();
return data;
}
8、其他设计方案(多层表) 参考
CSFrameworkV6旗舰版 - 基础资料窗体改装主从子表(多级明细表)解决方案
https://www.cscode.net/archive/newdoc/592789651951621.html
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网