使用联系人填充选择列表

时间:2011-10-23 10:56:28

标签: salesforce visualforce

我想使用apex:selectList来填充联系人。问题是它出错了

  Collection size 3,403 exceeds maximum size of 1,000

这是因为我有3403个联系人,而Vf对VF页面中的集合有限制。

我想将初始联系人限制为< 1000,并且当用户开始输入我想要查询联系人的字符时。例如,如果用户键入Ji,我想查询联系人以检索以JI开头的记录。

这可能吗?

  <apex:selectlist id="ClientsSearch"  value="{!Appointment.Client__c}" 
       size="1" required="true" rendered="{!NOT (SearchMode)}">

  <apex:selectOptions value="{!Clients}" />
  </apex:selectlist>


 public List<SelectOption> getClients() {     
   List<SelectOption> options = new List<SelectOption>();
  List<Contact> Clients =  [Select id, Name From Contact order by Name];
  options.add(new SelectOption('0001', '--Select--'));
 for(Contact c : Clients ){
 options.add(new  SelectOption(c.id, c.Name));
 }
  return options;
 }

2 个答案:

答案 0 :(得分:0)

您可以在查询中使用通配符来执行此操作 - 因此您需要在页面中添加<apex:inputText>元素以允许它们输入搜索项,该搜索项将写入控制器中的字符串变量。然后添加搜索按钮以运行查询,并使用新的联系人列表重新呈现列表。

控制器的重要部分如下所示:

public string SearchTerm {get; set;}
public list<ContacT> Contacts {get; set;}

public Pagereference SearchContacts()
{
    // etc.
    Contacts = [select Id, Name from Contact where name like : '%' + SearchTerm + '%' order by name limit 1000]; 
    // populate list here
    return null;
}

你可以使用动作函数执行搜索并从输入字段的onChange事件中触发它,但是有一个按钮来进行搜索将使整个事物从用户的角度更加响应(IMO)。

注意:我动态编写了这段代码,可能是你不能以这种方式将'%'与搜索词联系起来,或者你甚至不需要直接查询。通常在这些情况下,由于其他要求,我必须使用动态SOQL,您可以在字符串中构建查询:

strQuery = 'select id from contact where name like \'%' +
    String.escapeSingleQuotes(SearchTerm) + '%\' order by name';
for(Contact sContact : Database.query(strQuery) ...

答案 1 :(得分:0)

有几个选项可以获得您想要的功能。这取决于您想要的解决方案的复杂程度,但始终存在解决方案。

您可能需要考虑在控制器中使用jQuery和SOSL(搜索语言)。以下是使用Salesforce中的Ajax API进行jQuery自动完成的示例。点击以下链接: http://matthewkeefe-developer-edition.na8.force.com/jQueryAutocompleteWithAjaxAPI

另外,请查看Tehnrd的帖子“Super Cool Advanced Lookup Component”以获取其他选项。