12

I have 30+ fields in a field set, and in the update part of my trigger, I want to see if any of those fields have been changed. Can I access them using field sets? Anyway to do it, short of writing out every field in my trigger?

I'm doing something similar to this: http://techman97.wordpress.com/2011/10/22/comparing-new-values-vs-old-values-in-apex-trigger/

2 Answers 2

18

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
    }
}
0
6

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
            }
        }
    }
}
1
  • in your case here what if the values of the fields are case sensitive? Will I be able to use equals string method?
    – Hasantha
    Dec 10, 2015 at 5:31

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .