帐户上的数字字段:“联系人数量” 每当插入或删除新的联系人记录时,编写触发器以填充/更新客户记录中的字段。
一切正常,但是每当我删除最后一个联系人记录时,它都不会将“帐户”字段从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
答案 0 :(得分:0)
您处于“删除后”状态。该行已在数据库中删除(交易尚未提交,但仍然进行,如果查询,您将看到事物的“新”状态)。
因此,请退后一步思考,在删除最后一个ServiceLifetime.Scoped
语句时,您希望看到什么?没有与此帐户相关的联系人->将不返回任何行->无需更新。
我会简化您的代码。几个创意,一起去看看它们是否符合您的个人风格。
SELECT
中。删除时-从trigger.old添加。更新时-从Set<Id>
和old
中添加。new
。在您准备查询之前。尝试使用此accountIds.remove(null);
。即使他们没有关联的联系人,它也应始终返回客户。然后你可以
SELECT Id, (SELECT Id FROM Contacts) FROM Account WHERE Id IN :accountIds
与之相关的联系人列表将始终存在。它可能为空(大小= 0),但永远不会为null。更简单吧?
根据当前触发器范围进行计数可能会有更多调整(您实际上不必查询与这些帐户相关的所有联系人,对吗?特别是如果将来可能有成千上万的联系人。您可以只需查看一下触发器的当前范围,因为这是正在发生的变化,并决定“确定,在当前数字上加7,完成工作。”这是另一场战斗;)