LET'S LEARN TOGETHER. THE BEAUTIFUL THING ABOUT LEARNING IS NOBODY CAN TAKE IT AWAY FROM YOU.

Dynamic Apex - Sky is The Limit - Explained with Example


Today I am going to explain Dynamic Apex with examples. Dynamic Apex will help developer to create more flexible and robust application because with the help of Dynamic Apex, developer can access the sObject and field describe information, access Salesforce application information. Another great help is that with Dynamic Apex, developer can now write dynamic SOQL, SOSL and DML statements. So basically with dynamic apex, you have the magic wand in your hand.


So without any further delay, let's start the power of magic wand.

Basics of Apex Describe:
In order to get information about sObjects in Salesforce, you have two options - either use tokens or use describeSObjects Schema methods.

Apex provides two data structures and a method for fetching information about sObjects and fields. They are listed below -
  • Token - This is a lightweight, serializable reference to an sObject or a field that is validated at run time. Since they are lightweight, using them make your code faster and more efficient.
  • The describeSObjects method - This method from the Schema class will perform the describe on sObject Types.
  • Describe result - This is basically the object of  type Schema.DescribeSObjectResult which holds the result i.e. contains all the describe properties for the sObject or field. These objects are not serializable and validated always at runtime. 
Let's get into more details before we jump into the examples -
Schema Describe -
  • Schema Describe is a way to programmatically learn about the metadata of your datamodel.
  • Schema Describe calls provides the ability to describe the information about the current org schema such as list of top level objects including custom objects and their fields.
         

Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
Schema Class -
Schema class comes with few static methods which are very important. Below are they -
  • getGlobalDescribe() - This method will return a map of all sObject names (keys) to sObject tokens (values) for the standard as well as custom objects present in the organization.
  • describeDataCategoryGroups(List) - This method will return a list of the category groups associated with the specified objects.
  • describeSObjects(List) - Describes the metadata (field list and object properties) for the specified objects or the array of objects.
  • describeTabs() - Returns the information about standard and custom apps available to the running user.
Schema Namespace -
The Schema Namespace provides classes and methods for getting schema metadata information. Below are the classes -
  • ChildRelationship class - This class contains the methods for accessing the child relationship as well as child sObject for a parent sObject.
  • DescribeFieldResult class - Contains methods for describing fields.
  • DescribeSObjectResult class -Contains methods for describing sObjects.
  • DescribeTabResult class - Returns tab metadata information for a tab in a standard or custom app available.
  • FieldSet class - This contains methods for discovering and retrieving the details of field sets created on sObjects.
  • SObjectField class - This is the return type of getSObjectField method,which basically returns the object of type Schema.SObjectField class.
  • SObjectType class - This is the return type of getSObjectType method,which basically returns the object of type Schema.SObjectType class.
  • RecordTypeInfo class - This contains the methods for accessing record type information associated with a sObject.
  • PicklistEntry class - This represents a picklist entry.
You can get more details about the Schema Namespace class @ 

Now let's play with Dynamic Apex -

Apex code to fetch all objects (Standard as well as Custom) from an organization -
VF Page ::
<apex:page controller="ObjectRetrievePractice">
    <apex:form id="TheForm">
        <apex:pageBlock title="All Objects Fetched Dynamically">
            <apex:outputLabel value="All Objects ">
                <apex:selectList size="1">
                    <apex:selectoptions value="{!allObjNames}"></apex:selectoptions>
                </apex:selectList>
            </apex:outputLabel>
        </apex:pageBlock> 
    </apex:form>
</apex:page>
Controller ::
public with sharing class ObjectRetrievePractice {
    //Method to fetch all objects present in the org
    public List<SelectOption> getAllObjNames(){
        //Get all Object names
 List<Schema.SObjectType> gd = Schema.getGlobalDescribe().Values();
  
 List<SelectOption> options = new List<SelectOption>();
 options.add(new SelectOption('--None','--None--'));
  
 for(Schema.SObjectType f : gd){
       options.add(new SelectOption(f.getDescribe().getName(),f.getDescribe().getName()));
 }
        return options;
    }
}

