Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Triggers 每当插入或删除新联系人、商机记录时,触发在帐户记录上填充/更新这些字段_Triggers_Salesforce - Fatal编程技术网

Triggers 每当插入或删除新联系人、商机记录时,触发在帐户记录上填充/更新这些字段

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

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

一切正常,但每当我删除最后一个联系人记录时,它不会将帐户字段从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语句时,您希望在该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,任务完成了。这是另一天的战斗