帐户上的字段:"联系人数量" 写入触发器以在插入或删除新的联系人记录时填充/更新客户记录上的字段。
一切正常,但每当我删除最后一个联系人记录时,它都不会将帐户字段从 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
语句中看到什么?不再有与此帐户相关的联系人 ->不会返回任何行 ->没有要更新的内容。
我会简化你的代码。几个想法,试一试,看看它们是否符合你的个人风格。
- 在插入和取消删除(!您忘记从回收站恢复)将 ids 从 trigger.new 添加到
Set<Id>
.删除时 - 从触发器.old 添加。更新时 - 从old
和new
添加。 - 忘记空检查。收集完所有内容后,您只需执行
accountIds.remove(null);
即可。在准备查询之前。 -
试试这个
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 添加到当前数字,工作完成"。这是另一天的战斗;)