Apex code to fetch all Custom objects only from an organization -
VF Page ::
<apex:page controller="ObjectRetrievePractice">
    <apex:form id="TheForm">
        <apex:pageBlock title="All Custom Objects Fetched Dynamically">
            <apex:outputLabel value="All Custom Objects ">
                <apex:selectList size="1">
                    <apex:selectoptions value="{!allCustomObjNames}"></apex:selectoptions>
                </apex:selectList>
            </apex:outputLabel>
        </apex:pageBlock>
    </apex:form>
</apex:page>
Controller ::
public with sharing class ObjectRetrievePractice {
    //Method to fetch only custom objects from the org
    public List<SelectOption> getAllCustomObjNames(){
        //Get all Object names
        List<Schema.SObjectType> gd = Schema.getGlobalDescribe().Values();
        
        List<SelectOption> options = new List<SelectOption>();
        options.add(new SelectOption('--None','--None--'));
        
        for(Schema.SObjectType f : gd){
            if(f.getDescribe().isCustom())
                options.add(new SelectOption(f.getDescribe().getLabel(),f.getDescribe().getLabel()));
        }
        return options;
    }
}

Apex code to fetch all fields dynamically from an Object -
VF Page ::
<apex:page controller="ObjectRetrievePractice">
    <apex:form id="TheForm">
        <apex:pageBlock title="All Fields from Account Object">
            <apex:outputLabel value="All Account Fields ">
                <apex:selectList size="1">
                    <apex:selectoptions value="{!allAccountFields}"></apex:selectoptions>
                </apex:selectList>
            </apex:outputLabel>
        </apex:pageBlock>
    </apex:form>
</apex:page>
Controller ::
public with sharing class ObjectRetrievePractice {
    //Method to fetch Account fields dynamically
    public List<SelectOption> getAllAccountFields(){
        List<SelectOption> options = new List<SelectOption>();
        
        Map<String, Schema.SObjectField> fm = Schema.SObjectType.Account.fields.getMap();
        
        for(String token : fm.keyset()){
            options.add(new SelectOption(fm.get(token).getDescribe().getLabel(),fm.get(token).getDescribe().getLabel()));
        }
        return options;
    }
}

Now a little advance code snippet.
Apex code to first select the Object and then dynamically fetch fields from that object -
VF Page ::
<apex:page controller="ObjectRetrievePractice">
    <apex:form id="TheForm">
        <apex:pageBlock >
            <apex:pageBlockSection title="Select an Object" collapsible="false" columns="2">
                 <apex:pageBlockSectionItem >
                     <apex:outputLabel value="Select an object:"></apex:outputLabel>
                     <apex:selectList value="{!objectName}" size="1" multiselect="false">
                         <apex:selectOptions value="{!allObjNames}">
                         </apex:selectOptions>
                         <apex:actionSupport action="{!fetchFields}" event="onchange" reRender="fieldsPanel"/>  
                     </apex:selectList>
                 </apex:pageBlockSectionItem>
                 
                 <apex:pageBlockSectionItem >
                 <apex:outputPanel id="fieldsPanel">
                     <apex:outputLabel value="Select Fields:"> </apex:outputLabel>
                     <apex:selectList value="{!fields}" multiselect="true" size="3" >
                         <apex:selectOptions value="{!lsps}">
                         
                         </apex:selectOptions>
                     </apex:selectList>
                     </apex:outputPanel>
                 </apex:pageBlockSectionItem> 
             </apex:pageBlockSection>
         </apex:pageBlock>
    </apex:form>
</apex:page>
Controller ::
public with sharing class ObjectRetrievePractice {
    public String objectName { get; set; } 
    public list<SelectOption> lsps{get;set;}  
    public String fields { get; set; }
    
    //Method to fetch all objects present in the org
    public List<SelectOption> getAllObjNames(){
        //Get all Object names
  List<Schema.SObjectType> gd = Schema.getGlobalDescribe().Values();
  
  List<SelectOption> options = new List<SelectOption>();
  options.add(new SelectOption('--None','--None--'));
  
  for(Schema.SObjectType f : gd){
      options.add(new SelectOption(f.getDescribe().getName(),f.getDescribe().getName()));
  }
  return options;
 }
    
    //Method to fetch fields dynamically from the selected objects  
    public void fetchFields() {
        Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
        lsps = new List<SelectOption>();
        
        if(objectName!=null || objectName!=''){
            Map<string,Schema.SObjectField> mpConField=schemaMap.get(objectName).getDescribe().fields.getMap();
            
            for(String token : mpConField.keyset()){
             lsps.add(new SelectOption(mpConField.get(token).getDescribe().getLabel(),mpConField.get(token).getDescribe().getLabel()));
            }
        }        
    }
}

