Мой триггер выглядит следующим образом:

trigger AccountCallableContact on Contact (after insert, after delete) {
    SET<ID> contId = new SET<ID>();    
    LIST<Account> accountPhonePopulated = new LIST<Account>();
    if(Trigger.isInsert) {
        if(Trigger.isAfter) {
            for(Contact newContact : Trigger.new) {                
                if(newContact.Phone != NULL) {
                   contId.add(newContact.AccountId);
                }
            }
        }
    }

            if(Trigger.isDelete) {
                if(Trigger.isAfter) {
                    for(Contact delContact : Trigger.old) {
                        if(delContact.Phone != NULL) {                          
                        contId.add(delContact.AccountId);
                        } 
                    }
                }
            }

            LIST<Account> updateAccount = new LIST<Account>([SELECT ID, Name, Callable_Contacts__c, 
                                                             (SELECT ID, Name FROM Contacts WHERE Phone != NULL)
                                           FROM Account WHERE ID IN :contId]);
           system.debug('total' + updateAccount);            
           LIST<Contact> totalCount = [SELECT ID
                                        FROM Contact
                                        WHERE (Phone != NULL AND ID IN :contId)];      
            for(Account finalUpdateAccount :updateAccount) {
                //LIST<Contact> numContact = finalUpdateAccount.Contacts;                
                finalUpdateAccount.Callable_Contacts__c = totalCount.size();
                accountPhonePopulated.add(finalUpdateAccount);

            }            

        if(accountPhonePopulated.size() > 0) {
        update accountPhonePopulated;
        }
}
0
Sebastian Kessel 25 Мар 2020 в 20:58

1 ответ

Лучший ответ

У вашего триггера есть несколько проблем с лучшими практиками и логикой, которые я пока пропущу, но основная проблема, которую вы обнаружите, заключается в этой части вашего кода.

    WHERE (Phone != NULL AND ID IN :contId))]; 

Как ни странно, вы заполняете contId свойством AccountId записей, которые вы итерируете. Поэтому список contId никогда не будет содержать идентификаторы для объекта Contact.

Независимо от того, если вы измените обновление на

finalUpdateAccount.Callable_Contacts__c = finalUpdateAccount.Contacts.size();

Вы должны получить то, что хотите, и рассматриваемый оператор выбора должен быть спорным и может быть удален.

Кроме того, строка accountPhonePopulated.add(finalUpdateAccount); не нужна, если вы замените update accountPhonePopulated; на update updateAccount;.

3
Sebastian Kessel 25 Мар 2020 в 21:06