在 Apex 类中更新后 - 联系人总数 "Roll-Up Summary"



我在下面添加了Apex类和Apex触发器,以便在联系人添加或删除到某个帐户时在帐户级别更新字段Number_of_Contacts。

我的想法是在帐户报告中显示帐户有多少联系人。我必须这样做,因为Salesforce没有在帐户级别提供汇总摘要来计算联系人。

我也试过创建一个流,但它只在创建或删除联系人时起作用。

以下是我尝试使用的Apex类和触发器: 类:

public without sharing class  ContactTriggerHandler {

private Set<Id> getAccountIds(List<Contact> contacts) {

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

for(Contact c : contacts) {
if(c.AccountId != null) {
accountIds.add(c.AccountId);
}
}

return accountIds;
}

private Map<Id, Account> getAccountMap(Set<Id> accountIds) {

return new Map<Id, Account>([SELECT Id, Number_of_Contacts__c FROM Account WHERE Id in :accountIds]);
}
public void process(List<Contact> contacts, System.TriggerOperation operation) {

Set<Id> accountIds = getAccountIds(contacts);

if(accountIds.size() > 0) {
Map<Id, Account> accountMap = getAccountMap(accountIds);

for(Contact c : contacts) {
if(accountMap.containsKey(c.AccountId)) {
switch on operation{
when AFTER_INSERT {
accountMap.get(c.AccountId).Number_of_Contacts__c += 1;
}
when AFTER_DELETE {
accountMap.get(c.AccountId).Number_of_Contacts__c -= 1;
}
when AFTER_UNDELETE {
accountMap.get(c.AccountId).Number_of_Contacts__c += 1;
}
}
}
}

update accountMap.values();
}

}

}

触发
trigger ContactTrigger on Contact (after insert, after delete, after undelete) {

ContactTriggerHandler handler = new ContactTriggerHandler();
switch on Trigger.operationType {
when AFTER_INSERT {
handler.process(Trigger.new, Trigger.operationType);
}
when AFTER_DELETE {
handler.process(Trigger.old, Trigger.operationType);
}
when AFTER_UNDELETE {
handler.process(Trigger.new, Trigger.operationType);
}
}

}

但是,我如何包含一行代码来更新Number_of_Contacs__c字段,当联系人移动到一个不同的帐户(如"After_Update")触发)?

谢谢你,

我尝试了一些关于如何在Apex代码中添加AFTER UPDATE触发器的指导,但我没有成功。

触发上下文变量使您能够访问旧值和新值、用户单击保存之前的数据库状态以及用户更改的内容。您从触发器传递到类仅trigger.new,但要获取联系人链接到的原始帐户的id并更新它-类似于此。

Set<Id> idsToCheck = new Set<Id>();
// During update, only if account id changes...
for(Contact c : trigger.new){
Contact old = trigger.oldMap.get(c.Id);
if(c.AccountId != old.AccountId){
idsToCheck.add(c.AccountId);
idsToCheck.add(old.AccountId); // mark both for further processing
}
}
idsToCheck.remove(null);
List<Account> accounts = [SELECT Id, (SELECT Id FROM Contacts) FROM Account WHERE Id IN :idsToCheck];
for(Account a : accounts){
a.Number_of_Contacts__c = a.Contacts.size();
}
update accounts;

最新更新