Salesforce 对象(“区域\帐户\帐户”)

Salesforce 对象(“区域\帐户\帐户”),salesforce,apex-code,force.com,Salesforce,Apex Code,Force.com,这是因为对于以这种方式编写的循环 如果它不起作用(我还没有测试过),您将不得不做一些更复杂的更改 选项2 如果要从主查询中删除子查询,则必须将它们放在execute()中。大概是这样的: for(对象s:范围){ 地域主控tm=(地域主控)s; 对于(Territory_User_uuuC uu:[从Territory_User_uuC中选择User_uuC,其中Territory_Master_uuuC=:tm.Id]){ 对于(Territory\u Account\uuuu c aa:[从

这是因为对于以这种方式编写的循环

如果它不起作用(我还没有测试过),您将不得不做一些更复杂的更改

选项2

如果要从主查询中删除子查询,则必须将它们放在execute()中。大概是这样的:

for(对象s:范围){
地域主控tm=(地域主控)s;
对于(Territory_User_uuuC uu:[从Territory_User_uuC中选择User_uuC,其中Territory_Master_uuuC=:tm.Id]){
对于(Territory\u Account\uuuu c aa:[从Territory\u Account\uuuu c中选择Account\uuuuuuu c,其中Territory\u Master\uuuuuuuuu c=:tm.Id]){
acctMembers.add(新AccountTeamMember(
AccountId=aa.Account\uu\c,
TeamMemberRole=‘销售代表’,
UserId=uu.User\uu\c)
);
acctSharingRules.add(新帐户共享)(
AccountId=aa.Account\uu\c,
OpportunityAccessLevel='Read',
CaseAccessLevel='Read',
AccountAccessLevel='编辑',
UserOrGroupId=uu.User\uu(c)
);
}
}
}

旁注

  • 是否有可能在所有对象(Territory Master/User/Account)中检索到50K行的限制?如果是这种情况,您可能必须限制批处理作业的范围(传递给的可选第二个参数)
  • 这个技巧可以使脚本执行得更快,使用的语句更少(因此不会达到另一个调控器限制):

    acctSharingRules.add(新帐户共享)(
    AccountId=aa.Account\uu\c,
    OpportunityAccessLevel='Read',
    CaseAccessLevel='Read',
    AccountAccessLevel='编辑',
    UserOrGroupId=uu.User\uu(c)
    );
    

  • 非常有帮助的回答。选项1不幸的表现与我的原始代码一样,但你用选项2将其钉住了。我稍微修改了你的代码以符合逻辑,最终结果完美无瑕。我还考虑了你的旁注。谢谢你的帮助。很高兴帮助你,而且我自己也学到了一些东西:)事实上,我有一个放屁的时刻。忽略读取的大约50K行的位。您最担心的应该是在每个上下文中插入10K行(因此每个
    execute()
    call);)谢谢你的回答。我稍微重新编码一下就可以让它工作了。
    //list to hold new account teams
    List<AccountTeamMember> acctMembers = new List<AccountTeamMember>();
    
    //list to hold new account sharing rules
    List<AccountShare> acctSharingRules = new List<AccountShare>();
    
    global Database.querylocator start(Database.BatchableContext BC){
    String query = 'SELECT (SELECT User__c FROM Territory_Users__r), (SELECT Account__c FROM Territory_Accounts__r) FROM Territory_Master__c';
    return Database.getQueryLocator(query);}
    
    global void execute(Database.BatchableContext BC, List<sObject> scope){
    
    for (sObject s : scope) {
        Territory_Master__c tm = (Territory_Master__c) s;
        Territory_User__c[] userList = tm.getSObjects('Territory_Users__r');
        Territory_Account__c[] accountList = tm.getSObjects('Territory_Accounts__r');
    
    
        if (userList != null && accountList != null){
            for(Territory_User__c uu : userList){
                for(Territory_Account__c aa: accountList){
                    AccountTeamMember addRecord = new AccountTeamMember();
                    addRecord.AccountId = aa.Account__c;
                    addRecord.TeamMemberRole = 'Sales Rep';
                    addRecord.UserId = uu.User__c;
                    acctMembers.add(addRecord);
    
                    AccountShare addSharing = new AccountShare();
                    addSharing.AccountId = aa.Account__c;
                    addSharing.OpportunityAccessLevel = 'Read';
                    addSharing.CaseAccessLevel = 'Read';
                    addSharing.AccountAccessLevel = 'Edit';
                    addSharing.UserOrGroupId = uu.User__c;
                    acctSharingRules.add(addSharing);
    
                }
            }
        }
    }
    
    //DML
    if(acctMembers.size() > 0){
        insert acctMembers;
    }
    if(acctSharingRules.size() > 0){
        insert acctSharingRules;
    }
    }
    
    global Database.querylocator start(Database.BatchableContext BC){
    String query = 'SELECT Id FROM Territory_Master__c';
    return Database.getQueryLocator(query);}
    
    global void execute(Database.BatchableContext BC, List<sObject> scope){
    
    for(sObject s : scope){
        Territory_Master__c tm = (Territory_Master__c) s;
    
        List<Territory_User__c> userList = [SELECT User__c FROM Territory_User__c WHERE Territory_Master__c = :tm.Id];
        List<Territory_Account__c> accountList = [SELECT Account__c FROM Territory_Account__c WHERE Territory_Master__c = :tm.Id];
    
        if (userList != null && accountList != null){
            for(Territory_User__c uu : userList){
                    for(Territory_Account__c aa: accountList){
                    AccountTeamMember addRecord = new AccountTeamMember();
                    addRecord.AccountId = aa.Account__c;
                    addRecord.TeamMemberRole = 'Sales Rep';
                    addRecord.UserId = uu.User__c;
                    acctMembers.add(addRecord);
    
                    acctSharingRules.add(new AccountShare(
                        AccountId = aa.Account__c,
                        OpportunityAccessLevel = 'Read',
                        CaseAccessLevel = 'Read',
                        AccountAccessLevel = 'Edit',
                        UserOrGroupId = uu.User__c)
                    );
                }
            }
        }
    }
    
    //DML
    if(acctMembers.size() > 0){
        insert acctMembers;
    }
    if(acctSharingRules.size() > 0){
        insert acctSharingRules;
    }
    }