Apex code to select required fields from Account Object -
In Dynamic Apex, we don't have any direct method available which can tell us whether a field is required or not. But there is another way to find it out. If any field satisfies below three properties, then it is a required field
  • If the field is createable
  • If the field is not nillable and
  • If the field does not have any default value.
Below code will show how we can find only the required fields from Account object

VF Page ::
<apex:page controller="ObjectRetrievePractice">
    <apex:form id="TheForm">
        <apex:pageBlock title="Display only the required fields Account Object">
            <apex:outputLabel value="All Required Fields from Account object ">
                <apex:selectList size="1">
                    <apex:selectoptions value="{!allAccountRequiredFields}"></apex:selectoptions>
                </apex:selectList>
            </apex:outputLabel>
        </apex:pageBlock>
    </apex:form>
</apex:page>
Controller ::
public with sharing class ObjectRetrievePractice {
    //Method to fetch Required fields from Account object dynamically
    public List<SelectOption> getAllAccountRequiredFields(){
        List<SelectOption> options = new List<SelectOption>();
        
        Map<String, Schema.SObjectField> fm = Schema.SObjectType.Account.fields.getMap();
        
        for(String token : fm.keyset()){
            Schema.DescribeFieldResult describeResult = fm.get(token).getDescribe();
            if(describeResult.isCreateable() && !describeResult.isNillable() && !describeResult.isDefaultedOnCreate()){
                options.add(new SelectOption(describeResult.getLabel(),describeResult.getLabel()));
            }
        }
        return options;
    }
}

Apex code to get Child Relationship from an object -
You can access the child relationship from a parent sObject and also the child sObject using the ChildRelationship object method.

A ChildRelationship object will be returned when you call the method getChildRelationship().
VF Page ::
<apex:page controller="ObjectRetrievePractice">
    <apex:form id="TheForm">
        <apex:pageBlock title="Display Account's Child Objects">
            <apex:outputLabel value="Child Objects from Account ">
                <apex:selectList size="1">
                    <apex:selectoptions value="{!allAccountChildObjects}"></apex:selectoptions>
                </apex:selectList>
            </apex:outputLabel>
        </apex:pageBlock>
    </apex:form>
</apex:page>
Controller ::
public with sharing class ObjectRetrievePractice {
    //Method to fetch Child Relationship from Account object dynamically
    public List<SelectOption> getAllAccountChildObjects(){
        List<SelectOption> options = new List<SelectOption>();
        
        Schema.DescribeSObjectResult describeResult = Account.SObjectType.getDescribe();
        List<Schema.ChildRelationship> lstchildrelationships = describeResult.getChildRelationships();
        
        for(Schema.ChildRelationship relname:lstchildrelationships){
             options.add(new SelectOption(relname.getChildSObject().getDescribe().getLabel(),relname.getChildSObject().getDescribe().getLabel()));
        }
        
        return options;
    }
}

Apex code to fetch/display Trigger Names of selected object -
List<String> triggerName = new List<String>();
               
Schema.DescribeSObjectResult result = Account.sObjectType.getDescribe();
for(ApexTrigger aptrig:[select id,name,Status,TableEnumOrId from apextrigger where TableEnumOrId=:result.getName()]){
    triggerName.add(aptrig.name);
}
System.debug('--Trigger Names :: '+triggerName);



Apex code to fetch Record Type ID without SOQL -
We can use getRecordTypeInfosByName() method to get the record type ids without using SOQL. This will help us to reduce the SOQL operation in the code.

