Как я могу связать несколько сеток / таблиц / ЦАП в один заголовок - PullRequest
0 голосов
/ 22 октября 2019

У меня есть пользовательский экран с заголовком и деталями, который работает нормально. У меня есть просьба добавить на экран несколько более подробных разделов / вкладок, привязанных к тому же заголовочному разделу - например, на экранах «Возможности» или «Контакты».

Мое понимание и способ, которым я всегда это делал, заключается в том, что когда вы настраиваете ЦАП между заголовком и подробностями, в ЦАП подробностей используются атрибут [PXParent] и [PXLineNbr]. ,затем в заголовке используется поле «LastLineNbr», отслеживающее номер строки в подробном разделе, на которое ссылается этот подробный атрибут PXLineNbr, как показано:

[PXLineNbr(typeof(HeaderTable.lastLineNbr))]

Если это поле LineNbr вдеталь связана с полем LastLineNbr в заголовке - как вы можете связать более одной таблицы сетки / сведений с одной и той же таблицей заголовка, как это делается в разделе «Возможности» или «Контакты»?

1 Ответ

0 голосов
/ 22 октября 2019

Поле в таблице заголовков по соглашению называется счетчиком строк и сокращенно Cntr. Его цель - предоставить уникальное значение для ключевого поля объекта детализации.

Распространенным заблуждением является то, что это значение поля должно быть последовательным, но поскольку это техническое поле, которое требуется только для того, чтобы быть уникальным, в контракт не входит предоставление последовательных значений.

Вот причинапочему SOLine DAC также добавляет поле SortOrder для предоставления последовательных значений: enter image description here

Если это поле LineNbr в деталях связано с полем LastLineNbr в заголовке - как можновы связываете несколько таблиц сетки / сведений с одной и той же таблицей заголовков, как это делается в разделе «Возможности или контакты»?

Ограничение заключается в том, что LineNbr будет уникальным в таблице сведений, а не последовательным. Вы можете иметь несколько таблиц подробностей, привязанных к одному счетчику строк. Я считаю, что должно работать, поскольку он всегда будет предоставлять уникальный номер. Однако, поскольку все таблицы подробностей имеют один и тот же счетчик, сущность детали не будет начинаться с 1. Вы можете создать 2 детализации DAC1 со значениями счетчика 1 и 2. Затем при создании детализации DAC2 счетчик будет иметь значение 3 вместо 1.

Повторное использование одного и того же счетчика для другой детализации, однако, не часто. Обычно в главном ЦАП создается один счетчик для каждой детали.

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
}
...