首页 > 解决方案 > 如何使用 Map 集合在 Account 和 Opportunity 之间进行关联

问题描述

每当创建超过 99 名员工的帐户时,如何编写一个触发器来创建 10 个相同的机会。确保所有机会都与帐户相关联。对 Opportunities 上的字段使用任何值并使用 Map 集合。

Map<Id, Account> accountMap = new Map<Id, Account>([SELECT Id, Name FROM Account WHERE Id IN: accList AND NumberOfEmployees > 99]);       
    List<Opportunity> oppList = new List<Opportunity>();
    
    for(Integer i = 0; i < 10; i++) {
        for(Account acc : [SELECT Id, Name FROM Account WHERE Id IN: accountMap.keySet()]) {
                Opportunity opp = new Opportunity();
                opp.AccountId = acc.Id;
                opp.Name = acc.Name;
                opp.CloseDate = Date.today();
                opp.StageName = 'Prospecting'; 
                oppList.add(opp);
            }
    }   
    
    insert oppList; 

这是我编写的代码,我只想不使用嵌套循环,因为插入操作时的记录没有得到很好的优化,对于触发器来说也不是很好的做法。

标签: triggerssalesforceapex

解决方案


如果您希望在创建新的 Account 记录后直接发生这种情况,那么您可以在 Account 对象的 After Insert 事件期间调用它(确保不直接在触发器中包含代码,使用处理程序类来包含逻辑。 )

您不必查询帐户记录,因为所有这些字段都在 AFTER insert 的 Trigger.new 列表中可用(包括新帐户的 ID)。请参阅下面的代码示例。

List<Opportunity> oppList = new List<Opportunity>();    
for (Account acc : Trigger.new) {
    if (acc.NumberOfEmployees > 99) {
        for(Integer i = 0; i < 10; i++) {
            Opportunity opp = new Opportunity(
                AccountId = acc.Id,
                Name = acc.Name,
                CloseDate = Date.today(),
                StageName = 'Prospecting'
            );
            oppList.add(opp);
        }
    }
}
insert oppList;

这解决了您的问题,但您是否只是在寻找有关如何使用地图、实例化 SObject 等的其他代码示例?


推荐阅读