Schema.DescribeSObjectResult result = Account.sObjectType.getDescribe();
//Getting all Recordtype from Account object
if(result.getRecordTypeInfosByName() != null) {
    Map<String,Schema.RecordTypeInfo> recordTypeInfo = result.getRecordTypeInfosByName();
    System.debug('-- recordTypeInfo:: '+recordTypeInfo);
 //Getting  Telecom Record Type Id. I have this record type in my org
 if(recordTypeInfo.containsKey('Telecom')) {
  Id rtId = recordTypeInfo.get('Telecom').getRecordTypeId();
  system.debug('-- Record Type id:: '+rtId);
 }   
}

With all the above code snippets, I hope you already realized the power of Dynamic Apex. So please go ahead and play as much as your want. Sky is the limit here.

I will really appreciate if you provide me your valuable feedback. Thanks.
Share:

"Lightning Design System" Series || Part 1 || Introduction and Setup your environment to build Visualforce Page with Lightning Design System


The Salesforce User Experience team has come up with a great UI framework called Lightning Design System. The intention is to build application, visualforce pages with this framework which will comply with the new Salesforce lightning look and feel. And the best part is that you don't need to play with CSS.

Now you probably started thinking why I should go for this new Lightning Design System when I have Twitter Bootstrap or Foundation with which also I can achieve the same. The reason is very simple and they are as follows -
  • With the use of this new Lightning Design System, your application or visualforce page will comply with the new Salesforce look and feel.
  • It is a new design system and it is getting improved every day. So as long as you are referring the latest version of design system, you are getting most out of this new framework.
  • The CSS is fully namespaced with slds- prefix which will avoid CSS conflicts.
Ingredients of the Framework:
Salesforce Lightning Design System framework comes with four types of resources.
  • CSS Framework: This will contain UI components, such as page headers, form elements, buttons, grid layout system. This will come up with a single purpose helper class which will assist with spacing, sizing and other visual adjustments.
  • Icons: Includes action, custom, standard and utility icons both in PNG and SVG format.
  • Font: Salesforce designed a new font - Salesforce Sans font. This font is available here.
  • Design Tokens: These are simple variables which will help you design pages, application matching your brand. 
