Triggers 每当插入或删除新联系人、商机记录时,触发在帐户记录上填充/更新这些字段
帐户上的数字字段:联系人数 每当插入或删除新的联系人记录时,写入触发器以填充/更新帐户记录上的字段 一切正常,但每当我删除最后一个联系人记录时,它不会将帐户字段从1更新为0 有人能帮我吗Triggers 每当插入或删除新联系人、商机记录时,触发在帐户记录上填充/更新这些字段,triggers,salesforce,Triggers,Salesforce,帐户上的数字字段:联系人数 每当插入或删除新的联系人记录时,写入触发器以填充/更新帐户记录上的字段 一切正常,但每当我删除最后一个联系人记录时,它不会将帐户字段从1更新为0 有人能帮我吗 trigger UpdateContactCountOnAccount on Contact (after insert, after update, after delete) { Set<Id> AccountIds = new Set<Id>(); if(!Tr
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语句时,您希望在该SELECT语句中看到什么?不再有与此帐户相关的联系人->不会返回任何行->无需更新 我会简化你的代码。两个想法,试一试,看看它们是否符合你的个人风格 在插入和取消删除!您忘记了从回收站还原,将trigger.new中的ID添加到集合中。删除时-从trigger.old添加。更新时-从旧的和新的添加。 忘记空检查。您只需执行accountIds.removenull;一旦一切都收集好了。在您准备好查询之前。 尝试此选择Id,从帐户中的联系人中选择Id,其中Id位于:accountID。它应该始终返回帐户,即使它们没有关联的联系人。然后你就可以
List<Account> accs = [SELECT ...];
for(Account a : accs){
a.No_of_Contacts__c = a.Contacts.size();
}
update accs;
联系人的相关列表将始终存在。它可能是空的size=0,但它永远不会为null。简单点,嗯
可能会有更多的调整,根据当前触发器的范围进行计数,您实际上不必查询与这些帐户相关的所有联系人,对吗?特别是如果将来可能会有成千上万的人。你们可以只看一下触发器的当前作用域,因为那个是正在改变的,然后决定好,在当前的数字上加7,任务完成了。这是另一天的战斗