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.
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
More Development questions
- What is an Apex Trigger in Salesforce and when should you use it over Flows?
- What is the difference between before triggers and after triggers?
- Explain all Trigger context variables (isInsert, isUpdate, isDelete, isUndelete, isBefore, isAfter, isExecuting, size, operationType).
- What is the difference between Trigger.new and Trigger.old?
- In which trigger events are Trigger.new and Trigger.newMap available?
- In which trigger events are Trigger.old and Trigger.oldMap available?