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
Post a Comment