Usage of the Framework:
You can use this framework in -
  • Visualforce pages. (You don't need Lightning Experience enabled in your org for this).
  • Lightning pages and components
  • Mobile apps.
  • Standalone web apps.
Ok enough of theory.

Let's start preparing our environment, so that we can play around.
Before we even start we need to install Lightning Design System as static resource. To use this framework in visualforce page, you need to create a CSS file with a custom scoped outer wrapper. Don't worry. Salesforce comes up with CSS Customizer tool for this. You can use that by following the below steps -
  • Click on Design System CSS Customizer Tool.
  • Choose the Salesforce release and scoping class. You need to remember the class name as you are going to refer the same during visualforce page development.
  • Once done, upload the zipped file as static resource in Salesforce. Please name it SLDSXXX where XXX is the version. The day when I am writing this blog post, the latest version is 2.0.3. So my static resource name is SLDS203.
  • Done.
Let's write our first Visualforce page:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<apex:page showHeader="false" standardStylesheets="false" sidebar="false" applyHtmlTag="false" applyBodyTag="false" docType="html-5.0">
    <html xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <head>
            <title>Salesforce Lightning Design System Trailhead Module</title>
            <apex:stylesheet value="{!URLFOR($Resource.SLDS203,'assets/styles/salesforce-lightning-design-system-vf.css')}"/>
        </head>
        
        <body>
            <div class="suddeb">
                <p class="slds-text-heading--label slds-m-bottom--small">
                    Salesforce Lightning Design System Trailhead Module
                </p>
            </div>
        </body>
    </html>
</apex:page>
After saving this visualforce page, if you execute, you will see that the look and feel in as per the new Salesforce look and feel. Awesome.

Let's now understand the important stuffs here -
  • Line# 3: To use Salesforce Lightning Design System, you need to make sure that you are including the below attribute in html tag, which will enable support for SVG icon sprite maps within Visualforce.
  • Line# 2: We are turning off header, sidebar and built in stylesheet. With this turned on, you can't add extra attribute in html tag(specified above), which means SVG will not be supported.
  • Line# 6: This is the step/way how you are including lightning design system stylesheet from static resource. This is very important to make sure lightning design system CSS stuffs are available in your visualforce page.
  • Line# 10: To use Lightning Design System markup in visualforce page, it should be placed inside an outer wrapper
    with scoping class you created using CSS Customizer tool. In my case,  the name of the scoping class is: "suddeb". 
  • Don't worry about Line# 11 for the time being. I will explain the same in my next post.
Great. So we have created our first visualforce page with Lightning Design System. In my next post, I will get into more details. Till then, please provide your feedback. Thanks.

Share:

Apex Debugger || All you need to know || Advanced Configuration

This post is in continuation of my previous post where I have explained the basic configuration of Apex Debugger. If you haven't gone through that, I would request you to please go here.

So with the assumption that you have configured Apex Debugger correctly and can do debugging, in this post, I will explain some advanced configurations which you can do with Apex Debugger.

So let's start -
  • Choose for which user you want to enable the Apex Debugger - You can choose the user for which you want to enable the Apex Debugger. For that open Debug Configuration. Then check the Whitelisting Enabled and Use SOQL where clause option. Then put the where clause. For example in the below screenshot, I have put the ID of the user and clicked on the Query button 
  • Choose the request type - With this option you can select the request type for which you want to enable the Apex Debugger. Currently we can enable Apex Debugger for the below options - Execute Anonymous, Inbound Email Service, Invocable Action, Lightning/Aura, Quick Action, REST, Run Tests Synchronous, SOAP, Synchronous, Visualforce, Visualforce Remote Method. If you don't choose anything, it means it is enabled for all the above types of requests.
  • Choose Entry Point - With this option, you can choose the entry point. For example if you want to enable Apex Debugger for particular Visualforce page, you can put .*/apex/DemoPage.apexp
Let's check out the above mentioned advanced configurations with one example.

Use case: Create a VisualForce page where accounts can be selected by lookup button. Once an account is selected, all the associated contacts will be displayed.
Implementation:
Here is the VisualForce Page -

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<apex:page standardController="Contact" extensions="SudiptaDeb_ContactList_Demo" showheader="false">
<apex:form >
 <center>
  <br/><br/>
        <apex:outputLabel value="Account Name"> 
   <apex:inputField value="{!Contact.AccountId}" required="false" id="lid">
    <br/><br/><br/>
           <apex:actionsupport event="onchange" rerender="check"/>
         </apex:inputField>
        </apex:outputLabel>
        <apex:outputPanel id="check">
      <apex:outputLabel value="Contacts:" rendered="{!contact.AccountId!=null}">
           <apex:selectCheckboxes value="{!selectedAccount}">
              <apex:selectOptions value="{!items}"/>
          </apex:selectCheckboxes><br/>
         </apex:outputLabel>
        </apex:outputPanel>
 </center>
</apex:form>
</apex:page>
Here is the controller SudiptaDeb_ContactList_Demo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public with sharing class SudiptaDeb_ContactList_Demo {
 public contact selectedAccount{get;set;}
  public SudiptaDeb_ContactList_Demo(ApexPages.StandardController stdCtrl) {
  selectedAccount=(Contact)stdCtrl.getRecord();
  }
  public List<SelectOption> getItems(){
       List<Contact> cntList=[select Name from Contact
              where AccountId=:selectedAccount.AccountID];
       List<SelectOption> options = new List<SelectOption>();
        for (Contact c:cntList){
   options.add(new SelectOption(c.Name,c.Name));
        }
        return options;
 }
 }

Debugging:
Now what I will do here are mentioned below -
  • I will give my User ID in the Debug Configuration | Whitelisting Enabled section to make sure only my requests will be considered for Apex Debugging. With this option, if someone else is working in the same Sandbox, their requests will not be tracked here.
  • I will select VisualForce under request type because I am only interested to debug when the execution will trigger from VisualForce page. My intention is that I will do some activity in the VisualForce page and I would like to debug the Apex controller code.
Here is the screenshot of all the configurations -

Now in the controller, I will put breakpoints @ line # 4, 7 and 13. After that with Debugger session on, when I will select an account in the VF page, the execution will stop at the breakpoints. Below is the screenshot -

So now I can debug my controller by starting the execution from VisualForce page. With this example, I believe you will feel more comfortable to play with other supported request types. Go ahead. It's all yours. 

Lastly I would like to inform you about few limits and considerations.
Apex Debugger Limits -

Apex Debugger Considerations -
Click here

Please let me know your feedback. Thanks in advance. Happy Salesforce Debugging!!!
Share:

Apex Debugger || All you need to know || Basic Configuration

Finally, Salesforce brings Debugging feature. I was waiting for this one for a long time and I am quite sure that many other developers like me also waited for this one.

Today in this post, I would like to explain how you can use this feature and make your Salesforce developer life more powerful.

Before I start, I would like to mention that this feature is not available in Developer orgs, it is only available in Sandboxes. You need to contact Salesforce to enable this feature in your Sandboxes. There is cost involved in getting this one enabled. To know about the cost, please contact Salesforce.

With the assumptions that you have enabled this feature in your Sandbox, you need to setup your Sandbox as well as your Eclipse workplace. Below are the steps mentioned in Salesforce guide -

Setup Sandbox for Apex Debugger -
Setup Force.com IDE -
  1. First you need to Install or Update Force.com IDE plugin as instructed below -
  2. Once done, create a Salesforce project as instructed here. Note - Make sure you mark your Eclipse project as work online.
Setup Eclipse Debugger -
This is the most important step where you need to setup your Eclipse Debugger. To do that -


  1. Click on the Debug Icon in the toolbar and select Debug Configuration
  2. Select Remote Apex Debugger
  3. Click on the New Launch Configuration Icon
  4. Give some name of your configuration
  5. Click Browse and select your project
  6. Click Apply, and then Debug.
Once you are done with the above steps, your basis setup is done and you are ready to use Apex Debugger. So let's use now.

I have created one very basic Apex class to start with. The code is below -

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public with sharing class SudiptaDeb_ApexDebug_Demo {
 public void method1(String str){
  method2(str);
 }   
 
 private void method2(String str){
  String strToBePassed = 'String from method1: ' + str;
  method3(strToBePassed);
 }
 
 private void method3(String str){
  String strToBeDisplayed = 'Final String: ' + str;
  System.Debug(strToBeDisplayed);
 }
}
Now let's follow the below steps to do the debugging -
  • Setup breakpoint @ line # 3, 7 and 12. Intention is that we will see the values of the variables during the execution flow. You can setup breakpoint by double clicking on the line numbers
  • Open the Debug perspective by choosing Window | Open Perspective | Other | Debug
  • Click on the Debug icon and launch the new debug configuration (created earlier) You will get yellow gear icon indicating that your debug session is ready. 
  • Let's execute the below code from Developer console's Execute Anonymous Window -         new SudiptaDeb_ApexDebug_Demo().method1('Sudipta Deb');
  • Once you start that you will see that in Eclipse the executing is waiting at your first breakpoint as shown below -
  • Watch the value of the variable as shown below - 
  • Click on Step Over icon you will see the execution is now moved to second breakpoint. Watch for the value now as shown below - 
  • Again click on Step Over icon you will see the execution is now moved to third breakpoint. Watch for the value now as shown below - 
If you are able to do the above steps and see the results, it means you have Apex Debugger setup correctly and you now have the power you need in your hand. 

Great!!! In my next post, I have explained some of the more advanced features of Apex Debugger. Till then, feel free to post your comments and let me know how you feel about this great feature from Salesforce. Have a nice day. 
Share:

Summer'16 New Feature || Create your own calendar from any object


Salesforce Summer'16 release is a milestone release for Salesforce as it is their 50th release. But apart from being the 50th release, there are many reasons for considering this release as the milestone release. In this release, Salesforce brings some of the really key features which are really awesome.

In this post, I am going to discuss about the new feature called - Creating Calendar from anything in Salesforce.

Really!! Yes, as the name suggests now you can create a calendar from any object in Salesforce. As long as you have some date fields present in the custom object, you can create calendar from that object. This feature is available in Lightning Experience only and available in Enterprise, Unlimited and Developer edition.

But to understand why we need calendar let's give you an example. Say you are working with opportunities. So from the list view - "All Opportunities", you can get the details about the closing date of the opportunities. But it's still in the list view showing the details in rows. But think if you can get a visual calendar representation of the same information, it will have more powerful impact as well as give you the information more quickly. From the calendar, you can easily identify which opportunities are closing this day, or this week, or this month. So yes, this is really a cool feature introduces by Salesforce.

So without any further delay, let's discuss about different options available while creating the calendar with some example. Follow the below steps to create calendar (in this example, I am creating calendar from Opportunity object showing the closing date of the opportunities).  

Step 1:
Once you are in Lightning Home Page, go to Calendar from Navigation Panel

Step 2:
Click on New Calendar Option as displayed below in the screenshot.
Step 3:
This is place where you can select the object for which you want to create the Calendar. So for our example, let's select Opportunity object and click next.
Step 4:
Now below screen is the most important one. Here you can select -
  • Calendar Name:  Very much self explanatory, the name of your calendar.
  • Field for Start:  This field will decide where to put the entry of your record in the calendar. Here you can choose either Date type or Date/Time type field. If you choose Date type field, calendar entry will show full day event whereas if you choose Date/Time type field, calendar entry will be exactly on the same date and same time.
  • Field for End: This is an optional field. This will decide how long the calendar entry should be like calendar entry end time. Here you have to select same type of field i.e. either Date or Date/Time type which you have selected in Field for Start.
  • Apply a Filter: This will decide your calendar will work on which list views. You can select available list views from the object.
  • Field Name to Display: This will decide what will be displayed in the calendar entry.
So for our example where we want to display Opportunity closing information in the Calendar, choose the below values as shown in the below screenshot -


We are done. Our calendar is ready. Let's see how it looks now -

Note - The color of your calendar will be same as configured in the object.

So now what do you think? Don't you think it is a great feature. 

There are few considerations while creating calendar also, but I would like to highlight one consideration here which is the limit of 150 calendar entry in day or week view including all your calendars and Salesforce events. If you have more than 150 calendar entries in the selected calendar, Salesforce Lightning system will show you an alert message and hides entries from other calendar.
 You can go through the other considerations here -
https://help.salesforce.com/apex/HTViewHelpDoc?id=calendar_create_limitations.htm&&language=en_US

I request you to try this out in your developer org. Please provide your comments. Thanks.
Share:

Follow Me

Enter your email address:

Delivered by FeedBurner

Labels

Salesforce (105) Apex (47) admin (27) visualforce (21) ADM (20) dev 501 (19) integration (18) learn salesforce (18) 501 (16) lightning (15) SOAP (13) javascript (13) tutorial (11) Certification. (10) Kitchener Developer Group (8) Certification (7) Trigger (7) security (7) test class (7) unit testing (7) Advanced Admin (6) Advanced Apex (6) Sharing and Visibility (6) design pattern (6) developer (6) report (6) salesforce release (6) service cloud (6) trailhead (6) Lightning Experience (5) New Features (5) SOQL (5) css (5) dashboard (5) debug (5) formula (5) mobile (5) solution management (5) use case (5) JSON (4) Kitchener User Group (4) Lightning Web Component (4) Sales Cloud (4) Salesforce DX (4) Tips (4) WebSphere (4) best practice (4) cast iron (4) component (4) deployment (4) event (4) github (4) html (4) polymer (4) profiles (4) responsive (4) tdd (4) ui (4) Architect (3) Live Chat (3) Online Event (3) Opportunity (3) Performance (3) Products (3) REST (3) Role (3) Salesforce Certification (3) Scratch Org (3) Study Notes. (3) Summer15 (3) Web Technology (3) automation tool (3) dynamic apex (3) license (3) map (3) mapbox (3) release (3) singleton (3) version controlling (3) visual studio code (3) Asynchronous callout (2) Aura Framework (2) Bulkify (2) Community (2) Data Architecture and Management Certification (2) Devops (2) Distributed Version Controlling (2) ES6 (2) Eclipse (2) Einstein (2) Enterprise Territory Management (2) Financial Services Cloud (2) Force.com IDE (2) Governor Limit (2) Groups (2) IBM (2) Implicit Sharing (2) JourneyToCTA (2) Lightning Design System (2) Lightning Feature (2) Live Agent (2) Metadata (2) PD II (2) Price Book (2) SOSL (2) Sharing (2) Spring 15 (2) Summer17 (2) Territory (2) Virtual Event (2) ant (2) basic (2) chatter (2) coding (2) communication (2) configuration (2) console (2) controller (2) documentation (2) dreamforce (2) flow (2) git (2) jquery (2) logging (2) object (2) permission (2) process builder (2) salesforce1 (2) strategy (2) xml (2) Action Plan (1) Action Plan Template (1) Activity Timeline (1) Advanced Currency (1) Agent Productivity (1) Analytics (1) Apex Sharing (1) AppExchange (1) Arrow (1) Article (1) Asynchronous Apex (1) Batch (1) Bots (1) Browser (1) Bulk data load (1) CTA (1) Calendar (1) Canon (1) Case Management (1) Celebration (1) Cheat Sheet (1) Classic (1) Compare (1) Confetti (1) Constructor (1) Contact Center (1) Continuation (1) Continuous Integration (1) Convert (1) Cookie (1) CumulusCI (1) Custom Metadata (1) Custom Object (1) Custom Permission (1) Customer (1) Dated Exchange Rate (1) Decorator Design Pattern (1) Dev Hub (1) Development (1) Diwali (1) EDA (1) ESLint (1) Education Cloud (1) Email (1) FSC (1) Function (1) Future (1) Global Gathering (1) Goals (1) Guest Access (1) Guest Profile (1) Guest User Sharing Rule (1) Guide (1) HEDA (1) Higher Education (1) Household (1) Husky (1) IDE (1) Ideas (1) Improvement (1) KPIs (1) Knowledge Management (1) LWC (1) Large Data Volume (1) LastModifiedDate (1) Manage Currencies (1) Manual Sharing (1) Metrics (1) Multi Currency (1) New (1) New Feature (1) OOPS (1) OWD (1) Omni-Channel (1) Partner (1) Permission Set (1) Person Account (1) Photo (1) Pipeline (1) Platform Developer I (1) Platform Developer II (1) Presentation (1) Prettier (1) Product Schedule (1) Profile (1) Promise (1) Prototype (1) Public Site (1) Query Plan (1) Queueable (1) QuickReference (1) Related records (1) Reports (1) Retrieve (1) Role Hierarchy (1) SAL (1) SFDX (1) Salesfor (1) Salesforce Advisor Link (1) Salesforce Labs (1) Salesforce Optimizer (1) SalesforceDx (1) Schedule (1) Session (1) Sharing Rule (1) Sharing Sets (1) Site (1) Skills (1) Snap-ins (1) Spring 17 (1) Spring 20 (1) Summer14 (1) Summer16 (1) Summer19 (1) Switch (1) SystemModStamp (1) Timeline (1) Unauthorized Access (1) User License (1) Users (1) VS Code (1) Validation Rule (1) Webservice (1) Winter'15 (1) Winter'17 (1) access (1) actionFunction (1) actionPoller (1) actionRegion (1) actionSupport (1) agile (1) app (1) approval process (1) aura (1) awesome (1) backup (1) bitbucket (1) book (1) campaign (1) change set (1) code (1) code coverage (1) csv (1) custom button (1) custom settings (1) customization (1) data loader (1) database (1) delegate Admin (1) describe (1) dom (1) duplicate (1) dynamic (1) equals (1) error (1) field-level security (1) folder (1) ftp (1) generic (1) gift (1) global describe (1) hashcode (1) import wizard (1) jenkins (1) keynote (1) long running requests (1) monitoring (1) mysql (1) page layout (1) personal (1) power of one (1) record type (1) relationship (1) request (1) review (1) sub-tab (1) tab (1) username (1) visual workflow (1) workflow (1)

Popular Posts

Total Subscribers

Total Pageviews

Contact Me

Name

Email *

Message *