触发帐户以更新联系人

时间:2017-04-12 16:59:38

标签: triggers salesforce apex

帐户和联系人都有Billing_Address__c字段。联系人也有一个名为active__c的复选框。如果active__c为true且Account Billing_Address__c更新,则更新Contact的Billing_Address__c。这是触发器。它工作正常。但我想知道是否存在任何问题,或者如何在内存方面对其进行优化?

 public static void updateContactBillingAddress(List<Account> lstNew, Map<Id,Account> mapOld){
    Set<Id> accIds = new Set<Id>();
    for(Account acc : lstNew){
        if(acc.Billing_Address__c != mapOld.get(acc.Id).Billing_Address__c && acc.Billing_Address__c !=null){
            accIds.add(acc.Id);
        }
    }
    if(!accIds.isEmpty()){
        List<Contact> lstContact = new List<Contact>([Select ID,active__c, Account.Billing_Address__c,Billing_Address__c FROM Contact where AccountID IN :accIds]);
        List<Contact> lstUpdateCon = new List<Contact>();
        for(Contact con : lstContact){
            if(con.active__c == true){
                if(con.Billing_Address__c != con.Account.Billing_Address__c){
                    con.Billing_Address__c = con.Account.Billing_Address__c;
                    lstUpdateCon.add(con); 
                  }
             }
            else{
                con.Billing_Address__c =null;
                lstUpdateCon.add(con); 
            }
        }
        if(!lstUpdateCon.isEmpty()){
            update lstUpdateCon;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

不是真的,这是语义,但我会返回一个联系人,一种方法,一件事。您正在处理帐户并更新它们,我将返回List个联系人,而不是使用相同的方法更新它们。如果你需要update contacts,你将最终做不必要的DML语句,你也不需要为该循环创建List

public static List<Contact> updateContactBillingAddress(List<Account> lstNew, Map<ID,Account> mapOld)
{
    List<Contact> result = new List<Contact>();

    Set<Id> accIds = new Set<Id>();

    for(Account acc : lstNew)
    {
        if(acc.Billing_Address__c != null && acc.Billing_Address__c != mapOld.get(acc.Id).Billing_Address__c)
        {
            accIds.add(acc.Id);
        }
    }

    if(!accIds.isEmpty())
    {        
        for(Contact con : [Select ID,Active__c, Account.Billing_Address__c,Billing_Address__c FROM Contact where AccountID IN :accIds])
        {
            if(con.Active__c == true){
                if(con.Billing_Address__c != con.Account.Billing_Address__c)
                {
                    con.Billing_Address__c = con.Account.Billing_Address__c;
                    result.add(con); 
                }
             }
            else
            {
                con.Billing_Address__c = null;
                result.add(con); 
            }
        }
    }

    return result;
}