Использование REST для получения сведений о полевой службе - InventoryID = ошибка SQL: многокомпонентный идентификатор не найден - PullRequest
0 голосов
/ 30 октября 2018

Я получаю ошибки SQL при попытке использовать REST для доступа к FSAppointmentDet.InventoryID, либо как элемент службы полевой службы, либо как элемент инвентаризации.

Поле InventoryID существует в таблице, однако похоже, что ЦАП были унаследованы, например как FSAppointmentDetService.

Другие поля работают, просто кажется, что поля с идентификатором вызывают ошибку SQL.

В этом случае ошибка SQL является многошаговым идентификатором, который не найден. Запустив трассировку SQL Profiler и посмотрев SQL, похоже, что таблица была совмещена в одной части запроса, а не в другой. Очевидно, что это происходит на гораздо более низком уровне, чем мы можем достичь, поэтому ищите обходной путь или идеи о том, как получить подробные записи InventoryID для полевой службы.

1 Ответ

0 голосов
/ 31 октября 2018

Я видел, как это происходит, когда один ЦАП наследует (наследует как в наследовании классов, а не расширяет как в расширении ЦАП) от другого ЦАП без повторного выделения его ключевых полей. Способ исправить это - добавить родительские ключи в поля абстрактных классов в дочерних элементах.

В 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, чтобы сделать это в будущих версиях.

...