1

我一直在查看区域管理 ERD 并尝试了解如何按分配给特定用户的区域查询帐户。

在我的控制器中,我使用 UserInfo.getUserId() 来获取当前用户的 userId。

我需要为该用户获取按地区过滤的帐户列表。

查看ERD,看来我需要查询组表,但是组表上的ID与userId没有任何匹配,那么如何获取特定用户的相关组ID?如何获取特定用户的一组 ID,这些 ID 可用于在 accountShare 表上进行查询,然后该表应返回一个帐户 ID 列表,这些帐户 ID 是该用户按地区划分的帐户?

我是否正确地遍历了对象?我在某个地方错过了一段关系。

谢谢你的帮助。

4

3 回答 3

2

代码应该看起来像这样

1)

Map<Id,UserTerritory> UserTerritoryCurrentUserMap = new  Map<Id,UserTerritory>([Select u.UserId, u.TerritoryId, u.IsActive, u.Id  From UserTerritory u Where u.isActive=true and u.userId =: userId]);

2)

set<Id> TerritoryIdSet = new set<Id>();
for (UserTerritory ut:UserTerritoryCurrentUserMap.values()) {
    TerritoryIdSet.add(ut.TerritoryId);
}

3)

list<Group> map_group = [Select Id, RelatedId from Group where Type='Territory' AND RelatedId IN : TerritoryIdSet];

4)

List<AccountShare> lst_AccountShare = [Select Id, UserOrGroupId, AccountId from AccountShare where ( UserOrGroupId IN : map_group OR  UserOrGroupId =:userId )AND RowCause IN ('Territory', 'TerritoryManual', 'TerritoryRule')];
于 2013-07-21T06:38:03.423 回答
1

从 Winter 15 开始,您可以使用新的子句“使用范围”来过滤用户分配区域中的记录,前提是您的班级正在以共享/当前用户身份运行此查询。以便,

SELECT Id, Name FROM Account USING SCOPE My_Territory

将返回运行用户区域内的所有帐户。这也应该返回子区域中的帐户。

帮助文章在这里, https://help.salesforce.com/apex/HTViewSolution?id=000204543&language=en_US

于 2015-06-26T20:17:42.717 回答
0

@MnZ

上述代码在子领土的支持下得到扩展。通过更改noOfLevels变量来决定自己应该支持多少级别。我希望你们中的一些人会发现它有用。

Integer noOfLevels = 3;
Map<Id, UserTerritory> mIdTer = new Map<Id, UserTerritory>([Select UserId, TerritoryId, SystemModstamp, LastModifiedDate, LastModifiedById, IsActive, Id From UserTerritory where  UserId = :userId]);

set<Id> TerritoryIdSet = new set<Id>();
for(UserTerritory ut:mIdTer.values()){
  TerritoryIdSet.add(ut.TerritoryId);
}

Territory[] nTers = new Territory[]{};
set<Id> parentIds = new Set<Id>();
parentIds.addAll(TerritoryIdSet);
for(integer i = 0 ; i < noOfLevels; i++){
	nTers = [select Id from Territory where ParentTerritoryId in :parentIds];
	if(nTers.size() > 0){
		parentIds = new Set<Id>();
		for(Territory t1 : nTers){
			TerritoryIdSet.add(t1.Id);
			parentIds.add(t1.Id);
		}
	} else {
		break;
	}
}


list<Group> map_group = [Select Id, RelatedId from Group where Type='Territory' AND RelatedId IN : TerritoryIdSet];

List<AccountShare> lst_AccountShare = [Select Id, UserOrGroupId, AccountId from AccountShare where ( UserOrGroupId IN : map_group OR  UserOrGroupId =:userId )AND RowCause IN ('Territory', 'TerritoryManual', 'TerritoryRule')];

Map<Id, Account> mId2acc = new Map<Id,Account>();

for(AccountShare a1 : lst_AccountShare){
	mId2acc.put(a1.AccountId, null);
}

mId2acc = new Map<Id, Account>([select Id, Target_Call__c  from Account where Id in: mId2acc.keySet()]);

于 2015-06-04T22:21:42.793 回答