Salesforce - Apex - 根据活动历史记录查询帐户

时间:2014-01-11 07:03:23

标签: salesforce subquery soql apex

嘿,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
];

1 个答案:

答案 0 :(得分: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。
  •   

看起来您需要多次查询。转到任务(或事件,具体取决于自定义字段可见),编写一组AccountId,然后查询帐户?

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

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