嘿,Salesforce专家,
我对查询帐户信息有效提问。我想根据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
];
答案 0 :(得分: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。
看起来您需要多次查询。转到任务(或事件,具体取决于自定义字段可见),编写一组AccountId,然后查询帐户?
或者您可以手动过滤原始查询中的列表,将帐户复制到帮助列表:
List<Account> finalResults = new List<Account>();
for(Account a : [SELECT...]){
if(!a.ActivityHistories.isEmpty()){
finalResults.add(a);
}
}