我正在查询ActivityHistory,看来您只能将它作为SUBQUERY的对象针对其他对象进行查询。很好-我将查询更改为针对Account对象进行查询,并在子查询中添加了ActivityHistory。似乎工作正常。但是在测试中,我发现ActivityHistory子查询返回的结果超过200个的情况。我开始收到此错误:


FATAL_ERROR | System.QueryException:实体类型ActivityHistory不支持查询

...在调试日志中。如果一个帐户在ActivityHistory对象中具有超过199个相关条目,这似乎只是一个问题。若要查看是否是原因,我尝试在子查询中放入LIMIT 199和LIMIT 200子句。果然,当我使用199(或更低的值)时,它可以正常工作。使用200(或更高)会导致上述错误。


我的代码如下。要注意的一件事是查询处于FOR循环中。我有一个关于为什么它为LIMIT子句的高值产生错误的理论是,也许200是FOR循环将查询分批成单独的块的点-也许第二个块不符合“子查询”的条件(因为它是单独运行的?)-而SalesForce不喜欢这样。


哦,还有另一件事:相同的代码在Anonymous Apex编辑器中似乎运行良好(尽管我不得不进行一些修改-用显式值替换内联变量)。奇怪的是,匿名编辑器对此非常满意,但是SFDC服务器不喜欢它。


无论如何,我打算做更多的故障排除。有人有见识吗?


谢谢!


码:


// ActivityHistory的帐户
for(Account a:[//您不能直接查询ActivityHistory;仅在针对另一个对象类型的子查询中
选择
ID
,名称
,( 选择
活动日期
,ActivityType
,CRM_Meeting_Type__c
,描述
,创建dBy.Name
,状态
,WhatId
来自活动历史
在哪里ActivityType IN:included_activity_history_types
// LIMIT 200

来自帐户的WHERE ID =:accountId
]){
对于(ActivityHistory ah:a.ActivityHistories){
如果(ah.WhatId == null){继续; } //跳过没有Wha​​tId的添加活动

if((((string)ah.WhatId).startsWith('001')){//只将ActivityHistory的内容直接绑定到一个帐户(上面的查询也会拉回所有相关的Oppty上的ActivityHistory的内容)
Activities.add(new ActivityWrapper(ah));
}
}
}

最佳答案

好问题;我不完全确定为什么它可以在“执行匿名”中使用,但在您的Apex类中却不能使用。

但是,我确实有一些建议。我发现将SOQL查询从for循环中分离出来,然后使用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));
    }
  }
}

09-04 21:47