loading... Salesforce Cat

Monday, November 24, 2014

Render Visualforce Page As a Word Document

Normally we use Visualforce pages to generate online forms and pages but lately I met with a requirement where Visualforce page should be rendered as an downloadable word document.So in the post I thought of sharing simpler version of my code as some of you may find it useful.

So lets get into work Although you may think rendering a page as a Word document may involve lot of  work all you have to do is add one attribute to <apex:page> tag. That attribute is contentType.

eg:contentType="application/msword#SalesforceCat.doc"

In above example

  • application/msword# means page should be rendered as word document
  • SalesforceCat.doc   means default name of the downloaded document would be SalesforceCat
When you are rendering Visualforce page as a word document please take below points also into consideration
  • Some Visualforce  native page elements such as <apex:pageblock>, <apex:pageblockSection> doesn't have same styling effect on pages rendered as Word document. Therefore it is better you can use standard html tags and do the styling using inling css or  css classes defined within the page.
  •  <Apex:form> or other child  apex form components do not render in document mode therefore use html form elements if your document need to include form components such as radio buttons and text fields..

Visualforce Page Rendered as  Word Document


   Code of the above given Visualforce Page


 <apex:page applyHtmlTag="true" showHeader="true" contentType="application/msword#SalesforceCat.doc"  >  
   <div>  
   <h3>Applicant Refree FeedBack From </h3>  
   </div>  
    <head>  
     <style>   
       body { font-family: 'Arial Unicode MS'; }  
       .caption {  
          background: #cfeef8;  
          height:30px;  
          font-size:15px;;  
          margin-left: -1px; /* Fix FF 1px issue */  
         }  
       .Question  
       {  
        height:30px;   
        background-color:#efefef;   
        border:1px solid #ccc;   
        padding:2px 2px; width:50%;  
       }  
       .Answere  
       {  
         height:30px;    
         border:1px solid #ccc;   
         padding:3px 2px 3px 4px;  
       }    
       .rowstyle {  
        height:50px;  
       }  
       .rowstyle td{width:30%;}  
     </style>  
   </head>  
   <apex:outputPanel >  
   <table border="0"  cellspacing="0" cellpadding="0" id="resultTable" width="100%">  
    <caption style="background: #cfeef8;height:23px;font-weight: bold;font-size: 16px; margin-left: -1px; text-align:left; padding:0 0 0 4px;">Feed Back Questions</caption>  
    <tr>  
    <th class="height:30px; background-color:#efefef; border:1px solid #ccc; padding:2px 2px; width:50%;" >Answere All the Questions</th>  
    </tr>  
    <tr >  
     <td class="Question">  
     <apex:outputLabel value="Radio Button Type Question? ">  
     </apex:outputLabel>  
     </td>  
     </tr>  
     <tr>  
     <td class="Answere">  
       <apex:outputPanel >  
        <input type="radio" name="group1" value="Poor"/> Poor  
        <input type="radio" name="group1" value="Average"/> Average  
        <input type="radio" name="group1" value="Good"/> Good  
        <input type="radio" name="group1" value="Excellent"/> Excellent  
       </apex:outputPanel>  
     </td>  
    </tr>  
    <tr>    
    <td width="400" class="Question">  
     <apex:outputLabel value="Check Box Type Question? ">  
    </apex:outputLabel>  
    </td>  
    </tr>  
     <tr>  
     <td style="height:30px;  border:1px solid #ccc; padding:3px 2px 3px 4px;">  
       <apex:outputPanel >  
         <input type="checkbox" name="vehicle" value="Bike">I have a bike </input>  
         <input type="checkbox" name="vehicle" value="Car">I have a car  </input>  
         <input type="checkbox" name="vehicle" value="Bike">I have a van </input>  
         <input type="checkbox" name="vehicle" value="Car">I have a lorry </input>  
       </apex:outputPanel>  
     </td>  
    </tr>   
    <tr>    
    <td width="400" class="Question" >  
    <apex:outputLabel value="Select List Type Question? ">  
    </apex:outputLabel>  
    </td>  
     </tr>  
     <tr>  
     <td style="height:30px; border:1px solid #ccc; padding:3px 2px 3px 4px;">  
       <apex:outputPanel >  
         <select value="select">  
         <option value="volvo">Volvo</option>  
         <option value="saab">Saab</option>  
         <option value="mercedes">Mercedes</option>  
         <option value="audi">Audi</option>  
        </select>  
       </apex:outputPanel>  
     </td>  
    </tr>    
   </table>  
   </apex:outputPanel>  
    <table width="100%">  
    <tr>  
     <td class="Question">  
      <b>Referee Name</b>  
     </td>  
     <td class="Question">  
      <input type="text" size="35" />  
     </td>  
    </tr>  
    <tr>  
     <td class="Question">  
     <b>Contact Number</b>   
     </td>  
    <td class="Question">  
      <input type="text" size="35" />  
     </td>  
    </tr>  
     <tr>  
     <td class="Question">  
     <b>Date</b>  
     </td>  
     <td class="Question">  
      <input type="text" value="(Enter in DD/MM/YYYY Format" size="35" />  
     </td>  
    </tr>  
    </table>  
 </apex:page>  

