Created
March 5, 2017 15:21
-
-
Save ohadios/af3e449050b0bbe55a40ec4a6d3bfebb to your computer and use it in GitHub Desktop.
ObjectQuery.vfp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<apex:page controller="ObjectQueryController" showHeader="true"> | |
<apex:form > | |
<apex:pageBlock title="Query Objects"> | |
<apex:pageBlockSection columns="1" title="Object Selection"> | |
<apex:selectList title="" size="1" value="{!selectedObject}" > | |
<apex:selectOptions value="{!objectNames}"/> | |
<apex:actionSupport event="onchange" reRender="fieldSelection"/> | |
<apex:outputLabel >Select the object you would like to query</apex:outputLabel> | |
</apex:selectList> | |
</apex:pageBlockSection> | |
<apex:pageBlockSection columns="3" title="Select fields to query" id="fieldSelection"> | |
<apex:pageblockSection > | |
<apex:selectList size="15" multiselect="true" value="{!selectedFields}"> | |
<apex:selectOptions value="{!objFields}"/> | |
<apex:outputLabel >Select Fields to Query:</apex:outputLabel> | |
</apex:selectList> | |
<apex:commandButton value="Add Fields" action="{!btnAddFields}" reRender="selectedFieldsSection" /> | |
</apex:pageblockSection> | |
<apex:pageBlockSection id="selectedFieldsSection"> | |
<apex:pageBlockTable value="{!fieldQueries}" var="f" title="Selected Fields to Query"> | |
<apex:column headerValue="Field Name" title="Field Name" value="{!f.fieldName}"/> | |
<Apex:column headerValue="Operator"> | |
<apex:selectList size="1" value="{!f.queryOperator}"> | |
<apex:selectOptions value="{!Operators}"/> | |
</apex:selectList> | |
</Apex:column> | |
<apex:column headerValue="Query Value"> | |
<apex:inputText value="{!f.queryValue}"/> | |
</apex:column> | |
</apex:pageBlockTable> | |
</apex:pageBlockSection> | |
<!-- Button performs a query we have the results and we have results Id. --> | |
<apex:commandButton action="{!btnPerformQuery}" reRender="rPanel" value="Query!"/> | |
<!--<apex:inputText value="{!criteria}"> | |
<apex:outputLabel value="Query Value"/> | |
</apex:inputText>--> | |
</apex:pageBlockSection> | |
<apex:outputPanel id="rPanel"> | |
<apex:pageBlockSection title="Results" id="results" rendered="{!queried}"> | |
<apex:pageBlockTable value="{!results}" var="r"> | |
<apex:column value="{!r.id}"/> | |
<apex:repeat value="{!fieldsToDisplay}" var="f"> | |
<apex:column value="{!r[f]}"/> | |
</apex:repeat> | |
<!--<apex:column value="{!r['Name']}"/> | |
<!--<apex:column value="{!r['createdBy.name']}"/> | |
<apex:column value="{!r['createdDate']}"/> | |
<apex:column value="{!r['lastModifiedBy.name']}"/> | |
<apex:column value="{!r['lastModifiedDate']}"/> | |
<apex:column value="{!r[selectedFieldAPI]}"/>--> | |
</apex:pageBlockTable> | |
</apex:pageBlockSection> | |
</apex:outputPanel> | |
</apex:pageBlock> | |
</apex:form> | |
</apex:page> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public with sharing class ObjectQueryController { | |
public List<Contact> conts{get;set;} | |
public Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe(); | |
private Map<String, String> fldAPINameMap = new Map<String,String>(); | |
//Private set on SelectOption is so that values can be set from the controller. | |
public List<SelectOption> objectNames{public get; private set;} | |
public String selectedObject {get; set;} | |
public List<String> selectedFields {get;set;} | |
public String selectedFieldAPI {get;set;} | |
private List<SelectOption> fields; | |
Public string criteria{get;set;} | |
public List<sObject> results{get;set;} | |
public boolean queried {get;set;} | |
// New variables | |
Public List<fieldWrapper> fieldQueries {get;set;} | |
public Set<String> selectedFieldSet{get;set;} | |
public List<String> fieldsToDisplay {get;set;} | |
// TO DO: | |
// - Error handling when user selects ID or Name fields to query (Any Duplicate Fields) | |
// - Handle queries of fields that are different than text | |
// - Allow the selection of multiple fields | |
// - Allow Mass Update of fields on queried records | |
// - Insert new records | |
// New Wrapper class to collect field names and queries | |
public class fieldWrapper{ | |
public String fieldName {get;set;} | |
public String queryOperator {get;set;} | |
public String queryValue {get;set;} | |
public fieldWrapper(string fn){ | |
fieldName = fn; | |
queryOperator = null; | |
queryValue = null; | |
} | |
} | |
public List<SelectOption> getOperators(){ | |
List<SelectOption> opList = new List<SelectOption>(); | |
opList.add(new selectOption('--None--', '--None--')); | |
opList.add(new selectOption('=', 'Equals')); | |
opList.add(new selectOption('>', 'Greater Than')); | |
opList.add(new selectOption('>=', 'Greater Than or Equal To')); | |
opList.add(new selectOption('<', 'Smaller Than')); | |
opList.add(new selectOption('<=', 'Smaller Than or Equal To')); | |
opList.add(new selectOption('!=', 'Not Equal To')); | |
return opList; | |
} | |
public List<SelectOption> getObjFields() { | |
fields.clear(); | |
if(queried == null){queried = false;} | |
system.debug('Page loading, Queried is: '+queried); | |
// If an object was not selected yet, just populate the text 'Select object first' | |
if(selectedObject == NULL){ | |
fields.add(new selectOption('Select Object First', 'Select Object First')); | |
} | |
// if object was selected, create a list of the object's fields | |
else { | |
system.debug('$$$$$' + selectedObject); | |
//We get a string of the sOjbects using the schemaMap. | |
Map <String, Schema.SObjectField> fieldMap = schemaMap.get(selectedObject).getDescribe().fields.getMap(); | |
for(Schema.SObjectField sfield : fieldMap.Values()) | |
{ | |
schema.describefieldresult dfield = sfield.getDescribe(); | |
String fieldName = dfield.getLabel(); | |
fields.add(new SelectOption(fieldName, fieldName)); | |
fldAPINameMap.put(fieldName, dfield.getname()); | |
} | |
} | |
fields.sort(); | |
return fields; | |
} | |
// Constructor - this method will run when the controller is instantiated | |
public ObjectQueryController(){ | |
objectNames = initObjNames(); | |
fields = new List<SelectOption>(); | |
results = new List<sObject>(); | |
fieldQueries = new List<fieldWrapper>(); | |
selectedFieldSet = new Set<String>(); | |
fieldsToDisplay = new List<String>(); | |
String Criteria; | |
} | |
// Populate SelectOption list - | |
// find all sObjects available in the organization | |
private List<SelectOption> initObjNames() { | |
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 void btnAddFields(){ | |
IF(selectedFields.size()>0){ | |
For (String s : selectedFields){ | |
If(selectedFieldSet == NULL || !selectedFieldSet.contains(s)){ | |
system.debug(s); | |
selectedFieldSet.add(s); | |
fieldQueries.add(new fieldWrapper(s)); | |
} | |
} | |
} | |
System.debug(fieldQueries); | |
} | |
//Instantiate the list cast records. We pull id, Name and other needed fields for our pageBlockTable in our VF page | |
public void btnPerformQuery(){ | |
/*string queryStr = 'SELECT ID, NAME, createdBy.Name, createdDate, lastModifiedBy.Name, lastModifiedDate, '+fldAPINameMap.get(selectedField)+' FROM '+selectedObject+' WHERE '+fldAPINameMap.get(selectedField)+' like \'%'+criteria+'%\''; | |
selectedFieldAPI = fldAPINameMap.get(selectedField); | |
system.Debug(queryStr); | |
results = database.query(queryStr); | |
System.Debug(results.size()); | |
queried = true; | |
system.debug('Query performed, Queried is: '+queried);*/ | |
string queryFlds; | |
string whereStr; | |
For(fieldWrapper fw : fieldQueries){ | |
fieldsToDisplay.add(fldAPINameMap.get(fw.fieldName)); | |
IF(queryFlds == null){ | |
queryFlds = fldAPINameMap.get(fw.fieldName); | |
} ELSE { | |
queryFlds = queryFlds +', ' + fldAPINameMap.get(fw.fieldName); | |
} | |
IF(fw.queryOperator != '--None--'){ | |
IF (whereStr==null){ | |
whereStr = fldAPINameMap.get(fw.fieldName) + fw.queryOperator + fw.queryValue; | |
} ELSE { | |
whereStr = whereStr + ' AND '+ fldAPINameMap.get(fw.fieldName) + fw.queryValue; | |
} | |
} | |
} | |
System.Debug('fields: '+queryFlds); | |
System.debug('where statement: '+whereStr); | |
String queryStr = 'SELECT ' + queryFlds + ' FROM ' + selectedObject; | |
IF(whereStr != NULL){ | |
queryStr += ' WHERE ' + whereStr; | |
} | |
System.debug('Final Query String: '+queryStr); | |
results = database.query(queryStr); | |
System.Debug(results.size()); | |
queried = true; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment