2014-01-11 69 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); 
    } 
}