НЕПРАВИЛЬНО: в поле данных указано «Отображаемое имя» - «ContactID» - это 102155, а не «Вегвайзер, Эрик»
Ага!Спасибо всем за потенциально полезную информацию, которая может пригодиться в будущем.Однако эти проблемы и мое беспокойство о том, чтобы что-то делать неправильно, оказались «красными сельдями».Еще раз, странное несоответствие Acumatica в соблюдении своих собственных соглашений озадачило меня.
Я пытался выполнить запрос в том же формате, что и в другом месте, например https://mydomain.acumatica.com/entity/Default/18.200.001/Customer/ACME001
(где «ACME001» - это действительный идентификатор клиента), отлично работает и все хорошо.Принимая во внимание, что https://mydomain.acumatica.com/entity/Default/18.200.001/Contact/Nobody
(где «Никто» не является настоящим идентификатором контакта) не работает.
Почему?Несмотря на мой скептицизм и лучшее суждение, что 30-летний опыт программирования баз данных говорит мне, что ContactID Acumatica не является мудрой реализацией для уникального идентификатора записи ... Я верил тому, что мне сказали.Прямо там, в инспекторе свойств элемента, он говорит, что настоящее имя поля, помеченное «Contact ID», действительно, «ContactID».
Когда я в конце концов попробовал другую форму запроса,
https://mydomain.acumatica.com/entity/Default/18.200.001/Contact?$filter=LastName eq 'Wegweiser'&$select=FirstName,ContactID
Я наконец получил полезную нагрузку, которая показала мне правду: к сожалению, то, что в других местах было идентифицировано как «ContactID» и, согласно соглашению, разумно принято как уникальный идентификатор, на самом деле является разумно названным «DisplayName».Настоящий «ContactID», как и следовало ожидать, - это настоящий уникальный идентификатор.
Acumatica - удивительный инструмент.Это просто другое животное со многими головами (или, возможно, с хвостами), iMHO.
РЕДАКТИРОВАТЬ с помощью HB_ACUMATICA
Глядя на Contact.ContactID
определение поляв Contact
ЦАП он действительно объявлен как поле Integer
и не имеет настраиваемого атрибута, который возвращал бы отображаемое значение String
на экране:
#region ContactID
public abstract class contactID : IBqlField { }
[PXDBIdentity(IsKey = true)]
[PXUIField(DisplayName = "Contact ID", Visibility = PXUIVisibility.Invisible)]
[PXPersonalDataWarning]
public virtual Int32? ContactID { get; set; }
#endregion
Только с этим определением ЦАПдействительно не соответствует тому, что поле, отображаемое на экране, имеет тип String
вместо Integer
.Это объясняется тем, что Contact Screen
использует график ContactMaint
, который переопределяет поле DAC Contact.ContactID
с использованием механизма CacheAttached
:
[PXUIField(DisplayName = "Contact ID")]
[ContactSelector(true, typeof(ContactTypesAttribute.person), typeof(ContactTypesAttribute.employee))]
[PXMergeAttributes(Method = MergeMethod.Merge)]
public virtual void Contact_ContactID_CacheAttached(PXCache sender) { }
Обратите внимание, что переопределение поля Contact.ContactID
добавляетатрибут ContactSelector
, которого не было в Contact
DAC.Беглый взгляд на этот атрибут показывает, что он использует поле Description
, равное PXSelector
, для отображения строки DisplayName
на экране вместо значения Integer
.Эта замена предназначена только для отображения на экранах, ограниченных графиком ContactMaint
, все операции с базой данных остаются на основе Integer
.Отрывок ContactSelector:
public ContactSelectorAttribute(bool showContactsWithNullEmail, params Type[] contactTypes)
: base(GetQuery(typeof(Contact.contactID), showContactsWithNullEmail, contactTypes))
{
if (contactTypes == null || contactTypes.Length == 0)
throw new ArgumentNullException(nameof(contactTypes));
DescriptionField = typeof(Contact.displayName);
}
При вызове веб-службы REST не используется Contact
ЦАП вместо ContactMaint
графика, поэтому для него требуется Integer
вместо String
значения.