Поле в таблице заголовков по соглашению называется счетчиком строк и сокращенно Cntr. Его цель - предоставить уникальное значение для ключевого поля объекта детализации.
Распространенным заблуждением является то, что это значение поля должно быть последовательным, но поскольку это техническое поле, которое требуется только для того, чтобы быть уникальным, в контракт не входит предоставление последовательных значений.
Вот причинапочему SOLine DAC также добавляет поле SortOrder для предоставления последовательных значений:
Если это поле 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
}