Development questions

Write a trigger to track field history on a custom object into a custom Audit_Log__c object dynamically using a Field Set.

DevelopmentHardDeloitteSalesforceKPMG

Define a Field Set (e.g. Audit_Fields) on the object, loop over its fields with Schema describe, compare old and new, and insert Audit_Log__c records.

apex
trigger ProjectTrigger on Project__c (after update) {
    List<Schema.FieldSetMember> fields = SObjectType.Project__c.fieldSets.Audit_Fields.getFields();
    List<Audit_Log__c> logs = new List<Audit_Log__c>();
    for (Project__c p : Trigger.new) {
        Project__c o = Trigger.oldMap.get(p.Id);
        for (Schema.FieldSetMember f : fields) {
            String api = f.getFieldPath();
            if (p.get(api) != o.get(api)) {
                logs.add(new Audit_Log__c(Record_Id__c = p.Id, Field__c = f.getLabel(),
                    Old_Value__c = String.valueOf(o.get(api)), New_Value__c = String.valueOf(p.get(api)), Changed_By__c = UserInfo.getUserId()));
            }
        }
    }
    insert logs;
}

Admins can add or remove tracked fields without changing code.

apex-triggertriggercodingscenariofield-setdynamic-apex