Функция JavaScript для извлечения полей связанных объектов

Я использую следующий запрос, чтобы попытаться извлечь поля из поиска пользователя в учетной записи. В учетной записи есть поле с именем Dedicated_Rep__c, которое является поиском пользователя. Я строю свою кнопку на этой возможности и хочу получить имя, фамилию и адрес электронной почты выделенного представителя учетной записи. Вот мой код:

    function getDedicatedAccountRep (oppId) {
var result = sforce.connection.query("select Account.Id, Account.Dedicated_CS_Rep__r.FirstName from Opportunity where Id = '" + oppId + "' ");

if(!result || result['size'] != 1) { 
    return null;
    }

    var DedRepRole = result.getArray('records')[0];

    return DedRepRole.Account;
}

var dedicatedRep = getDedicatedAccountRep('{!Opportunity.Id}'); 

Я получаю ошибку:

Не удается прочитать свойство 'Dedicated_CS_Rep__c' из неопределенного

Я ссылаюсь на код позже в кнопке и создаю его экземпляр, добавив:edicRep.Dedicated_CS_Rep__r.FirstName

1 ответ

Начните с чего-то подобного (я предпочитаю консоль JavaScript в Google Chrome, вы можете открыть ее с помощью Ctrl+Shift+J; но вы можете свободно использовать Firefox + Firebug или инструменты разработчика IE...)

{!requireScript("/soap/ajax/29.0/connection.js")}

var result = sforce.connection.query("SELECT Account.Dedicated_CS_Rep__r.FirstName FROM Opportunity WHERE Id = '{!Opportunity.Id}'");

console.log(result);
debugger;

Это позволит вам проверить результат запроса и поиграть с результатами. Я думаю, что ваша проблема в том, что полное выражение может выглядеть так:

result.records.Account.Dedicated_CS_Rep__r.FirstName

Здесь многое может пойти не так. result должно быть в порядке и records должно быть всегда 1 строка, так как мы запускаем его для одной возможности (давайте не будем обращать внимание на сумасшедшие сценарии, когда кто-то удалял Opp, когда вы переходили на страницу и нажимали кнопку... Но все же:

  • Account может быть пустым (из коробки вполне допустимо иметь личные возможности; возможно, ваша организация пометила поле как обязательное).
  • И, аналогично, в теории действительно иметь учетную запись без пользователя.

Итак, у вас есть 2 шанса поразить исключение нулевого указателя:

Поэтому правильно защищенный код будет иметь такую ​​оргию нулевых / неопределенных проверок:

{!requireScript("/soap/ajax/29.0/connection.js")}

var result = sforce.connection.query("SELECT Account.Dedicated_CS_Rep__r.FirstName FROM Opportunity WHERE Id = '{!Opportunity.Id}'");

console.log(result);

if(result != null 
    && result.records != null 
    && result.records.Account != null 
    && result.records.Account.Dedicated_CS_Rep__r != null){
    alert(result.records.Account.Dedicated_CS_Rep__r);
    // return result.records.Account.Dedicated_CS_Rep__r;
} else {
    alert('Nope');
    // return null;
}
Другие вопросы по тегам