Я запускаю следующий апекс:

SObjectType contactType = Schema.getGlobalDescribe().get('Contact');

Map<String, Schema.SObjectField> allContactFields = contactType.getDescribe().fields.getMap();

for(Schema.SObjectField field: allContactFields.values()){
    System.debug('field: ' + field);
}

Вот результат, который я получаю:

16:07:55.14 (91806772)|USER_DEBUG|[6]|DEBUG|field: Id
16:07:55.14 (91866937)|USER_DEBUG|[6]|DEBUG|field: IsDeleted
16:07:55.14 (91910290)|USER_DEBUG|[6]|DEBUG|field: MasterRecordId
16:07:55.14 (91962227)|USER_DEBUG|[6]|DEBUG|field: AccountId
16:07:55.14 (91995161)|USER_DEBUG|[6]|DEBUG|field: LastName
16:07:55.14 (92023524)|USER_DEBUG|[6]|DEBUG|field: FirstName
16:07:55.14 (92049920)|USER_DEBUG|[6]|DEBUG|field: Salutation
16:07:55.14 (92077124)|USER_DEBUG|[6]|DEBUG|field: Name
16:07:55.14 (92106382)|USER_DEBUG|[6]|DEBUG|field: RecordTypeId
16:07:55.14 (92134512)|USER_DEBUG|[6]|DEBUG|field: OtherStreet
16:07:55.14 (92160046)|USER_DEBUG|[6]|DEBUG|field: OtherCity
16:07:55.14 (92189198)|USER_DEBUG|[6]|DEBUG|field: OtherState
16:07:55.14 (92214368)|USER_DEBUG|[6]|DEBUG|field: OtherPostalCode
16:07:55.14 (92238796)|USER_DEBUG|[6]|DEBUG|field: OtherCountry
16:07:55.14 (92263303)|USER_DEBUG|[6]|DEBUG|field: OtherLatitude
16:07:55.14 (92287472)|USER_DEBUG|[6]|DEBUG|field: OtherLongitude
16:07:55.14 (92312118)|USER_DEBUG|[6]|DEBUG|field: OtherGeocodeAccuracy
16:07:55.14 (92337971)|USER_DEBUG|[6]|DEBUG|field: OtherAddress
16:07:55.14 (92366249)|USER_DEBUG|[6]|DEBUG|field: MailingStreet
...

Итак, объект Contact имеет следующие поля (например): LastName, FirstName, MailingStreet.

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

Итак, откуда берутся эти поля или почему я их не вижу в ОМ?

Спасибо.

0
nicedaytoday 18 Ноя 2018 в 19:14

1 ответ

Лучший ответ

MailingAddress — это составное поле, тип которого, как вы видите в диспетчере объектов, — Address.

То, что вы получаете от Describe API, включает в себя оба компонента составного поля, например MailingStreet, MailingCity и т. д., а также составное поле. сам, MailingAddress. В Диспетчере объектов отображается только родительское составное поле.

Составные поля (Адреса и Геолокации) имеют некоторые уникальные характеристики. Они всегда доступны только для чтения как составные поля, но их компонентные поля могут быть доступны для записи. Подробнее о них можно прочитать в SOAP API. руководство разработчика:

Составные поля доступны только для чтения. Изменения выполняются путем записи в отдельные поля компонента. Это поддерживает единый согласованный метод выполнения обновлений и позволяет избежать возможных конфликтов. Например, если и составное поле BillingAddress, и поле отдельного компонента BillingCity были обновлены в одном и том же вызове API, было бы неясно, какое значение следует сохранить.

Есть два составных поля Address в объекте Contact и два в объекте Account, а также несколько других в других местах модели данных (обратите внимание, что ссылка представляет собой примечания к выпуску Spring '14, а некоторая другая информация там была заменена). Адреса существуют только как стандартные поля; вы можете создавать настраиваемые поля геолокации.

Вы можете идентифицировать поля адреса, вызвав getType() для их DescribeFieldResult, что вернет "ADDRESS". Поля компонентов будут возвращать свои правильные типы ("STRING" и т. д.).

Name — это основное поле объектов Salesforce, для которого иногда действуют специальные правила. Для контакта Name обрабатывается как составное поле, компонентами которого являются FirstName и LastName. То же самое относится и к полю Name для учетных записей лиц.

Обнаружение соединений только через API

Если вы работаете с информацией описания REST API, вы можете получить доступ к ключу compoundFieldName в информации, описывающей каждое поле. Поле Some_API_Name__c является составным, если любое другое поле того же объекта имеет Some_API_Name__c в своем слоте compoundFieldName.

2
David Reed 23 Дек 2018 в 03:17
Да, я расширил свой ответ.
 – 
David Reed
18 Ноя 2018 в 19:29
Хм. Понятно, что я могу проверить, имеет ли поле тип Address. Но как насчет общего подхода здесь? Можно ли для любого Schema.SObjectField сказать, составное оно или нет?
 – 
nicedaytoday
18 Ноя 2018 в 19:33
Я не думаю, что есть какой-либо метод, который инкапсулирует все особые случаи. Например, Name в контакте имеет тип и тип SOAP "String", хотя ведет себя как составное поле.
 – 
David Reed
18 Ноя 2018 в 19:52