2012-06-07 4 views
6

ActivityHistoryを照会していて、他のオブジェクトに対してSUBQUERYのオブジェクトとしてしか照会できないようです。それは問題ありません。サブクエリでActivityHistoryを使用して、クエリをAccountオブジェクトに対して照会するように変更しました。うまくいくと思った。しかし、テストでは、ActivityHistoryサブクエリが200以上の結果を返したケースが見つかりました。私はこのエラーが発生し始めた: サブクエリとしてActivityHiストーリーを照会するときにSOQLの問題が発生しました。

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

...デバッグログ。これは、AccountがActivityHistoryオブジェクトに199以上の関連エントリを持つ唯一の問題のようです。これが原因であるかどうかを調べるために、サブクエリにLIMIT 199とLIMIT 200節を入れてみました。確かに、私が199(またはそれ以下のもの)を使うとうまくいく。 200(またはこれ以上のもの)を使用すると、上記のエラーが発生します。

マイコードは以下のとおりです。注意すべき点の1つは、クエリがFORループ内にあることです。私がLIMIT節の値が高いためにエラーが発生する理由については、FORループがクエリを別々のチャンクにバッチしている点がおそらく200点です。おそらく2番目のチャンクは 'サブクエリ' (それは別々に実行されているので?) - SalesForceはそれを好きではありません。

ああ、もう1つ:同じコードがAnonymous Apexエディタでうまく動作しているようです(ただし、インライン変数を明示的な値に置き換えていくつかの変更を加える必要がありました)。 anonのエディタが完全に満足しているのは奇妙だが、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

グレート質問。匿名で実行するのはなぜ、あなたのApexクラスでは動作しないのか完全にはわかりません。

しかし、私はいくつかの推奨事項があります。私は、forループからSOQLクエリを分割し、getSObjectsメソッドを使用して返されたサブクエリデータを取得すると便利であることがわかりました。このメソッドを使用すると、Apexクラスで200個以上のActivityHistoryレコードを正常に取得できました。

注:1つの違い(コードと以前の方法との間に違いがあります)は、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

これは古いかもしれないが、私はこの問題をヒットし、そこに私は別のフォーラムで見つけた私の解決策を投げたかったです。

activityhistoryオブジェクトは、「終了」に設定された単なるタスクまたはイベントです。したがって、「活動履歴」の背後にあるオブジェクトを照会し、新しい連絡先または鉛の下にこれを添付すると、同じ「活動履歴」オブジェクトと同じオブジェクトが保管されます。

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を使用してそれらをリペアレントすることができます。

関連する問題