6

我正在尝试使用 SOQL 从 Task 对象获取联系人/潜在客户电子邮件(我正在 PHP 中创建一个接口来备份具有特定主题的消息)。这是我现在的查询:

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

这有效/不会抛出错误并给我结果,但Who.Email总是空的(而且,巧合Who.Phone的是,但这并不是很重要)。如果我尝试仅使用Email,则会收到该字段不存在的错误,这很奇怪,因为Email它在任务字​​段下作为标准字段。

我还尝试了几次谷歌搜索,但没有找到任何帮助。

4

4 回答 4

2

如前所述,Task 上的 WhoId 和 WhatId 字段是多态的(这意味着它们可以指向多个目标对象。除非您启用了SOQL 多态功能,正如@eyescream 所描述的那样,您可以查询的唯一“相关”字段是那些在“名称”API 对象上的,但也有例外,这些都记录在本文档中。

示例 1:select Who.FirstName, Who.LastName, Who.Email from Task

如果 Contact/Lead 填充了这些字段,这将返回 FirstName 和 LastName 的数据,但是,正如上面的文档所述,它永远不会返回 Who.Email 的结果,因为该Who字段的两个可能的目标对象(Contact、铅)是User对象。

示例 2:select Owner.Name, Owner.Email from Case

如果您将队列与案例对象一起使用,则案例的所有者可以是用户或组(队列是其中的一种)记录。因为NameEmail都在Name对象上,所以上述查询将始终返回 Name 的数据,如果目标对象是 User,它将返回 Owner.Email 的数据。

示例 3:select What.Name, WhatId from Task where What.Type in ('Case','Account','Solution')

这是一个非常有趣的例子,因为 Case 对象的“名称”字段实际上是CaseNumber,而不是名称 --- 还有一些其他标准对象具有“非标准”(讽刺)名称字段,例如 SolutionTitle,然后还有其他的甚至没有名称字段,例如CampaignMember. 然而,Salesforce 的多态字段在技术上指向Name对象的一大优点是上述查询将返回案例的结果!如果案例的 CaseNumber 为 00001234,则上述查询中的 What.Name 将返回 00001234,而对于帐户,它将返回帐户的名称,对于解决方案,它将返回解决方案标题。

在这里观察到您可以通过过滤“类型”字段来限制返回哪些目标对象也很有帮助,“类型”字段是Name对象上的一个特殊字段。

于 2013-08-01T15:47:30.643 回答
2

因为 Task 的 WhoId 和 WhatId 字段是多态的(即可以指向许多不同类型的对象),所以您不能像查询通常相关的对象那样通过它们查询关系。相反,您必须执行 2 个 SOQL 查询,第一个是获取任务信息,第二个是从联系人或线索获取谁指向的信息。

于 2013-02-04T22:20:57.933 回答
2

要求 Salesforce 支持在您的组织中启用“多态 SOQL”,然后您将能够确定它是潜在客户还是联系人。它目前处于开发者预览版中,但非常简洁。这是示例用法:

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

或者至少在您的代码中留下“TODO:重写此”注释;)

于 2013-02-05T08:05:13.153 回答
0

在控制台中尝试此操作以获取任务/事件的值

列表 e1=新列表();e1=[select Id, whoId from event WHERE id='00U9xxxxxxxxxxx']; System.debug('@@@@@'+e1);

设置 whoId=new Set(); for(事件 e2:e1){ whoId.add(e2.whoId);} list c=[select name,phone,email from contact where Id IN : whoId]; System.debug('@@@@@'+c);

- - - - - - - - 结尾 - - - - - - -

谢谢

于 2014-09-03T13:08:47.280 回答