Функция 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» неопределенного

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


person user3582197    schedule 22.05.2014    source источник
comment
Перейдите в раздел «Настройка», проверьте настраиваемые поля в учетной записи, найдите выделенного представителя. Проверьте, каково точное имя API поля — Dedicated_Rep__c или Dedicated_CS_Rep__c?   -  person eyescream    schedule 23.05.2014
comment
Это Dedicated_CS_Rep__c. Итак, то, что у меня есть в моем коде, правильно. Мне интересно, есть ли проблема с моим оператором возврата. Сейчас похоже, что я возвращаю Аккаунт. Нужно ли вместо этого возвращать поиск Dedicated_CS_Rep?   -  person user3582197    schedule 23.05.2014


Ответы (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;
}
person eyescream    schedule 23.05.2014