Tuesday, August 31, 2010

Mass Updating Standard Object Records Without a Save Button!

Today we want to explore one of the beauties of the Visualforce technology.
Those who have a history of witting ASP or ASP.NET code will admit that Visualforce has made it all too simple to develop business applications.

Let's say we want to be able to update several records of a certain Object all together providing ability for users to quickly make modifications and save them.

This is particularly useful when the data in nature changes often and it's time consuming to do the updates on a record by record basis.

In this example, I will demonstrate a Visualforce page which has a search box through which user can search Accounts and view a list of records where he or she can modify the information inline and then proceed to the next record without clicking on a save button of some sort!

This is very much as easy of entering data into cells of an excel sheet! The only difference is that the Excel needs you to click on the save button at the end but our Visualforce page won't!

I will use an actionFunction tag to create a javascript function which in turn will trigger a method of my Apex controller class. This way when the value of one the input controls changed I can call that javascript function and boom the change would get posted back to the controller and will be saved.

This the how Visualforce page is like:

<apex:page tabStyle="Account" controller="massAccountUpdateCon">
<apex:sectionHeader title="Accounts Mass Update"></apex:sectionHeader>
<apex:form >
<apex:pageBlock title="" id="pageBlock">
  <!-- This block will show the search textbox and the Search button -->
  <apex:pageBlockButtons location="top">
    <apex:inputText value="{!keywords}" style="height:15px;"></apex:inputText>
    <apex:commandButton value="Search" action="{!ViewData}" id="theButton" rerender="pageBlock" status="status"></apex:commandButton>
  </apex:pageBlockButtons>
  <!-- To show page level messages -->
  <apex:pageMessages ></apex:pageMessages>

  <!-- The below tag will provide a javascript method which when is called in turn will call a controller's method -->
  <apex:actionFunction action="{!UpdateRecords}" name="updateRecords" rerender="pageBlock" status="status"></apex:actionFunction>

  <!-- This table contains columns which have inputfield components -->
  <apex:pageBlockTable value="{!accounts}" var="a" rendered="{!NOT(ISNULL(accounts))}">
     <apex:column>
       <apex:facet name="header">Name</apex:facet>
       <apex:inputField value="{!a.Name}" onchange="updateRecords();"></apex:inputField>
     </apex:column>
     <apex:column >
       <apex:facet name="header">Phone</apex:facet>
       <apex:inputField value="{!a.Phone}" onchange="updateRecords();"></apex:inputField>
     </apex:column>
     <apex:column>
       <apex:facet name="header">Billing City</apex:facet>
       <apex:inputField value="{!a.BillingCity}" onchange="updateRecords();"></apex:inputField>
     </apex:column>
     <apex:column>
       <apex:facet name="header">Billing Country</apex:facet>
       <apex:inputField value="{!a.BillingCountry}" onchange="updateRecords();"></apex:inputField>
     </apex:column>
     <apex:column>
       <apex:facet name="header">Industry</apex:facet>
       <apex:inputField value="{!a.Industry}" onchange="updateRecords();"></apex:inputField>
     </apex:column>
  </apex:pageBlockTable>

</apex:pageBlock>

<!-- The action status to show when the AJAX postback is wroking. -->
<apex:actionStatus id="status" startText="Requesting..."/>
</apex:form>
</apex:page>




Now the Controller, this is where the simplicity of coding can be visibly seen!
As you can see in the Controller's source code, I do not need to write any code to find which column's value was changed! All I need to do is to update my List of Accounts!
Visualforce will take care of all those details!



public class massAccountUpdateCon {

  private List<Account> accounts;

  public List<Account> getAccounts() {
      return accounts;
  }

  public string keywords {
    get;
    set;
  }

  public PageReference ViewData() {
     //dynamically build the query to insertthe filter values
     String query = 'Select id, name, type, ownership, industry, phone, BillingCity, billingCountry FROM account WHERE name LIKE \'' + keywords + '%\'';
   
     accounts = Database.query(query);
                   
     return null;
  }

  public PageReference UpdateRecords() {
    // this simple line of code finds out which column was changed and update the 
    // relevant account record accordingly!
    update accounts;
    return null;
  }
}




Adv:


<a href="http://www.PaisaLive.com/register.asp?3253158-6210830"><b><font color="#FF0000" size="4">!</font></b></a>

No comments:

Post a Comment