【问题标题】:How can I tie multiple grids / tables / DACs to one header如何将多个网格 / 表格 / DAC 绑定到一个标题
【发布时间】:2019-10-23 04:39:27
【问题描述】:

我有一个带有标题和详细信息的自定义屏幕,效果很好。我有一个请求,向屏幕添加更多详细信息部分/选项卡,绑定到相同的标题部分 - ala 机会或联系人屏幕。

我的理解以及我一直这样做的方式是,当您在标头和详细信息之间设置 DAC 时,详细信息 DAC 中使用了 [PXParent] 属性和 [PXLineNbr]。然后在标题中使用“LastLineNbr”字段,跟踪详细信息部分中的行号,在该详细信息 PXLineNbr 属性中引用,如下所示:

[PXLineNbr(typeof(HeaderTable.lastLineNbr))]

如果详细信息中的 LineNbr 字段与标题中的 LastLineNbr 字段相关联 - 如何将多个网格/详细信息表链接到同一个标题表,就像在商机或联系人中所做的那样?

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    标题表中的字段按惯例称为行计数器,缩写为Cntr。其目的是为详细实体的键字段提供唯一值。

    一个常见的误解是这个字段值需要是连续的,但由于它是一个只需要唯一的技术字段,它的合同不包括提供顺序值。

    这就是 SOLine DAC 还添加一个 SortOrder 字段来提供顺序值的原因:

    如果详细信息中的 LineNbr 字段与 LastLineNbr 字段相关联 在标题中 - 如何将多个网格/详细表链接到 与“机会”或“联系人”中相同的标题表?

    约束是 LineNbr 在明细表中是唯一的,而不是顺序的。您可以将多个详细信息表绑定到同一个行计数器。我相信这应该可以工作,因为它总是会提供唯一的号码。但是,由于所有详细信息表共享相同的计数器,因此详细信息实体不会全部从 1 开始。您可以使用计数器值 1 和 2 创建 2 个详细信息 DAC1。然后,当您创建详细信息 DAC2 时,计数器将为 3 而不是 1。

    虽然对不同的细节实体重复使用相同的计数器并不常见。通常,您会在主 DAC 中为每个详细实体创建一个计数器。

    SOOrder/SOLine 和 SOOrder/SOPackageInfo 证明:

    // Master DAC - SOOrder contains multiple Cntr fields used by multiple detail entity
    class SOOrder : IBqlTable
    {
        #region LineCntr for SOLine entity
        public abstract class lineCntr : PX.Data.BQL.BqlInt.Field<lineCntr> { }
        protected Int32? _LineCntr;
        [PXDBInt()]
        [PXDefault(0)]
        public virtual Int32? LineCntr
        {
            get
            {
                return this._LineCntr;
            }
            set
            {
                this._LineCntr = value;
            }
        }
        #endregion
    
        #region PackageLineCntr for SOPackageInfo entity
        public abstract class packageLineCntr : PX.Data.BQL.BqlInt.Field<packageLineCntr> { }
        protected Int32? _PackageLineCntr;
        [PXDBInt()]
        [PXDefault(0)]
        public virtual Int32? PackageLineCntr
        {
            get
            {
                return this._PackageLineCntr;
            }
            set
            {
                this._PackageLineCntr = value;
            }
        }
        #endregion
    }
    
    // Detail 1 - SOLine uses SOOrder.lineCntr
    class SOLine : IBqlTable
    {
        #region LineNbr
        public abstract class lineNbr : PX.Data.BQL.BqlInt.Field<lineNbr> { }
        protected Int32? _LineNbr;
        [PXDBInt(IsKey = true)]
        [PXLineNbr(typeof(SOOrder.lineCntr))]
        [PXUIField(DisplayName = "Line Nbr.", Visible = false)]
        public virtual Int32? LineNbr
        {
            get
            {
                return this._LineNbr;
            }
            set
            {
                this._LineNbr = value;
            }
        }
        #endregion
    }
    
    // Detail 2 - SOPackageInfo uses SOOrder.packageLineCntr
    class SOPackageInfo : IBqlTable
    {
        #region LineNbr
        public abstract class lineNbr : PX.Data.BQL.BqlInt.Field<lineNbr> { }
        protected Int32? _LineNbr;
        [PXDBInt(IsKey = true)]
        [PXLineNbr(typeof(SOOrder.packageLineCntr))]
        [PXUIField(DisplayName = "Line Nbr.", Visible = false)]
        public virtual Int32? LineNbr
        {
            get
            {
                return this._LineNbr;
            }
            set
            {
                this._LineNbr = value;
            }
        }
        #endregion
    }
    

    【讨论】:

    • 非常感谢您的回答!我会试试看。 ;D
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2013-03-28
    • 1970-01-01
    相关资源
    最近更新 更多