Как получить электронную почту из записи объекта задачи с помощью SOQL

Я пытаюсь получить электронное письмо с контактом / потенциальным клиентом из объекта Task с помощью SOQL (я создаю интерфейс на PHP для резервного копирования сообщений с определенной темой). Вот мой запрос прямо сейчас:

SELECT Subject,Who.FirstName,Who.LastName,Who.Email,Who.Phone,Description FROM Task

Это работает / не выдает ошибку и дает мне результаты, но Who.Email всегда пуст (и, по совпадению, Who.Phone тоже, но это не очень важно для этого). Если я попробую просто использовать Email, я получаю сообщение об ошибке, что поле не существует, что странно, потому что Email находится в разделе «Поля задач» как стандартное поле.

Я также пробовал несколько поисков в Google, но никакой помощи не нашел.


person Andrew Jackman    schedule 04.02.2013    source источник


Ответы (4)


Поскольку поля WhoId и WhatId в Task полиморфны (то есть могут указывать на множество различных типов объектов), вы не можете просто запрашивать отношения через них, как вы можете для обычно связанных объектов. Вместо этого вам нужно будет выполнить 2 запроса SOQL: первый для получения информации о задаче, а второй - для получения информации от контакта или лида, на который указывает Who.

person amrcn_werewolf    schedule 04.02.2013
comment
Это было то, что я в конечном итоге сделал в качестве своего решения, жаль, что не было чего-то более элегантного. - person Andrew Jackman; 05.02.2013
comment
вы не можете просто запрашивать отношения через них - это верно лишь отчасти. Если бы вы запросили Who.FirstName, вы бы получили результаты. Предположительно все поля в объекте API имени могут быть запрошены через полиморфные отношения без проблем --- и действительно, запрос для select Who.Email from Task не завершается неудачно, он просто не возвращает данные для определенных полей объекта Name, но ДЕЙСТВУЕТ для других полей объекта Name, даже если в Who DOES есть данные для этих полей! На мой взгляд, это очень непоследовательное поведение. - person zachelrath; 01.08.2013
comment
На самом деле Зачелрат прав. В то время, когда я писал этот комментарий, мое утверждение было верным, но с тех пор Salesforce.com улучшил способность выполнять запросы отношений между полиморфными полями. - person amrcn_werewolf; 02.08.2013

Обратитесь в службу поддержки Salesforce с просьбой включить «полиморфный SOQL» в вашей организации, после чего вы сможете определить, является ли это ведущим или контактным лицом. На данный момент он находится в предварительной версии для разработчиков, но довольно удобен. Вот пример использования:

http://blogs.developerforce.com/tech-pubs/2012/09/soql-polymorphism-or-how-i-learned-to-love-the-polymorphic-relationship.html

Или, по крайней мере, оставьте комментарий «TODO: rewrite this» в своем коде;)

person eyescream    schedule 05.02.2013

Как упоминалось ранее, поля WhoId и WhatId в задаче являются полиморфными (это означает, что они могут указывать на несколько целевых объектов. Если у вас нет Функция полиморфизма SOQL включена, как описывает @eyescream, единственная" связанная " поля, которые вы можете запросить, - это те, которые находятся на «Имя» объекта API, но есть исключения, которые задокументированы в этом документе.

Пример 1: select Who.FirstName, Who.LastName, Who.Email from Task

Это вернет данные для FirstName и LastName, если у контакта / интереса есть эти поля, но, как говорится в приведенном выше документе, он никогда не вернет результаты для Who.Email, потому что ни один из двух возможных целевых объектов поля Who (Контакт , Lead) - это объект User.

Пример 2: select Owner.Name, Owner.Email from Case

Если вы используете очереди с объектом Case, то владельцем дела может быть запись пользователя или группы (из которых Queue является типом). Поскольку и Name, и Email находятся на объекте Name, вышеуказанный запрос всегда будет возвращать данные для имени и, если целевой объект является пользователем, он БУДЕТ возвращать данные для Owner.Email.

Пример 3: select What.Name, WhatId from Task where What.Type in ('Case','Account','Solution')

Это очень интересный пример, потому что поле Name объекта Case на самом деле CaseNumber, а не Name --- есть пара других стандартных объектов с "нестандартными" (ироничными) полями Name, например SolutionTitle, а есть другие, у которых даже нет полей Name, например CampaignMember. ОДНАКО, одна из замечательных особенностей Salesforce, имеющих полиморфные поля, технически указывающие на объект Name, заключается в том, что приведенный выше запрос БУДЕТ возвращать результаты для обращений! Если CaseNumber для дела - 00001234, то What.Name в приведенном выше запросе вернет 00001234, тогда как для учетной записи он вернет имя учетной записи, а для решения он вернет SolutionTitle.

Здесь также полезно заметить, что вы МОЖЕТЕ ограничить, какие целевые объекты возвращаются, путем фильтрации по полю «Тип», которое является специальным полем объекта Name.

person zachelrath    schedule 01.08.2013

Попробуйте это в консоли для получения значения задачи / события

Список e1 = новый список (); e1 = [выберите Id, whoId из события WHERE id = '00U9xxxxxxxxxxx']; System.debug ('@@@@@' + e1);

Установить whoId = new Set (); для (событие e2: e1) {whoId.add (e2.whoId); } list c = [выберите имя, телефон, адрес электронной почты от контакта, где Id IN: whoId]; System.debug ('@@@@@' + c);

----------------КОНЕЦ-------------

Спасибо

person Akhilesh K    schedule 03.09.2014