Я видел, как это происходит, когда один ЦАП наследует (наследует как в наследовании классов, а не расширяет как в расширении ЦАП) от другого ЦАП без повторного выделения его ключевых полей. Способ исправить это - добавить родительские ключи в поля абстрактных классов в дочерних элементах.
В FSAppointmentDetService отсутствует объявление ключа AppointmentID. Когда ORM создает запрос SQL, он генерирует псевдоним для наследуемого ЦАП, но он запутывается, потому что ключевые поля родительского элемента не все были повторно объявлены в дочернем элементе.
В FSAppointmentDet у вас есть 2 ключевых поля:
#region AppointmentID
public abstract class appointmentID : PX.Data.IBqlField
{
}
[PXDBInt(IsKey = true)]
[PXParent(typeof(Select<FSAppointment, Where<FSAppointment.appointmentID, Equal<Current<FSAppointmentDet.appointmentID>>>>))]
[PXDBLiteDefault(typeof(FSAppointment.appointmentID))]
[PXUIField(DisplayName = "Appointment Nbr.")]
public virtual int? AppointmentID { get; set; }
#endregion
#region AppDetID
public abstract class appDetID : PX.Data.IBqlField
{
}
[PXDBIdentity(IsKey = true)]
public virtual int? AppDetID { get; set; }
#endregion
Но в FSAppointmentDetService объявлен только один из них. Обратите внимание, что он использует «override» для переопределения по сравнению с FSAppointmentDet, который не переопределяет:
#region AppDetID
public new abstract class appDetID : PX.Data.IBqlField
{
}
[PXDBIdentity(IsKey = true)]
public override int? AppDetID { get; set; }
#endregion
В этом случае мы не можем добавить поле к этому ЦАП, потому что оно является частью базового продукта. Я думаю, что было бы возможно создать новый ЦАП, который наследует его из FSAppointmentDetService, добавить отсутствующий ключ и использовать этот новый наследованный ЦАП вместо FSAppointmentDetService.
Однако я не знаю, возможно ли это при работе с веб-службами. В противном случае необходимо будет внести изменения в базовый продукт Acumatica. Вы можете заполнить отчет об ошибке с поддержкой Acumatica, чтобы сделать это в будущих версиях.