How to compare the old and new values in a trigger for multiple fields?
I am not sure if you could use the field set directly to compare but you can use the sObject's get
method to do the job
set<String> fieldSet = new Set<String>();
//dynamically get the fields from the field set and then use the same for comparison in the trigger.
for(Schema.FieldSetMember fields :Schema.SObjectType.Account.fieldSets.getMap().get('yourFieldSetName').getFields()){
fieldSet.add(fields.getFieldPath());
}
for(account a: trigger.new){
set<String> changedFieldSet = new Set<String>();
for(string s: fieldSet){
if(a.get(s) != trigger.oldMap.get(a.Id).get(s)){
changedFieldSet.add(s);//adding fields whose value changed
}
}
if(changedFieldSet.size()>0){
//do something
}
}
SObjects have map-like methods available including get that takes a String or SObjectField argument.
So you can write a trigger of this form:
trigger MyTrigger on MyObject__c (before update) {
String[] fieldNames = new String[] {'Field__c', 'Field2__c', ...};
for (MyObject__c mo : Trigger.new) {
MyObject__c old = Trigger.oldMap.get(mo.Id);
for (String f : fieldNames) {
if (mo.get(f) != old.get(f)) {
// Do whatever you want here
}
}
}
}