Разработка Salesforce

Я хотел бы писать и запускать, используя передовые методы Salesforce, которые свяжут все контакты из связанной учетной записи, помеченные как ключевые контакты, с возможностью в этой учетной записи при ее создании.

Что я уже сделал:

trigger OppCreatedKeyContactTrigger on Opportunity (after insert, after Update) {
    for(Opportunity opp : Trigger.New){

        if(Trigger.isInsert || Trigger.isUpdate){
            
            Contact con = [SELECT Id,Name,Key_Contact__c FROM Contact WHERE AccountId =:opp.AccountId];

            con.Key_Contact__c = true;
            update con;
            
        }
    }
}

Мне также нужен тестовый класс

2 ответа

триггер OppCreatedKeyContactTrigger при возможности (после вставки, после обновления) {

         Set<Id> accountIds = new Set<Id>();

   for(Opportunity o : trigger.new){

       accountIds.add(o.AccountId);

   }

   accountIds.remove(null);

   List<Contact> conList = [SELECT Id,Name,Key_Contact__c FROM Contact WHERE AccountId IN :accountIds];

   List<contact> updateConList = new List<contact>();

   if(Trigger.isInsert || Trigger.isUpdate){

   for(Contact cons : conList){

       updateConList.add(new contact(id=cons.id,Key_Contact__c=true));

   }

}

if(updateConList.size()>0){

     update updateConList;

}

}

Используете ли вы OpportunityContactRole (стандартный связанный список в разделе возможностей, который, возможно, потребуется включить при настройке), или у вас есть один или несколько настраиваемых запросов от возможности к контакту? Что должно произойти "после обновления"?

Что-то вроде этого должно подтолкнуть вас в правильном направлении. Я не гарантирую, что он скомпилируется, если вы застрянете, отредактируйте вопрос. Это будет всего 1 запрос, а не в цикле (без ограничений). Если вы действительно хотите следовать лучшим практикам, следующим шагом будет использование некоторой структуры обработчика триггеров.

trigger OpportunityTrigger on Opportunity (after insert) {

    Set<Id> accountIds = new Set<Id>();
    for(Opportunity o : trigger.new){
        accountIds.add(o.AccountId);
    }
    accountIds.remove(null);

    if(!accountIds.isEmpty()){
        Map<Id, Account> accounts = new Map<Id, Account>([
            SELECT Id,
                (SELECT Id FROM Contacts WHERE Key_Contact__c = true)
            FROM Account 
            WHERE Id IN :accountIds
        ]);
        List<OpportunityContactRole> roles = new List<OpportunityContactRole>();

        for(Opportunity o : trigger.new){
            Account a = accounts.get(o.AccountId);
            if(a != null && !a.Contacts.isEmpty()){
                for(Contact c : a.Contacts){
                    roles.add(new OpportunityContactRole(
                        OpportunityId = o.Id,
                        ContactId = c.Id,
                        Role = 'Decision Maker'
                    ));
                }
            }
        }
        insert roles;
    }
}
Другие вопросы по тегам