Wednesday, 3 April 2013

Advance Search in Salesforce

Hello Guys,

I made advance search code for Contact object.

Hope this will help you guys to Make search easy in Salesforce object.

Visual Force Page

<apex:page controller="AdvanceSearch" sidebar="false">

  <apex:form>
  <apex:pagemessages id="errors">

  <apex:pageblock mode="edit" title="Find Me A Customer!">
  <table border="0" style="width: 100%px;">
  <tbody>
<tr> 
    <td valign="top" width="200"><apex:pageblock id="criteria" mode="edit" title="Parameters">
   
              <script type="text/javascript">
              function doSearch() {
             
             
                searchServer(
                  document.getElementById("firstName").value,
                  document.getElementById("lastName").value,
                  document.getElementById("accountName").value,
                 document.getElementById("technology").options[document.getElementById("technology").selectedIndex].value
                  );
              }
              </script>
              <apex:actionfunction action="{!runSearch}" name="searchServer" rerender="results,debug,errors">
                  <apex:param name="firstName" value="">
                  <apex:param name="lastName" value="">
                  <apex:param name="accountName" value="">
                  <apex:param name="technology" value="">
              </apex:param></apex:param></apex:param></apex:param></apex:actionfunction>
              <table cellpadding="2" cellspacing="2">
                  <tbody>
<tr>
                        <td style="font-weight: bold;">First Name<br />
<input id="firstName" onkeyup="doSearch();" type="text" />
                        </td>
                  </tr>
<tr>
                           <td style="font-weight: bold;">Last Name<br />
<input id="lastName" onkeyup="doSearch();" type="text" />
                        </td>
                  </tr>
<tr>
                        <td style="font-weight: bold;">Account<br />
<input id="accountName" onkeyup="doSearch();" type="text" />
                           </td>
                  </tr>
<tr>
                    <td style="font-weight: bold;">Interested Technologies<br />
<select id="technology" onchange="doSearch();">
                            <option value=""></option>
                               
                                  <option value="{!tech}">{!tech}</option>
                               
                          </select>
                    </td>
                  </tr>
</tbody></table>
</apex:pageblock>

    </td>
    <td valign="top"><apex:pageblock id="results" mode="edit">

        <apex:pageblocktable value="{!contacts}" var="contact">

            <apex:column>
                <apex:facet name="header">
                    <apex:commandlink action="{!toggleSort}" rerender="results,debug" value="First Name">
                        <apex:param assignto="{!sortField}" name="sortField" value="firstName">
                    </apex:param></apex:commandlink>
                </apex:facet>
                <apex:outputfield value="{!contact.firstName}">
            </apex:outputfield></apex:column>

            <apex:column>
                <apex:facet name="header">
                    <apex:commandlink action="{!toggleSort}" rerender="results,debug" value="Last Name">
                        <apex:param assignto="{!sortField}" name="sortField" value="lastName">
                    </apex:param></apex:commandlink>
                </apex:facet>
                <apex:outputfield value="{!contact.lastName}">
            </apex:outputfield></apex:column>

            <apex:column>
                <apex:facet name="header">
                    <apex:commandlink action="{!toggleSort}" rerender="results,debug" value="Account">
                        <apex:param assignto="{!sortField}" name="sortField" value="account.name">
                    </apex:param></apex:commandlink>
                </apex:facet>
                <apex:outputfield value="{!contact.account.name}">
            </apex:outputfield></apex:column>

            <apex:column>
                <apex:facet name="header">
                    <apex:commandlink action="{!toggleSort}" rerender="results,debug" value="Technologies">
                        <apex:param assignto="{!sortField}" name="sortField" value="interested_technologies__c">
                    </apex:param></apex:commandlink>
                </apex:facet>
                <apex:outputfield value="{!contact.interested_technologies__c}">
            </apex:outputfield></apex:column>

        </apex:pageblocktable>

    </apex:pageblock>

    </td>
  </tr>
