7

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

    FATAL_ERROR|System.QueryException: エンティティ タイプ ActivityHistory はクエリをサポートしていません

...デバッグログで。これは、アカウントの ActivityHistory オブジェクトに 199 を超える関連エントリがある場合にのみ発生する問題のようです。これが原因かどうかを調べるために、サブクエリに LIMIT 199 句と LIMIT 200 句を入れてみました。案の定、199 (またはそれ以下) を使用すると問題なく動作します。200 (またはそれ以上) を使用すると、上記のエラーが発生します。

私のコードは以下です。注意すべきことの 1 つは、クエリが FOR ループ内にあることです。LIMIT 句の高い値に対してエラーが発生する理由について私が持っている理論の 1 つは、おそらく 200 が、FOR ループがクエリを個別のチャンクにバッチ処理しているポイントであるということです。 (個別に実行されているため?) - そして、SalesForce はそれを好まない。

ああ、もう 1 つ: 同じコードが Anonymous Apex エディタで正常に動作するようです (ただし、インライン変数を明示的な値に置き換えるなど、いくつかの変更を加える必要がありました)。anon編集者がそれに完全に満足しているのに、SFDCサーバーが気に入らないのは奇妙です.

とにかく、もう少しトラブルシューティングを行います。誰にも洞察がありますか?

ありがとう!

コード:

    // ActivityHistory のアカウント
    for (Account a : [ // ActivityHistory を直接クエリすることはできません。別のオブジェクト タイプに対するサブクエリでのみ使用できます。
        選択する
             ID
            、名前
            、( 選択する
                    活動日
                   ,アクティビティの種類
                   ,CRM_Meeting_Type__c
                   、説明
                   ,CreatedBy.Name
                   、状態
                   ,WhatId
                FROM 活動履歴
                WHERE ActivityType IN :included_activity_history_types
                //LIMIT 200
            )
        FROM アカウント WHERE Id = :accountId
    ]) {
     for (ActivityHistory ah : a.ActivityHistories) {
        if ( ah.WhatId==null ) { 続行; } // WhatId のないアクティビティの追加をスキップします

        if (((string)ah.WhatId).startsWith('001')) { // Account に直接関連付けられた ActivityHistory のみを追加します (上記のクエリは、関連する Oppty のすべての ActivityHistory もプルバックします)
            activities.add(新しいActivityWrapper(ah));
        }
     }
    }
4

2 に答える 2

7

素晴らしい質問です。Execute Anonymous では機能するのに、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));
    }
  }
}
于 2012-06-08T15:19:45.147 に答える