2

嘿 Salesforce 专家,

我有一个关于有效查询帐户信息的问题。我想根据 activityHistory 对象中的更新查询帐户。我遇到的问题是,无论是否有“完整的”activeHistory,所有帐户都被检索到。那么,有没有办法可以编写此查询来仅检索具有 status="complete" 和 Type_for_reporting='QRC' 的 activeHistory 帐户?

List<Account> AccountsWithActivityHistories = [    
    SELECT
         Id
        ,Name
        ,( SELECT
                ActivityDate
               ,ActivityType
               ,Type_for_Reporting__c
               ,Description
               ,CreatedBy.Name
               ,Status
               ,WhatId
            FROM ActivityHistories
            WHERE Status ='complete'  and Type_for_Reporting__c = 'QRC'
        )
    FROM Account
];
4

1 回答 1

2

您在历史记录上有一个 WHERE 子句,但您仍然错过了帐户级别的一个。

例如,这将仅返回具有联系人的客户:

SELECT Id, Name
FROM Account
WHERE Id IN (SELECT AccountId FROM Contact) // try with NOT IN too

对于活动来说,它更棘手,因为它们不喜欢以这种方式在 WHERE 中使用。

http://www.salesforce.com/us/developer/docs/officetoolkit/Content/sforce_api_calls_soql_select.htm

子查询当前不支持以下对象:

  • 活动历史
  • 附件
  • 事件
  • 活动参加者
  • 笔记
  • 开放活动
  • 标签(AccountTag、ContactTag 和所有其他标签对象)
  • 任务

此外, ActivityHistory定义底部的细则也有点令人沮丧。

以下对没有“查看所有数据”权限的用户的限制有助于防止出现性能问题:

  • 在关系查询的主子句中,只能引用一条记录。例如,您不能过滤帐户名称以“A”开头的所有记录;相反,您必须引用单个帐户记录。
  • 您不能使用 WHERE 子句。
  • 您必须将列表中返回的行数指定为 499 或更少。
  • 您必须按升序对 ActivityDate 进行排序,并按降序对 LastModifiedDate 进行排序;您可以最后显示空值。例如:ORDER BY ActivityDate ASC NULLS LAST、LastModifiedDate DESC。

看起来您将需要多个查询。选择任务(或事件,具体取决于哪个自定义字段可见),组成一组 AccountId,然后查询 Accounts?

或者您可以从原始查询中手动过滤列表,将帐户复制到帮助列表:

List<Account> finalResults = new List<Account>();
for(Account a : [SELECT...]){
    if(!a.ActivityHistories.isEmpty()){
        finalResults.add(a);
    }
}
于 2014-01-11T09:16:23.263 回答