</tbody></table>
<apex:pageblock id="debug" title="Debug - SOQL">
      <apex:outputtext value="{!debugSoql}">          
  </apex:outputtext></apex:pageblock>   

  </apex:pageblock>

  </apex:pagemessages></apex:form>
 
</apex:page>


 Controller for Above Page :

public with sharing class AdvanceSearch {
   

  // the soql without the order and limit
  private String soql {get;set;}
  // the collection of contacts to display
  public List<Contact> contacts {get;set;}

  // the current sort direction. defaults to asc
  public String sortDir {
    get  { if (sortDir == null) {  sortDir = 'asc'; } return sortDir;  }
    set;
  }

  // the current field to sort by. defaults to last name
  public String sortField {
    get  { if (sortField == null) {sortField = 'lastName'; } return sortField;  }
    set;
  }

  // format the soql for display on the visualforce page
  public String debugSoql {
    get { return soql + ' order by ' + sortField + ' ' + sortDir + ' limit 20'; }
    set;
  }

  // init the controller and display some sample data when the page loads
  public AdvanceSearch() {
    soql = 'select firstname, lastname, account.name, interested_technologies__c from contact where account.name != null';
    runQuery();
  }

  // toggles the sorting of query from asc<-->desc
  public void toggleSort() {
    // simply toggle the direction
    sortDir = sortDir.equals('asc') ? 'desc' : 'asc';
    // run the query again
    runQuery();
  }

  // runs the actual query
  public void runQuery() {

    try {
      contacts = Database.query(soql + ' order by ' + sortField + ' ' + sortDir + ' limit 20');
    } catch (Exception e) {
      ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Ooops!'));
    }

  }

  // runs the search with parameters passed via Javascript
  public PageReference runSearch() {

    String firstName = Apexpages.currentPage().getParameters().get('firstname');
    String lastName = Apexpages.currentPage().getParameters().get('lastname');
    String accountName = Apexpages.currentPage().getParameters().get('accountName');
    String technology = Apexpages.currentPage().getParameters().get('technology');
   

    soql = 'select firstname, lastname, account.name, interested_technologies__c from contact where account.name != null';
    if (!firstName.equals(''))
      soql += ' and firstname LIKE \''+String.escapeSingleQuotes(firstName)+'%\'';
    if (!lastName.equals(''))
      soql += ' and lastname LIKE \''+String.escapeSingleQuotes(lastName)+'%\'';
    if (!accountName.equals(''))
      soql += ' and account.name LIKE \''+String.escapeSingleQuotes(accountName)+'%\''; 
    if (!technology.equals(''))
      soql += ' and interested_technologies__c = \''+technology+'\'';

    // run the query again
    runQuery();
 
    return null;
  }

  // use apex describe to build the picklist values
  public List<String> technologies {
    get {
      if (technologies == null) {

        technologies = new List<String>();
        Schema.DescribeFieldResult field = Contact.interested_technologies__c.getDescribe();

        for (Schema.PicklistEntry f : field.getPicklistValues())
          technologies.add(f.getLabel());

      }
      return technologies;         
    }
    set;
  }
}

Monday, 1 April 2013

SalesForce MVC Model

Hello Guys,

Model view controller (MVC) design pattern is the one of the most popular design pattern in 3 tier applications. Salesforce.com is award winning tool to manage all the data of sales team of an organization. The flexibility and assurance of safe data provided by Salesforce.com results into nonparallel development capabilities to the developer. One normal questions asked in salesforce is explaining the MVC behavior of the application.


MVC pattern contains below three modules:
  1. Model
  2. View
  3. Controller
Model : What schema and data does salesforce uses to represent the system completely.  In salesforce, we can say that sObjects are the model as every entity in salesforce is mapped to some sObject.
View : How the schema and data is represented. Visualforce is used to present the data to users.
Controller : How the interface actions. Controllers are used to perform the actions whenever users interact with visual force.