[SalesForce] Dynamic SOQL for getting all objects in Salesforce Org

I am creating a VF page which contains a Picklist of all objects in my Salesforce org including Custom Objects. I am getting an error 'unexpected token: 'null' when I select custom object.

VF Page

apex:page sidebar="false" controller="AllObjectCtrl"

apex:form 

apex:pageBlock title="All Objects in Org"

apex:pageBlockSection 

apex:selectList value="{!objectName}" size="1"

apex:selectOptions value="{!Name}"
/apex:selectOptions        
/apex:selectList         
          apex:commandButton value="Show table" action="{!getrecords}" reRender="tableShow"/

           apex:pageBlockTable value="{!selectedObj}" var="a" id="tableShow"
               apex:column value="{!a}"/          
          /apex:pageBlockTable
       /apex:pageBlockSection
   /apex:pageBlock
/apex:form
/apex:page

Controller

public with sharing class AllObjectCtrl {

 public String val{get;set;}
 public String objectName{get;set;}
 Schema.DescribeSObjectResult objDescribe;
 public List<Sobject> selectedObj{get;set;}

 Map <String,Schema.SobjectType> schemaMap=Schema.getGlobalDescribe();

 public List<SelectOption> getName()
 {
     List<Schema.SobjectType> gd=schemaMap.values();
     List<SelectOption> options=new List<SelectOption>();

     for(Schema.SobjectType s:gd)
     {
         options.add(new SelectOption(s.getDescribe().getLabel(),s.getDescribe().getLabel()));
     }

     return options;
 }

 public PageReference getrecords()
 {


     //objectName=objDescribe.getLocalName();
     system.debug('----Descirber Name----'+objectName);
     if(objectName!=null||objectName!='')
     {
         selectedObj=new List<Sobject>();
         Schema.sobjectType sobj=schemaMap.get(objectName);
         System.debug('----Object Name----'+objectName);
         System.debug('----Sobj----'+sobj);
         selectedObj=Database.query('Select id from '+sobj);
         System.debug('-----Selected Object Size-----'+selectedObj.size());


     }

     return null;

 }

}

Best Answer

The problem here is that objectName has the 'value' rather than a 'key'. So in the line below, you are trying to get from a map using the value instead of the key.

     Schema.sobjectType sobj=schemaMap.get(objectName);

I've changed the method getName() below to fix this.

public with sharing class AllObjectCtrl {

 public String val{get;set;}
 public String objectName{get;set;}
 Schema.DescribeSObjectResult objDescribe;
 public List<Sobject> selectedObj{get;set;}

 Map <String,Schema.SobjectType> schemaMap=Schema.getGlobalDescribe();

 public List<SelectOption> getName()
 {
     List<String> gd=new List<String>(schemaMap.keyset());
     List<SelectOption> options=new List<SelectOption>();

     for(String s:gd)
     {
         options.add(new SelectOption(s,schemaMap.get(s).getDescribe().getLabel()));
     }

     return options;
 }

 public PageReference getrecords()
 {


     //objectName=objDescribe.getLocalName();
     system.debug('----Descirber Name----'+objectName);
     if(objectName!=null||objectName!='')
     {
         selectedObj=new List<Sobject>();
         Schema.sobjectType sobj=schemaMap.get(objectName);
         System.debug('----Object Name----'+objectName);
         System.debug('----Sobj----'+sobj);
         selectedObj=Database.query('Select id from '+sobj);
         System.debug('-----Selected Object Size-----'+selectedObj.size());


     }

     return null;

 }

}
Related Topic