Sunday 29 September 2024

How to define generic null check of fields ?

 Use Case : Lets say you have a requirement to copy modified field values from latest opportunity to Account , then how can you do field mapping effectively ? 

Assumptions: We are not using any flows here. 

Step - 1 Get all Account Ids from Opportunity Trigger/trigger helper

Step -2 Query Account and Its related opportunity records, assume you want to define latest opportunity by LastStageChangeDate, you can use createdDate too. This will give account details and latest opportunity without the new values that has been modified. so this is basically old opportunity. 

private static List<Account> getAccounts(set<id> accountIdset){
    return [SELECT id,Field_1__c,Field_2__c,Field_3__c,Field_4__c,PersonEmail,Phone,
                               
            (SELECT id,Field_1__c,Field_2__c,Field_3__c,Field_4__c, Email__c,Phone__c
            FROM opportunities
            WHERE stagename = 'Admit' OR stagename = 'Return From Hospital'
            ORDER BY laststagechangeDate DESC LIMIT 1)
            FROM Account where Id IN: accountIdset WITH User_Mode];
}

Step - 3 Create a Map key as AccountId and value as Opportunity from trigger helper. This opportunity will be considered as new opportunity.

Step - 4 Iterate over Account records, under account list there will be another loop to iterate opportunity but that will be one record. when old opportunity Id and new opportunity id same that means latest opportunity is modified. Will leave up to you to find latest records. Now comes field mapping

Step - 5 Field Mapping 

 if(oldOppy.Id == newOppy.Id){
    if(newOppy.Field_1__c !=null){
        account.Field_1__c = newOppy.Field_1__c ;
    }
    if(newOppy.Field_2__c !=null){
        account.Field_2__c = newOppy.Field_2__c ;
    }
    if(newOppy.Field_3__c !=null){
        account.Field_3__c = newOppy.Field_3__c ;
    }
    if(newOppy.Field_4__c !=null){
        account.Field_4__c = newOppy.Field_4__c ;
    }

 } 

If you have few fields, then it is ok, if you need to map 100 fields then 100 ifs need to written, this is code redundancy, What if you need to get values from other object say Case then ?

So Instead of writing multiple Ifs , we can have one generic utility method that will work across object and field. 

Here is generic method 

 public Static void updateFieldIfNotNull(SObject record, String fieldName, Object fieldValue){
    if (fieldValue != null) {
            record.put(fieldName, fieldValue);
     }
       
}

Calling generic method.
 if(oldOppy.Id == newOppy.Id){
    updateFieldIfNotNull(acc,'Field_1__c',newOppy.Field_1__c);
    updateFieldIfNotNull(acc,'Field_2__c',newOppy.Field_2__c);
    updateFieldIfNotNull(acc,'Field_3__c',newOppy.Field_3__c);
    updateFieldIfNotNull(acc,'Field_4__c',newOppy.Field_4__c);
   
 }
Now code is short and readable.
Please try this approach and let me know in comments if this is useful for you.
Keep Learning !!


No comments: