2014-01-11 136 views
1

嗨Salesforce专家,Salesforce - Apex - 基于活动历史记录的查询帐户

我对查询帐户信息有效存在疑问。我想根据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 
]; 

回答

1

对历史记录您有一个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

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

  • ActivityHistory
  • 附件
  • 事件
  • EventAttendee
  • OpenActivity
  • 标签(AccountTag,ContactTag,和所有其他标签对象)
  • 任务

另外在ActivityHistory定义的底部小字也有点令人沮丧。

上没有“查看所有数据”权限帮助用户谁以下限制防止发生性能问题:

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

样子你会需要多个查询。去任务(或事件,取决于自定义字段是可见的),编写一组AccountIds然后查询帐户?

或者您也可以通过列表从原始查询手动筛选,复制帐户帮手列表:

List<Account> finalResults = new List<Account>(); 
for(Account a : [SELECT...]){ 
    if(!a.ActivityHistories.isEmpty()){ 
     finalResults.add(a); 
    } 
}