CSFrameworkV6旗舰版 | 主从子表(多级明细表)设计方案|C/S开发框架
作者:csframework|C/S框架网  发布日期:2024/10/20 11:53:24

1、前言

主从子表(多级明细表)在我们开发软件时比较常见,主要特点是数据结构至少有三张表以上。包含主表、明细表、二级明细表。

表现的形式多样化,标准格式是主从子表结构(如:ABC结构),主从子表结构(ABBC)、ABBCC,ABCC结构等。

2、界面效果

CSFrameworkV6旗舰版 | 主从子表(多级明细表)设计方案|C/S开发框架

3、数据表结构设计

CSFrameworkV6旗舰版 | 主从子表(多级明细表)设计方案|C/S开发框架

主表 tb_PN

CSFrameworkV6旗舰版 | 主从子表(多级明细表)设计方案|C/S开发框架

isid:记录主键(雪花id值),标识该记录的唯一性。

PNNO:单据号码

明细A tb_PNDtlA

CSFrameworkV6旗舰版 | 主从子表(多级明细表)设计方案|C/S开发框架

isid:记录主键(雪花id值),标识该记录的唯一性。

RowID:如果当前表有2级明细表,作为主键使用,用于关联2级明细表。界面新增记录时自动给RowID赋值。

PNNO:单据号码,作为外键,对应主表的PNNO字段。

明细B tb_PNDtlB

CSFrameworkV6旗舰版 | 主从子表(多级明细表)设计方案|C/S开发框架

isid:记录主键(雪花id值),标识该记录的唯一性。

RowID:如果当前表有2级明细表,作为主键使用,用于关联2级明细表。界面新增记录时自动给RowID赋值。

PNNO:单据号码,作为外键,对应主表的PNNO字段。

二级明细(明细A的子表)tb_PNDtlASub

CSFrameworkV6旗舰版 | 主从子表(多级明细表)设计方案|C/S开发框架

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

C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