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>