0

I have a requirement where I need to display map of picklists in columns as dropdowns. For some reason, in last column of the table, I keep getting just one value instead of list of values. For example, see screenshot below, instead of getting R1 and R2 in dropdown, I`m only getting 'R2'. I have also tried collecting them in a List of but I keep getting a null pointer exception after I do that. Please help!!

 public with sharing class DescibeDemoController 
{
   public Map <String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
    public String selectedObject {get; set;}
    public List<FieldWrapper> listField{get;set;}
    public Map<String, Set<String>> DataTypeMap {get; set;}
    public List<String> keys {get ; set;}
    public List <String> selectedOption2{get;set;}



    public DescibeDemoController() 
    {
        listField = new List<FieldWrapper>();

        DataTypeMap = new Map<String, Set<String>>();
        DataTypeMap.put('STRING', new Set<String>{'s1','s2','s3'});
        DataTypeMap.put('PICKLIST', new Set<String>{'p1','p2','p3'});
        DataTypeMap.put('TEXTAREA', new Set<String>{'TA1','TA2','TA3'});        
        DataTypeMap.put('BOOLEAN', new Set<String>{'b1','b2'});
        DataTypeMap.put('ID', new Set<String>{'I1','I2'});
        DataTypeMap.put('REFERENCE', new Set<String>{'R1','R2'});
        DataTypeMap.put('DATETIME', new Set<String>{'DT1','DT2'});
        DataTypeMap.put('DATE', new Set<String>{'D1','D2'});
        DataTypeMap.put('DOUBLE', new Set<String>{'1','2'});
        DataTypeMap.put('ADDRESS', new Set<String>{'Address 1','Address 2'});
        DataTypeMap.put('PHONE', new Set<String>{'Phone 1','Phone 2'});
        DataTypeMap.put('URL', new Set<String>{'URL 1','URL 2'});
        DataTypeMap.put('CURRENCY', new Set<String>{'CURRENCY 1','CURRENCY 2'});
        DataTypeMap.put('INTEGER', new Set<String>{'1','2'});

        keys = new List<String>{'STRING', 'PICKLIST', 'TEXTAREA','BOOLEAN','ID','REFERENCE','DATETIME','DATE','DOUBLE','ADDRESS','PHONE','URL','CURRENCY','INTEGER'};
            system.debug('DataTypeMap  '+ DataTypeMap);


    }


    // find all sObjects available in the organization
    public  List<SelectOption> getListObejectName() 
    {
        List<SelectOption> objNames = new List<SelectOption>();
        List<String> entities = new List<String>(schemaMap.keySet());
        entities.sort();
        for(String name : entities)
            objNames.add(new SelectOption(name,name));
        return objNames;
    }


    public  SelectOption c {get;set;}  
    Set <String> sf {get;set;}

    public List<SelectOption> MapofKeys5 {get;set;}

    // Find the fields for the selected object
    public void showFields() 
    {
        listField.clear();
        Map <String, Schema.SObjectField> fieldMap = schemaMap.get(selectedObject).getDescribe().fields.getMap();
        for(Schema.SObjectField sfield : fieldMap.Values())
        {
            schema.describefieldresult dfield = sfield.getDescribe();
            FieldWrapper wObj = new FieldWrapper();
            wObj.fieldName = dfield.getLabel ();
            wObj.fieldAPIName = dfield.getname();
            wObj.fieldType = String.valueof(dfield.getType());


            sf = DataTypeMap.get(wObj.fieldType);
            List<SelectOption> csmoptions= new List<SelectOption>();
            For (String  S : sf ) {
                Wobj.MapofKeys3 = new SelectOption(s, s);

                system.debug('Wobj.MapofKeys3>>>' + Wobj.MapofKeys3);
            }

            listField.add(wObj);
        }
    }


    public void InsertFields() 
    {

        for(FieldWrapper flist : listField  ) 
        {

            Account_Mapping__c A = New Account_Mapping__c ();
            A.Account_Field__c = flist.fieldAPIName;
            A.my_Fields__c = flist.selectedOption1;
            Insert A;
        }
    }


    public class FieldWrapper
    {
        public String fieldName {get; set;}
        public String fieldAPIName {get; set;}
        public String fieldType {get; set;}
        public String selectedOption1{get;set;}
        public String selectedOption2{get;set;}

        public Set<String> MapofKeys{get;set;}
        public Set<SelectOption> MapofKeys2{get;set;}
        public SelectOption MapofKeys3 {get;set;}
        public List<SelectOption> MapofKeys4 {get;set;}

        public String MapofKey {get;set;}
    }

}

VF

<apex:page controller="DescibeDemoController" >
<apex:form id="Describe">
    <apex:pageBlock id="block2" >
        <apex:pageblockbuttons location="top" >
            <apex:commandButton value="Show Metadata" action="{!showFields}" />
        </apex:pageblockbuttons>

        <apex:pageblocksection >
            <apex:pageBlockSectionItem >
                <apex:outputLabel >Object Name</apex:outputLabel>
                <apex:selectList value="{!selectedObject}" size="1">
                    <apex:selectOptions value="{!ListObejectName}"/>
                </apex:selectList>
            </apex:pageBlockSectionItem>
        </apex:pageblocksection>
    </apex:pageBlock> 

    <apex:pageBlock id="result" title="Field Detail for {!selectedObject}" rendered="{!if(listField.size > 0 ,true,false)}"   >
        <apex:pageBlockTable value="{!listField}" var="field" rendered="{!if(listField.size > 0 ,true,false)}"> 
            <apex:column value="{!field.fieldName }" headerValue="Name" />
            <apex:column value="{!field.fieldAPIName }"  headerValue="API Name"/>
            <apex:column value="{!field.fieldType }"  headerValue="Data Type"/>
            <apex:column value="{!DataTypeMap[field.fieldType]}"  headerValue="List Type"/>
            <apex:column headerValue="Picklist Values">

                <apex:selectList value="{!field.selectedOption2}" multiselect="false" size="1">
                    <apex:selectOptions value="{!field.MapofKeys3}"  />
                </apex:selectList> 
            </apex:column>

        </apex:pageblockTable>

        <apex:pageblockbuttons location="top" >
            <apex:commandButton value="Insert" action="{!InsertFields}" />
        </apex:pageblockbuttons>

    </apex:pageblock>

</apex:form>

enter image description here

2 Answers 2

0

About why you are getting single element:

Problem is this declaration line:

    ...
    public SelectOption MapofKeys3 {get;set;}
    ...

and this loop:

    For (String  S : sf ) {
        Wobj.MapofKeys3 = new SelectOption(s, s);

        system.debug('Wobj.MapofKeys3>>>' + Wobj.MapofKeys3);
    }

Here you have declared MapOfKeys3 as single value. Based on what you have mentioned, you would need this to be list to hold more than one value. And then within the loop you need to add to that list.

See the suggested changes below.

Updated Declaration:

    ...
    public List<SelectOption> MapofKeys3 {get;set;}
    ...

Updated Loop:

    For (String  S : sf ) {
        Wobj.MapofKeys3.add(new SelectOption(s, s));

        system.debug('Wobj.MapofKeys3>>>' + Wobj.MapofKeys3);
    }

About why you might be getting NPE (NullPointerException):

When you declare a list variable, it will be null. So when you try to add, it will throw NPE. So you need to init that list to an actual list instance. Typically you do that during the declaration itself or inside object's constructor.

For this, your class might looks like below.

public class FieldWrapper
{
    public String fieldName {get; set;}
    public String fieldAPIName {get; set;}
    public String fieldType {get; set;}
    public String selectedOption1{get;set;}
    public String selectedOption2{get;set;}

    public Set<String> MapofKeys{get;set;}
    public Set<SelectOption> MapofKeys2{get;set;}
    public List<SelectOption> MapofKeys3 {get;set;}
    public List<SelectOption> MapofKeys4 {get;set;}

    public String MapofKey {get;set;}

    public FieldWrapper() {
        MapofKeys3 = new List<SelectOption>();
    }
}
1
  • Thank you very much. It worked. The part is was missing is "init that list to an actual list instance" .
    – Wendy
    Apr 11, 2018 at 7:55
0

Your issue is with the Wrapper class for MapofKeys3 it should be List<SelectOption> to show the list of values currently it is just SelectOption so it shows only a single value which in the iteration gets overridden by previous value. Try to make MapofKeys3 as List<SelectOption>

public class FieldWrapper
    {
        public String fieldName {get; set;}
        public String fieldAPIName {get; set;}
        public String fieldType {get; set;}
        public String selectedOption1{get;set;}
        public String selectedOption2{get;set;}

        public Set<String> MapofKeys{get;set;}
        public Set<SelectOption> MapofKeys2{get;set;}
        //Changed the below line and also change the code where it add the values in the list
        **public List<SelectOption> MapofKeys3 {get;set;}**
        public List<SelectOption> MapofKeys4 {get;set;}

        public String MapofKey {get;set;}
    }

Instead of MapofKeys3 you can use MapofKeys4 as it doesn't seems to be used.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .