触发器以在插入或删除新的联系人、商机记录时填充/更新客户记录上的这些字段



帐户上的字段:"联系人数量" 写入触发器以在插入或删除新的联系人记录时填充/更新客户记录上的字段。

一切正常,但每当我删除最后一个联系人记录时,它都不会将帐户字段从 1 更新为 0 谁能帮我解决这个问题

trigger UpdateContactCountOnAccount on Contact (after insert, after update, after delete) 
{
Set<Id> AccountIds = new Set<Id>();
if(!Trigger.isDelete)
{
for (Contact ct : Trigger.new) 
{        
if(Trigger.isInsert && ct.AccountId != null)
{
AccountIds.add(ct.AccountId);
}
if(Trigger.isUpdate)
{
if(ct.AccountId==null && Trigger.oldMap.get(ct.Id).AccountId != null)
{
AccountIds.add(Trigger.oldMap.get(ct.Id).AccountId);
}
if(ct.AccountId!=null && Trigger.oldMap.get(ct.Id).AccountId != null 
&& ct.AccountId != Trigger.oldMap.get(ct.Id).AccountId)
{
AccountIds.add(ct.AccountId);
AccountIds.add(Trigger.oldMap.get(ct.Id).AccountId);
}
if(ct.AccountId!=null && Trigger.oldMap.get(ct.Id).AccountId == null)
{
AccountIds.add(ct.AccountId);
}
}
}
}
else
{
for (Contact ct : Trigger.old)
{
if(Trigger.isDelete && ct.AccountId != null)
{
AccountIds.add(ct.AccountId);
}
}   
}
List<Account> AcctToUpdate = new List<Account>();
for (AggregateResult ar: [Select Count(Id) ContactCount, AccountId 
from Contact where AccountId IN: AccountIds GROUP BY AccountId])
{
Account tmp = new Account(Id=(Id)ar.get('AccountId'), No_of_Contacts__c=(Decimal)ar.get('ContactCount'));
AcctToUpdate.add(tmp);
}
if(AcctToUpdate.size()>0) 
update AcctToUpdate;
}

一切正常,但每当我删除最后一个联系人记录时,它都不会将帐户字段从 1 更新为 0

您处于"删除后"状态。该行已在数据库中删除(事务尚未提交,但仍然如此,如果您查询,您将看到事物的"新"状态)。

因此,请退后一步,想一想,当您删除最后一个语句时,您希望在该SELECT语句中看到什么?不再有与此帐户相关的联系人 ->不会返回任何行 ->没有要更新的内容。

我会简化你的代码。几个想法,试一试,看看它们是否符合你的个人风格。

  1. 在插入和取消删除(!您忘记从回收站恢复)将 ids 从 trigger.new 添加到Set<Id>.删除时 - 从触发器.old 添加。更新时 - 从oldnew添加。
  2. 忘记空检查。收集完所有内容后,您只需执行accountIds.remove(null);即可。在准备查询之前。
  3. 试试这个SELECT Id, (SELECT Id FROM Contacts) FROM Account WHERE Id IN :accountIds。它应始终返回帐户,即使它们没有关联的联系人。然后你可以

    List<Account> accs = [SELECT ...];
    for(Account a : accs){
    a.No_of_Contacts__c = a.Contacts.size();
    }
    update accs;
    

该相关的联系人列表将始终存在。 它可能为空(大小 = 0),但永远不会为 null。更简单,嗯?

可能会有更多的调整,根据触发器的当前范围进行计数(您实际上不必查询与这些帐户相关的所有联系人,对吧?特别是如果将来可能有成千上万的人。您可以只查看触发器的当前范围,因为这是正在更改的内容并决定"好的,将 7 添加到当前数字,工作完成"。这是另一天的战斗;)

最新更新