Sunday, November 16, 2014

Salesforce Access All Object List Views From Visualforce

Salesforce standard list views are one of the most useful built in features comes with the platform.They serve well for users reporting and filtering needs.Although Salesforce standard list views are great to provide end users access to them you have to either create tab for each of your objects or built custom Visualforce pages with <apex:Listviews> tag for each of your objects.Although above solutions work fine for org with limited number of objects as the number of objects grow you may find it bit unpractical.

In this post I am going to describe you how you can access all the custom object list views via one Visualforce page using Salesforce meta data api.



For this purpose i have created a Visualforce page named  ListViewManager and an Apex controller named
ListviewController.

ListviewController


 public class ListviewController {  
   public List<SelectOPtion> Objectlist {get;set;}  
   public String Selectedview {get;set;}  
   public String objectName {get;set;}  
   Map<String,String> prefixtoName {get;set;}  
   public ListviewController()  
   {  
     Objectlist = new List<SelectOption>();  
     prefixtoName = new Map<String,String>();  
     Objectlist.add(new SelectOption('','Select'));  
     //get all object meta details using meta data api  
     Map<String, Schema.SObjectType> gd = Schema.getGlobalDescribe();  
     for(String sObj : gd.keySet()){  
       //get details of each object  
       Schema.DescribeSObjectResult r = gd.get(sObj).getDescribe();  
       //get only custom object with key perfix, there are some internal standard objects without key       //prefix. If you want standard objects also considered you must check them by name as all         //standard objects does't have list views  
       if( r.getKeyPrefix() != null && r.getKeyPrefix()!='' && r.getName().contains('__c'))  
       {  
        //Create a list of selectoptins with keyprefix as value and object label as label of selectoption  
        Objectlist.add(new SelectOption( r.getKeyPrefix(),r.getLabel()));  
        //maintain a map of keyprefix to object name  
        prefixtoName.put(r.getKeyPrefix(), r.getLabel());   
       }  
     }  
   }   
  public void callServer()  
  {  
   //get label of selected object  
   objectName = prefixtoName.get(Selectedview);  
  }  
 }  


ListViewManager

 <apex:page controller="ListviewController" >  
  <apex:Form >  
  <apex:SectionHeader title="ListView Manager"/>  
  <apex:pageblock id="ViewBlock" >  
   <apex:pageMessages ></apex:pageMessages>  
   <apex:pageblockSection title="List view Selector" >  
    <apex:pageblockSectionItem >  
    <apex:outputLabel value="Select Object"/>  
    <apex:SelectList value="{!Selectedview}" size="1">  
     <apex:SelectOptions value="{!Objectlist}"/>  
     <apex:actionSupport event="onchange" action="{!CallServer}" rerender="ViewBlock"/>  
    </apex:SelectList>  
    </apex:pageblockSectionItem>  
    <apex:outputLink value="/{!Selectedview}" target="_blank" rendered="{!objectName!= null && objectName!=''}">{!objectName}  List view </apex:outputLink>  
   </apex:pageblockSection>  
   </apex:pageblock>  
  </apex:Form>  
 </apex:page>  
.

  • drop-down lists the all custom object names in your org





  • Select the name of the object you want to access the list view of.



  • Upon selection of the object ,page will provide you with a link to access the standard list view



Thursday, November 6, 2014

Salesforce History Tracking :Access Field History From Apex Code


In my last post Salesforce History Tracking - Step by Step Guide I discussed in detail about enabling history tracking on a custom object and viewing those logs using Salesforce reports and History tracking related list.In this post I am going to discuss how field tracking logs can be accessed from Apex code.

Salesforce maintains separate internal object to maintain history logs for each history tracking enabled object.The naming of these tables follows a simple convention so should be easy to find. For standard objects the name of the history table follows the format: '<ObjectName>History' so for the Account object the history table is AccountHistory.

For custom objects the name of the convention simply replaces the 'c' on the end of the API name with 'History'. So, for a custom object call My_Object__c the history table is called My_Object_History.

All history tracking tables has following fields.


  • ParentId : This is the Id  of record this history tracking log is related to (id of record field modification happend)
  • Field      :  API name of the modified field.
  • OldValue : Field value prior to the modification.
  • NewValue : Field value after modification
  • CreatedById : Id of the User who made the modification. 
History Tracking logs can be queried via SOQL as shown below

Query all field modification logs of a custom object called  My_Object__c

 Select Id,Field,CreatedById ,OldValue,NewValue,EditedBy From My_Object__History  

Query All field modification logs related to a field called My_Field__c of My_Object__c



 Select Id,Field,CreatedById ,OldValue,NewValue,EditedBy From Friend__History   
 Where Field ='My_Field__c'  


Query  All field modfication logs related to a particular record

 
 Select Id,Field,CreatedById ,OldValue,NewValue,EditedBy From Friend__History   
 Where ParentId=:RecordId   


Using SOQL to query history logs you can build your own Visualforce pages to display field modification details to the end users.