【问题标题】:get accounts by territory for specific user按地区获取特定用户的帐户
【发布时间】:2013-07-19 22:17:15
【问题描述】:

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

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

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: salesforce apex-code


    【解决方案1】:

    代码应该是这样的

    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')];
    

    【讨论】:

    • 嗨@shimshon-korits。我已经多次使用您的代码来获取当前用户的领土及其记录。感谢您的精彩回答!我想知道如何从当前用户(如上所示)以及它的子区域获取帐户。我必须循环通过帐户共享吗?如果是的话,你能指点我一份文件吗?谢谢!
    【解决方案2】:

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

    SELECT Id, Name FROM Account USING SCOPE My_Territory

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

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

    【讨论】:

      【解决方案3】:

      @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()]);

      【讨论】:

      • 如果这是对 cme​​ts 中提出的问题的回应,最好 1) 要求 OP 将其作为单独的问题发布,以便您回答或(因为它是 2年)2)将评论作为您自己的问题发布,将您的问题归功于@MnZ,并自行回答问题。这样,有这个问题的人实际上可以找到你的答案。事实上,您的回答被认为是对原始问题的回应。
      • 我觉得这有点苛刻。从技术上讲,这是对原始问题的回答......只是一个更广泛的问题,完全编码,具有额外的功能。
      猜你喜欢
      • 1970-01-01
      • 2015-09-29
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多