Skip to main content

Generic Class to get Dependency of Dependent Pick-list In Apex

Dependent Picklist values Dependency

Dependent Picklist values do not have any dependency when retrieved via Apex Code.

This Following Class will returned a map which has Key as Controlling Values and Values are the list of dependent values(In LowerCase).
Map Key =  Controlling Values,
Map Values = list of dependent values.

Class:-
/***********************--START--********************************/
/**
* @File Name          : DependencyForPicklistApex.cls
* @Description        : CR-DR
* @Author             : Devraj Tomar
* @Group              : DR Groups
* @Last Modified By   : Devraj Tomar
* @Modification Log   : 
**/
public class DependencyForPicklistApex {
    
    public static Map<String, Set<String>> getFieldDependencies(String objectName, String controllingField, String dependentField){
        Map<String, Set<String>> controllingInfo = new Map<String, Set<String>>();
        Schema.SObjectType objType = Schema.getGlobalDescribe().get(objectName);
        Schema.DescribeSObjectResult describeResult = objType.getDescribe();
        Schema.DescribeFieldResult controllingFieldInfo = describeResult.fields.getMap().get(controllingField).getDescribe();
        Schema.DescribeFieldResult dependentFieldInfo = describeResult.fields.getMap().get(dependentField).getDescribe();
        List<Schema.PicklistEntry> controllingValues = controllingFieldInfo.getPicklistValues();
        List<Schema.PicklistEntry> dependentValues = dependentFieldInfo.getPicklistValues();
        for(Schema.PicklistEntry currControllingValue : controllingValues){
            controllingInfo.put(currControllingValue.getValue(), new Set<String>());
        }
        for(Schema.PicklistEntry currDependentValue : dependentValues){
            String jsonString = JSON.serialize(currDependentValue);
            MyPickListInfo info = (MyPickListInfo) JSON.deserialize(jsonString, MyPickListInfo.class);
            String hexString = EncodingUtil.convertToHex(EncodingUtil.base64Decode(info.validFor)).toUpperCase();
            Integer baseCount = 0;
//toLowerCase can be changed to uppercase and getLabel() can be changed to getValue() based on requirement.
            for(Integer curr : hexString.getChars()){
                Integer val = (curr >= 65)?(curr - 65 + 10):(curr - 48);
                    if((val & 8) == 8){controllingInfo.get(controllingValues[baseCount + 0].getValue()).add(currDependentValue.getLabel().toLowerCase());}/
                if((val & 4) == 4){controllingInfo.get(controllingValues[baseCount + 1].getValue()).add(currDependentValue.getLabel().toLowerCase());}
                if((val & 2) == 2){controllingInfo.get(controllingValues[baseCount + 2].getValue()).add(currDependentValue.getLabel().toLowerCase());}
                if((val & 1) == 1){controllingInfo.get(controllingValues[baseCount + 3].getValue()).add(currDependentValue.getLabel().toLowerCase());}
                baseCount += 4;
            }            
        } 
        return controllingInfo;
    }
    
    public class MyPickListInfo{
        public String validFor;
    }
}

/***********************--END--********************************/

How to Use:
Syntax :
Map<String, Set<String>> STATES_BY_COUNTRYCODE= DependencyForPicklistApex.getFieldDependencies('ObjectName', 'ControllingFieldAPIName','DependentFieldAPIName');

Example : 
static final Map<String, Set<String>> STATES_BY_COUNTRYCODE= DependencyForPicklistApex.getFieldDependencies('Account', 'BillingCountryCode','BillingStateCode');


Note : In Account Object BillingCountry is the Controlling Field for BillingState.

With the little modification this code can work for BillingCountry instead of  BillingCountryCode.

Any Issue Feel free to Comment Below :-

Comments

Popular posts from this blog

Platform Developer I Certification Maintenance (Winter '23)

 Maintain Your Platform Developer I Certification for Winter ’23 1. Field update actions have changed in API Version 54.0. Which record-triggered flows do field update actions now execute? Answer: Before-Save after After-Save 2. Which Apex class is used to determine the hostnames for the domains that Salesforce hosts for your org? Answer: System.DomainCreator 3. Which modules can be used for notifications in a Lightning web component instead of native APIs? Answer: LightningAlert, LightningConfirm, and LightningPrompt 4. What determines an org’s “shape” in Salesforce? Answer: Features, settings, edition, limits, and licenses 5. Which lightning-modal-* component is required to create a modal? Answer: Body 6. How do you call an invocable action from Apex code? Answer: Reference Invocable.Action Get Hands-On With Apex Assertions 1. Create Two Apex class: Copy and Paste below codes (A.) TestFactory @isTest public class TestFactory {    public static Account getAccount(String accountName, B

Administrator Certification Maintenance (Spring '23)

 Maintain Your Administrator Certification for Spring '23 1. What information is listed in the Details panel for recently used reports? Answer: A, B, C 2. What is used to give sales reps access to a guided process to import contacts and leads? Answer:  Sample CSV file 3. Which feature efficiently removes inactive picklist values? Answer: Bulk Delete Unused Values 4. Which type of Process Builder processes can be converted using the Migrate to Flow tool? Answer: Record-triggered Get Hands-on with Enhance Record Pages With Dynamic Forms Follow steps show in Screenshot also highlighted with Red Box:

Platform App Builder Certification Maintenance (Winter ’23)

Maintain Your Platform App Builder Certification for Winter ’23 1. What component customizes related lists directly from the Lightning App Builder? Answer:      Dynamic Related List – Single 2. Where can a debug flow test be created and saved? Answer:      Flow Builder 3. What action enables smart email auto-responses in Flow Builder? Answer:      Create Article Recommendations 4. Custom address fields improve address data accuracy for your users using what type of list? Answer: State and Country/Territory Picklists 5. What are the benefits of using Dynamic Forms on record pages? Answer:      Place fields anywhere on the page  Use Visibility Rule to show and hide fields  6. Restriction or scoping rules now allow multiple values. When should double quotes surround a value? Answer:      If a single value contains a comma  Get Hands-On With Permission Set Expiration Verify before performing this: Permission Set & Permission Set Group Assignments with Expiration Dates should be enabled

Translate