In the first installment of post-Dreamforce projects, I present a mechanism to present the user with all available Lookup options in a picklist. This should simplify some Visualforce pages. (Credit to the Developers Guide from the new post-Dreamforce Library.)
The key to the code is the ability to customize the SOQL statement to focus as much, or as little, as the developer would like. Though the code I provide makes no limit on the number of records returned, I encourage developers to limit the select statement as seen fit.
VF Page:
<apex:page standardcontroller="Child__c" Extensions="ChildExtension"> <apex:messages /> <apex:form > <apex:pageBlock mode="edit" id="thePageBlock"> <apex:pageBlockButtons > <apex:commandButton value="Save" action="{!save}"/> <apex:commandButton value="Cancel" action="{!cancel}"/> </apex:pageBlockButtons> <apex:pageblockSection id="ParentList" title="1"> <apex:pageBlockSectionItem > <apex:outputLabel value="Parent" for="p"/> <apex:selectList id="p" value="{!Child__c.Parent__c}" size="1" title="3"> <apex:selectOptions value="{!ParentOptions}"/> </apex:selectList> </apex:pageBlockSectionItem> </apex:pageblocksection> </apex:pageBlock> </apex:form> </apex:page>
Extension:
Note the SOQL query in Line 12 (below) that defines which records are included in the picklist. You can include WHERE and LIMIT statements to get the picklist down to a manageable number of items.
public class ChildExtension { private final Child__c child; public ChildExtension(ApexPages.StandardController controller) { this.child = (Child__c)controller.getRecord(); } public List<selectOption> ParentOptions {get { List<selectOption> parents = new List<selectOption>(); for (Parent__c prt : [select name from Parent__c pt]) parents.add(new selectOption(prt.id, prt.name)); return parents; } private set; } }
Because the parents List in the extension sends an ID to the application, it can successfully create a record with the parent Name in the picklist, but the ID in the background. You can also substitute a different field for Name: If you prefer, put a contact's email address or anything else. Try it out!
One more thing: This is an easy segue into another project, which will be a way to use the traditional lookup interface but to pre-filter the records available in the lookup.
And because I put this in every post: There's a catch. (There always is.) I'm sure that somewhere in there, Salesforce would prefer that we not create a picklist of a few hundred items. So please feel free to test the limits of this visualforce method, but please be prepared to filter your SOQL query.
On a separate note, I just had lunch with John Rotenstein aka The Enforcer, who already put up a photo of our time in his office. (I think the pirate logo was an accident, but it does add to my sinister persona, no?)
Share Your Thoughts