2012-06-07 98 views
6

我在查詢ActivityHistory,看起來您只能將它作爲SUBQUERY對象的查詢來對其他對象進行查詢。這很好 - 我改變了我的查詢來查詢Account對象,並在子查詢中使用了ActivityHistory。似乎工作正常。但在測試中,我發現ActivityHistory子查詢返回了200多個結果的情況。我開始收到此錯誤: 當查詢ActivityHi作爲子查詢時遇到SOQL問題。

 FATAL_ERROR|System.QueryException: entity type ActivityHistory does not support query

...在調試日誌。這似乎只是一個帳戶在ActivityHistory對象中有超過199個相關條目的問題。爲了查看這是否是原因,我嘗試在子查詢中添加LIMIT 199和LIMIT 200子句。果然,當我使用199(或更低)時,它工作正常。使用200(或更高)會導致上述錯誤。

我的代碼如下。有一點要注意的是查詢處於FOR循環中。我有一個理論,爲什麼它會爲LIMIT子句的高值產生錯誤,可能200是FOR循環將查詢分批處理爲單獨塊的時間點 - 也許第二個塊不符合「子查詢」 (因爲它是單獨運行的?) - 並且SalesForce不喜歡那樣。

哦,還有一件事:同樣的代碼似乎在Anonymous Apex編輯器中運行良好(儘管我必須做一些修改 - 用顯式值替換內聯變量)。奇怪的是,匿名編輯對此非常滿意,但SFDC服務器不喜歡它。

無論如何,我現在要做更多的故障排除工作。任何人有任何見解?

謝謝!

代碼:

 
    // ActivityHistory's on Account 
    for (Account a : [ // you can't query ActivityHistory directly; only in a subquery against another object type 
     SELECT 
      Id 
      ,Name 
      ,(SELECT 
        ActivityDate 
        ,ActivityType 
        ,CRM_Meeting_Type__c 
        ,Description 
        ,CreatedBy.Name 
        ,Status 
        ,WhatId 
       FROM ActivityHistories 
       WHERE ActivityType IN :included_activity_history_types 
       //LIMIT 200 
      ) 
     FROM Account WHERE Id = :accountId 
    ]) { 
    for (ActivityHistory ah : a.ActivityHistories) { 
     if (ah.WhatId==null) { continue; } // skip adding activities without a WhatId 

     if (((string)ah.WhatId).startsWith('001')) { // only add ActivityHistory's tied directly to an Account (the query above pulls back all ActivityHistory's on related Oppty's as well) 
      activities.add(new ActivityWrapper(ah)); 
     } 
    } 
    } 

回答

7

大的問題;我不完全確定它爲什麼在Execute Anonymous中工作,但不在Apex類中。

但是,我確實有一些建議。我發現從for循環中分出SOQL查詢很有用,然後使用getSObjects方法獲取返回的子查詢數據。使用這種方法,我已經在Apex類中成功檢索了200多個ActivityHistory記錄。

注意:一個區別(您的代碼和以前的方式之間,我得到了這個工作)是我沒有ActivityHistories WHERE子句中的ActivityType篩選。所以,如果下面的代碼拋出相同的錯誤,我會檢查下一個。

List<Account> AccountsWithActivityHistories = [ 
    // you can't query ActivityHistory directly; only in a subquery against another object type 
    SELECT 
     Id 
     ,Name 
     ,(SELECT 
       ActivityDate 
       ,ActivityType 
       ,CRM_Meeting_Type__c 
       ,Description 
       ,CreatedBy.Name 
       ,Status 
       ,WhatId 
      FROM ActivityHistories 
      WHERE ActivityType IN :included_activity_history_types 
      //LIMIT 200 
     ) 
    FROM Account WHERE Id = :accountId 
]; 

// ActivityHistories on Account 
for (Account a : AccountsWithActivityHistories) { 
    for (ActivityHistory ah : a.getSObjects('ActivityHistories')) { 
    // skip adding activities without a WhatId 
    if (ah.WhatId==null) { continue; } 

    if (((string)ah.WhatId).startsWith('001')) { 
     // only add ActivityHistory's tied directly to an Account 
     // (the query above pulls back all ActivityHistory's on related Oppty's as well) 
     activities.add(new ActivityWrapper(ah)); 
    } 
    } 
} 
1

這可能已經過時了,但是我遇到了這個問題,並想把我的解決方案放在那裏,我發現在另一個論壇上。

活動歷史對象只是一個設置爲「關閉」的任務或事件。因此,您可以查詢坐在「活動歷史記錄」後面的對象,並將其附加到新聯繫人或潛在客戶下方,這會將相同的對象存儲爲新的「活動歷史記錄」對象。

list<Task> activityHistory = [SELECT Id,WhoId FROM Task t WHERE t.WhoId = 'randomID' and t.Status != 'Open']; 

for(Task currentAH : activityHistory){ 
    system.debug(currentAH.Id); 
} 

上面的代碼帶回所有的「任務」活動歷史記錄對象,並允許我使用WhoId到另一個聯繫人/導致重新設置父級它們。