Ошибка «Недопустимое поле для обновления, должно быть настраиваемое поле внешнего идентификатора или стандартное индексируемое поле: имя» - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь ввести уникальные значения в объект «Контакт». Вот код:

List<Contact> conList = new List<Contact> {
        new Contact(FirstName='Joe',LastName='Smith',Department='Finance'),
        new Contact(FirstName='Kathy',LastName='Smith',Department='Technology'),
        new Contact(FirstName='Caroline',LastName='Roth',Department='Finance'),
        new Contact()};   

// Caroline Roth already exists so I want this code to update her record, not insert another Caroline Roth record          
Database.UpsertResult[] srList = Database.upsert(conList, Contact.Fields.Name, false);

В документации Salesforce говорится: «Оператор upsert сопоставляет объекты sObjects с существующими записями путем сравнения значений одного поля. Если вы не укажете поле при вызове этого оператора, оператор upsert использует идентификатор sObject для сопоставления sObject с существующими записями в Salesforce. Кроме того, вы можете указать поле, которое будет использоваться для сопоставления. Для настраиваемых объектов укажите настраиваемое поле, помеченное как внешний идентификатор. Для стандартных объектов вы можете указать любое поле, имеющее для свойства idLookup установлено значение true. Например, поле электронной почты контакта или User имеет свойство idLookup, установленное. «

У меня два вопроса: 1) как мы можем узнать, какие поля у объекта Contact свойство idLookup установлено на true 2) почему я получаю сообщение об ошибке в строке темы при выполнении кода?

1 Ответ

1 голос
/ 28 мая 2020

1:

Map<String, Schema.SObjectField> contacFieldsMap = Schema.getGlobalDescribe().get('Contact').getDescribe().fields.getMap();

for (Schema.SObjectField field : contacFieldsMap.values()) {
    Schema.DescribeFieldResult fieldResult = field.getDescribe();
    if (fieldResult.isIdLookup()) System.debug(fieldResult.getName() + ' IS idLookup');
}

2: System.debug(Contact.Name.getDescribe().isIdLookup()); // false

...