You need to sign in to do that
Don't have an account?
Platy IT
Schema.DescribeFieldResult getLabel() for Reference Fields
When I use the getLabel method of a Schema.DescribeFieldResult object (quick example below), it works fine for every field except Reference fields. For a Reference field, it's returning the Label of that reference's Id field (e.g. Account Id or Owner Id) instead of the label actually used for that Lookup/Master-Detail field (e.g. Account Name or Owner). Anyone know a workaround for this?
String Label = DescField.getLabel();
I just tested it to confirm on one of my dev orgs and it appears the getLabel() method is returning the proper label for my master-detail field. Can you perhaps post a code snippet so we can better diagnose your results?
Well that gives me hope at least. I've boiled this down to it's simplest format (my original code has a lot more Ifs and variables involved), but even these 4 lines alone result in the same issue for me-
The results of that debug-
My code is being called from an extension class, but I tried putting that in a trigger to see if that makes any difference and it doesn't. I also tried to changing the API version of the class (25, 26 and 27), all the same results. I must be missing something if it works for you though.
No now that I see you're trying to do this with the Contact object your results make more sense. In my original test, I was testing with custom objects. After re-testing using the Contact object like in your example, I reproduced the same results as you. It would appear that this is a "bug" with their pre-defined master-detail relationships.
I would submit a support ticket to them to find out if this is the intended result with those field types.
Thanks for the sanity check jbroquist. I just put in a Case through the partner portal and hopefully they don't just automatically close it because they don't support custom code :)
Support has informed me that this is the expected behavior of getLabel for Reference fields. Certainly not expected by me. I'm searching to find if the actual label of that Reference field is anywhere I can access in the metadata but not having much luck so far. What's maddening is that it works fine for custom reference fields, it's just standard reference fields (like Contact.AccountId or Account.CreatedBy) this happens to. Expected or not, that kind of inconsistency seems just wrong to me.
If anyone has ever figured this out, I would much appreciate some help- I'll post here if I find the solution.
I am not a happy camper about this. I put in one case labelling this as a bug and was told no, it's expected behavior. So I put in another request saying that if this is expected behavior then the documentation for the getLabel method is erroneous because it states "Returns the text label that is displayed next to the field in the Salesforce user interface". Salesforce support confirms that yes, for standard reference fields that is not what's returned by getLabel but closed the case anyway because I don't have premier support. I don't expect support for my own code, but you'd think they'd at least fix BUGs in Salesforce?
So I've wasted a lot of time creating a workaround for what clearly is a BUG. Hopefully someone with more clout than I will get stuck dealing with this and actually get support to deal with it. In the meantime, if anyone else discovers there's no way to access the Label of a standard Reference field in Apex, here's a hacky Visualforce workaround.
Quick summary of what this is a workaround for- getting the Label for a standard Reference field (i.e. Contact.AccountId or Account.LastModifiedBy). The getLabel method of DescribeFieldResult does not work correcly for these fields. Unfortunately, this is only a workaround for Visualforce, I haven't found one yet for Apex though I'd welcome one because this solution has serious limitations (and it's a ridiculous way to accomplish it). This really is only needed if you need the Label without a full inputField or outputField, otherwise you can just use those to display the label and field together in a pageBlockSection-