У меня есть настраиваемый объект с именем Account_Addresses__c, который имеет отношение master-detail к объекту Account. Этот объект содержит адресную информацию, поскольку каждая учетная запись может иметь несколько адресов, однако только один из этих адресов может быть помечен как «текущий». У меня есть поле в пользовательском объекте с именем Current__c, чтобы определить, какой адрес является текущим.

Я создал триггер (ниже), чтобы пометить и снять отметку с адресов, когда пользователь изменяет поле Current__c, и я пытаюсь (в том же триггере) затем обновить поле флажка в записи учетной записи (Left_CA__c), если вновь выбранный текущий адрес не в Калифорнии, а поле Left_CA__c в учетной записи еще не отмечено флажком. Однако эта часть моего триггера, похоже, не срабатывает должным образом. Судя по журналам, карта моей учетной записи изначально нулевая, но затем каким-то образом заполняется. Что я делаю неправильно?

DEBUG|@@@### - сопоставление parentAcct: {} AcctAddrPrimCurr on Account_Addresses вызывает событие AfterUpdate|__sfdc_trigger/AcctAddrPrimCurr 0 DEBUG|@@@### - сопоставление parentAcct: {0011h00000lC9vvAAC=Account:{Id=0011h00000lC9vv_AAC, Left_NY_se }}

trigger AcctCurr on Account_Addresses__c(after update,after insert) {
    
    
    //Update Account Address for Current
        List<Account_Addresses__c> acctAddr2 = new List<Account_Addresses__c>();
    
    // Sets holding Account IDs (unique) and Addresses IDs (unique)
        Set<Id> CurrAcctIds = new Set<Id>();
        Set<Id> acctAddrIds2 = new Set<Id>();
    
        for(Account_Addresses__c aa2 : trigger.new){
           if(aa2.Current__c == TRUE){
                CurrAcctIds.add(aa2.Account__c);
                acctAddrIds2.add(aa2.id);
            }
        }
    
    // get the records from Account Addresses that are under the Account but not meant to be Current
    
        acctAddr2 = [SELECT Id,Current__c
                    FROM Account_Addresses__c
                    WHERE Current__c = TRUE AND Account__c IN:CurrAcctIds AND Id NOT IN:acctAddrIds2];
        for(Account_Addresses__c aa2:acctAddr2)
            aa2.Current__c = FALSE;
        update acctAddr2;
    
    //update related Account to check if new current address is not CA
        Map<ID, Account> parentAcct = new Map<ID, Account>();
    
        parentAcct = new Map<Id, Account>([SELECT Id, Left_CA__c, Date_Left_CA__c 
                                           FROM Account 
                                           WHERE Id IN :CurrAcctIds AND Left_CA__c != TRUE]);
    system.debug('@@@### - parentAcct Map:  '+parentAcct);
        if(parentAcct != null){
        
        for(Account_Addresses__c ca: trigger.new){
            Account myParentAcct = parentAcct.get(ca.Account__c);
            if(ca.Current__c == TRUE && ca.State__c != 'CA'){
                myParentAcct.Left_CA__C = TRUE;
                myParentAcct.Date_Left_CA__C = system.TODAY();
            }
        }
    }
    }
0
J. Neilan 8 Сен 2020 в 15:53
Вы уверены, что смотрите правильный журнал? Журнал показывает другое имя триггера как AcctAddrPrimCurr, а журнал также показывает значение поля Left_NY__c, которое не запрашивается в коллекции карт этого триггера. Возможно, несколько триггеров для объекта «Адрес учетной записи»?
 – 
arut
8 Сен 2020 в 16:36

1 ответ

Лучший ответ

Вы не выполняете DML для измененных записей учетной записи.

Связанные записи никогда не обновляются автоматически как часть триггера другого объекта.

Сейчас вы только вносите изменения в соответствующую запись учетной записи в памяти. Чтобы сохранить это изменение, вам нужно использовать DML.

1
Derek F 8 Сен 2020 в 16:37
Привет Дерек, большое спасибо, я полностью пропустил этот кусок!
 – 
J. Neilan
8 Сен 2020 в 18:02