Разработка 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;
}
}