Users can manually add, delete, or update the values of a custom picklist field. However, there are instances where updating and adding these values programmatically becomes necessary. This is where the metadata API proves invaluable. For a deeper understanding of the metadata API, you can refer to resources on Metadata, Custom Metadata Types, and Metadata API.
To update the values of a custom picklist field, two classes are needed:
- MetadataService.cls: While this class is available online, modifications specific to this scenario have been made within it.
- Another class is required for updating the values of a custom picklist field, which we refer to as updatingCustomPicklistValues. This class is designed for a custom picklist field on any object; in this case, we’ve chosen the Opportunity object with a custom picklist field named Picklist_check.
Modifying Custom Picklist Field Values
public class UpdatingCustomPicklistValues {
// Method to update the values of custom picklist field
public static void updatePicklistValues() {
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
service.SessionHeader = new MetadataService.SessionHeader_element();
service.SessionHeader.sessionId = UserInfo.getSessionId();
MetadataService.ValueSet picklistValueSet = new MetadataService.ValueSet();
MetadataService.ValueSetValuesDefinition valueDefinition = new MetadataService.ValueSetValuesDefinition();
List<MetadataService.ExtendedCustomValue> values = new List<MetadataService.ExtendedCustomValue>();
// Fetching the values already available in the custom picklist field and storing them in the list
List<Schema.PicklistEntry> picklistValues = Opportunity.Picklist_check__c.getDescribe().getPicklistValues();
// Adding the already available values
for(Schema.PicklistEntry picklistValue : picklistValues) {
MetadataService.ExtendedCustomValue customValue1 = new MetadataService.ExtendedCustomValue();
customValue1.fullname = (string)picklistValue.getValue();
customValue1.default_x = false;
customValue1.isActive = true;
customValue1.label = picklistValue.getLabel();
values.add(customValue1);
}
//Adding the extra value, we want to add
MetadataService.ExtendedCustomValue customValue2 = new MetadataService.ExtendedCustomValue();
customValue2.fullname = ‘1’;
customValue2.default_x = false;
customValue2.isActive = true;
customValue2.label = ‘1’;
values.add(customValue2);
valueDefinition.value = values;
valueDefinition.sorted = true;
picklistValueSet.valueSetDefinition = valueDefinition;
MetadataService.CustomField customField = new MetadataService.CustomField();
customField.fullName = ' Opportunity.Picklist_check__c ';
customField.label = ' Picklist_check ';
customField.type_x = 'Picklist';
customField.required = false;
customField.unique = false;
customField.valueSet = picklistValueSet;
MetadataService.CustomField[] customFields = new List<MetadataService.CustomField> { customField };
service.upsertMetadata(customFields);
}
// Method to save the work done
public static void handleSaveResults(MetadataService.SaveResult saveResult)
{
if(saveResult==null || saveResult.success)
return;
// Construct error message and throw an exception
if(saveResult.errors!=null)
{
List<String> messages = new List<String>();
messages.add(
(saveResult.errors.size()==1 ? 'Error ' : 'Errors ') +
'occured processing component ' + saveResult.fullName + '.');
for(MetadataService.Error error : saveResult.errors)
messages.add(
error.message + ' (' + error.statusCode + ').' +
( error.fields!=null && error.fields.size()>0 ?
' Fields ' + String.join(error.fields, ',') + '.' : '' ) );
if(messages.size()>0)
throw new MetadataServiceExamplesException(String.join(messages, ' '));
}
if (!saveResult.success)
throw new MetadataServiceExamplesException('Request failed with no specified error.');
}
//Method to create an instance of MetadataService.MetadataPort
public static MetadataService.MetadataPort createService()
{
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
service.SessionHeader = new MetadataService.SessionHeader_element();
service.SessionHeader.sessionId = UserInfo.getSessionId();
return service;
}
public class MetadataServiceExamplesException extends Exception { }
}
Next, within the Developer Console, save both classes. Afterward, navigate to Debug and then select Open Execute Anonymous Window. Copy and paste the provided code into the anonymous window.
UpdatingCustomPicklistValues.UpdatePicklistValues();
And there you have it, it’s completed!
