function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Sourav PSourav P 

Field Dependencies on multiple picklist field values

Dear All, I need here your suggestion urgently. Now i know that we can make field dependencies for picklist values, but its only one to one . But my requirement is as per below,
User-added image
Now, i want the field " Model Family" is to make dependent upon above two field " Make" and " Year of manufacture". To note that,, its not a hierarchy, i.e Make and Year of manuf. are not linked. If it would be a hierarchy, i could have created two field dependencies. But here how to go ahead. plz suggest? e.g here Model family should be show the picklists depends upon what been choosen on " Make" & "Year of manuf".
User-added image
Best Answer chosen by Sourav P
Shun KosakaShun Kosaka
I wrote a sample code with a cutsom object (Car__c) and below custom fields.

User-added image

VF Page:
<apex:page standardController="Car__c" extensions="MultipleControllingFieldTestController">
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockSection columns="1">
                <apex:selectList value="{!selectedMakeItem}" label="{!$ObjectType.Car__c.fields.Make__c.label}" size="1" id="make">
                    <apex:actionSupport event="onchange" rerender="modelfamily"/>
                    <apex:selectOptions value="{!makeItems}" />
                </apex:selectList>
                
                <apex:selectList value="{!selectedYearGroupItem}" label="{!$ObjectType.Car__c.fields.Year_of_manifacture__c.label}" size="1" id="yeargroup">
                    <apex:actionSupport event="onchange" rerender="modelfamily"/>
                    <apex:selectOptions value="{!yearGroupItems}" />
                </apex:selectList>
                
                <apex:selectList value="{!selectedModelFamilyItem}" label="{!$ObjectType.Car__c.fields.Model_Family__c.label}" size="1" id="modelfamily">                  
                  <apex:selectOptions value="{!modelFamilyItems}" />
                </apex:selectList>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>

Controller:
public class MultipleControllingFieldTestController {
    private final Car__c car;
    public String selectedMakeItem {get; set;}
    public String selectedYearGroupItem {get; set;}
    public String selectedModelFamilyItem {get; set;}
   
    //setting for dependency matrix
    Map<String, List<String>> dependencyMatrix = new Map<String, List<String>>();
    
    public MultipleControllingFieldTestController(ApexPages.StandardController stdController){
        this.car = (Car__c)stdController.getRecord();
        
        dependencyMatrix.put('Mazda 2009',new List<String>{'2','3'});
        dependencyMatrix.put('Alfa Romeo 2005', new List<String>{'156','159'});
        dependencyMatrix.put('Peugeot 2006', new List<String>{'206','207'});
    }
    
    public List<SelectOption> getMakeItems(){
        return getPickValues('make__c');
    }
    
    public List<SelectOption> getYearGroupItems(){
        return getPickValues('year_of_manifacture__c');
    }
    
    //get pick values from dependency matrix
    public List<SelectOption> getModelFamilyItems(){
        List<selectOption> options = new List<selectOption>(); 
        if(selectedMakeItem != null && selectedYearGroupItem != null){
            If(dependencyMatrix.containsKey(selectedMakeItem + ' ' + selectedYearGroupItem)){
            List<String> suboptions = dependencyMatrix.get(selectedMakeItem + ' ' + selectedYearGroupItem);
                for(String option : suboptions){
                options.add(new selectOption(option,option));
                }
            } 
        } 
        return options;
    }
    
    public List<selectOption> getPickValues(String field_name) {
      List<selectOption> options = new List<selectOption>();
      options.add(new selectOption('','--None--')); 
      Schema.DescribeSObjectResult sobject_describe = Car__c.getSObjectType().getDescribe(); 
      Map<String, Schema.SObjectField> field_map = sobject_describe.fields.getMap();
      List<Schema.PicklistEntry> pick_list_values = field_map.get(field_name).getDescribe().getPickListValues(); 
          for (Schema.PicklistEntry a : pick_list_values) { 
            options.add(new selectOption(a.getValue(), a.getLabel()));
          }
      return options;
      }

}
I defined a dependency matrix as below
 key : concatenation of 'Make' and 'Year of manifacture (Year Group)'
 value : list of 'Model family's option value
Although there might be a better implementation, I hope this will help you!

All Answers

Sourav PSourav P
Upvoted. But Need to have work around alternatives at this point.
Naveen DhanarajNaveen Dhanaraj
I dont think so this is possible
Sourav PSourav P
Yup, This way not possible. I dont know how current user are doing, May be possible only in visualforce ? If you have any idea how we can goahead with VF, and again link that to the main standard page?
Shun KosakaShun Kosaka
Hi,
Look into using <apex:selectOption> and <apex:actionSupport> with event="onchange".

See also below
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_pages_selectoption.htm
https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_compref_actionSupport.htm
http://blog.jeffdouglas.com/2008/11/25/dependent-multilevel-selectlists/
Shun KosakaShun Kosaka
I wrote a sample code with a cutsom object (Car__c) and below custom fields.

User-added image

VF Page:
<apex:page standardController="Car__c" extensions="MultipleControllingFieldTestController">
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockSection columns="1">
                <apex:selectList value="{!selectedMakeItem}" label="{!$ObjectType.Car__c.fields.Make__c.label}" size="1" id="make">
                    <apex:actionSupport event="onchange" rerender="modelfamily"/>
                    <apex:selectOptions value="{!makeItems}" />
                </apex:selectList>
                
                <apex:selectList value="{!selectedYearGroupItem}" label="{!$ObjectType.Car__c.fields.Year_of_manifacture__c.label}" size="1" id="yeargroup">
                    <apex:actionSupport event="onchange" rerender="modelfamily"/>
                    <apex:selectOptions value="{!yearGroupItems}" />
                </apex:selectList>
                
                <apex:selectList value="{!selectedModelFamilyItem}" label="{!$ObjectType.Car__c.fields.Model_Family__c.label}" size="1" id="modelfamily">                  
                  <apex:selectOptions value="{!modelFamilyItems}" />
                </apex:selectList>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>

Controller:
public class MultipleControllingFieldTestController {
    private final Car__c car;
    public String selectedMakeItem {get; set;}
    public String selectedYearGroupItem {get; set;}
    public String selectedModelFamilyItem {get; set;}
   
    //setting for dependency matrix
    Map<String, List<String>> dependencyMatrix = new Map<String, List<String>>();
    
    public MultipleControllingFieldTestController(ApexPages.StandardController stdController){
        this.car = (Car__c)stdController.getRecord();
        
        dependencyMatrix.put('Mazda 2009',new List<String>{'2','3'});
        dependencyMatrix.put('Alfa Romeo 2005', new List<String>{'156','159'});
        dependencyMatrix.put('Peugeot 2006', new List<String>{'206','207'});
    }
    
    public List<SelectOption> getMakeItems(){
        return getPickValues('make__c');
    }
    
    public List<SelectOption> getYearGroupItems(){
        return getPickValues('year_of_manifacture__c');
    }
    
    //get pick values from dependency matrix
    public List<SelectOption> getModelFamilyItems(){
        List<selectOption> options = new List<selectOption>(); 
        if(selectedMakeItem != null && selectedYearGroupItem != null){
            If(dependencyMatrix.containsKey(selectedMakeItem + ' ' + selectedYearGroupItem)){
            List<String> suboptions = dependencyMatrix.get(selectedMakeItem + ' ' + selectedYearGroupItem);
                for(String option : suboptions){
                options.add(new selectOption(option,option));
                }
            } 
        } 
        return options;
    }
    
    public List<selectOption> getPickValues(String field_name) {
      List<selectOption> options = new List<selectOption>();
      options.add(new selectOption('','--None--')); 
      Schema.DescribeSObjectResult sobject_describe = Car__c.getSObjectType().getDescribe(); 
      Map<String, Schema.SObjectField> field_map = sobject_describe.fields.getMap();
      List<Schema.PicklistEntry> pick_list_values = field_map.get(field_name).getDescribe().getPickListValues(); 
          for (Schema.PicklistEntry a : pick_list_values) { 
            options.add(new selectOption(a.getValue(), a.getLabel()));
          }
      return options;
      }

}
I defined a dependency matrix as below
 key : concatenation of 'Make' and 'Year of manifacture (Year Group)'
 value : list of 'Model family's option value
Although there might be a better implementation, I hope this will help you!
This was selected as the best answer
Sourav PSourav P
Excellent Shun, Thanks. Worked..