每当插入或删除新的联系人,机会记录时,触发以填充/更新客户记录中的这些字段

时间:2019-07-12 13:16:20

标签: triggers salesforce

帐户上的数字字段:“联系人数量”  每当插入或删除新的联系人记录时,编写触发器以填充/更新客户记录中的字段。

一切正常,但是每当我删除最后一个联系人记录时,它都不会将“帐户”字段从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

1 个答案:

答案 0 :(得分:0)

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

因此,请退后一步思考,在删除最后一个ServiceLifetime.Scoped语句时,您希望看到什么?没有与此帐户相关的联系人->将不返回任何行->无需更新。

我会简化您的代码。几个创意,一起去看看它们是否符合您的个人风格。

  1. 在插入和取消删除(!您忘记从回收站还原)时,将trigger.new中的ID添加到SELECT中。删除时-从trigger.old添加。更新时-从Set<Id>old中添加。
  2. 忘记空检查。收集完所有内容后,您只需进行new。在您准备查询之前。
  3. 尝试使用此accountIds.remove(null);。即使他们没有关联的联系人,它也应始终返回客户。然后你可以

    SELECT Id, (SELECT Id FROM Contacts) FROM Account WHERE Id IN :accountIds

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

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