Monday, December 24, 2018

Transform your career to Salesforce Platform

Motivation behind this


Many a times, I have received requests from unknown aspirants through Facebook or Linkedin as to how to get started his/her career to Salesforce, or how to transform their career to Salesforce. 

Very recently, two of my colleagues  who are working on Mainframe for quite a long time and trying to learn Salesforce from me and I am guiding them on day-to-day basis.

I thought that this guidance could be good start for others to follow. The following content is indicative and may vary from person to person and based on their existing skill set.

Let's get started



       The above picture is taken from Salesforce website


2. Visually through some videos from Salesforce University to get started: 
       





10. Complete Superbadges based on Role that you are going to perform. Here is the link:   Trailhead Superbadges. If you complete those superbadges then you should definitely work on any real-life projects.

11. Have a look into my post Effective Salesforce certification path with preparation time saving options which will guide you about Salesforce certifications based on the roles.

12. Register for certifications at webassessor

13. Prepare your Salesforce based resume and try to get into Salesforce practice at your company or jobs.

And the journey continues.

Hope above approach will help you. For any additional input, please post as comments and I will guide you.

Also, create a twitter account if you do not have already and follow @Salesforce, @Trailhead, @SalesforceDevs, @SalesforceAdmns, Salesforce MVPs, Salesforce success community members, and any member who are passionate about Salesforce. You will really get motivated seeing others' posts and progress.

Be sure to post your progress at twitter and encourage others to learn.

Results


Both my colleagues, completed 100 trailheads within 6 weeks achieving Ranger status and are in a learning path till today.

Here are noticeable achievements recognized by @Trailhead.

  
Posted by @kingshuk1sarkar

Posted by @Sudipta1ghosh

Many congratulations to both of them! 

Friday, October 5, 2018

Effective Salesforce certification path with preparation time saving options

Motivation behind this


Many a times, I have received requests from my colleagues or friends on what certification to begin with and what certification to write next. After passing 18 Salesforce certifications, I have planned to share my thoughts on the certification path but with preparation time saving with proper direction.

The path will vary from person to person and the roles people are playing at their organization. Since ultimate goal is to reach highest level of certification i.e. Technical Architect, so how a Developer or Administrator could reach that target, I am trying to portray.

Also, I have posted the same in twitter and received numerous likes and retweets. Hope people thought about its usefulness. 


Effective Certification Path


 click on the above image to expand

Legends used

All green boxes are part of System Architect certification
All orange boxes are part of Application Architect certification.
PDI is blue box which is pre-requisite for both Application and System Architect certifications.
Solid arrow is most preferable to go next.
Dashed arrow is optional

Reasons behind effort saving


For example, if a developer wants to go for architect related certification then better to complete PDII which will help for his developer role and after that choose Integration Architect certification. Here the some part of integration related study materials can be reused, specially use of SOAP API, REST API related topics. So around 20% effort saving during preparation. You can say less reading or revision.

Second scenario, if an Administrator wants target for Architect level exams then go for some Consultant level exams and then appear for Sharing & Visibility exam. Since Sharing and visibility topics are quite common for all Consultant level exams so there could be 20% effort saving considering that path.

Conclusion


Hope it will help our community members to reach their own destination. Again, this path will vary based on own target and it is not universal to be followed but it is indicative one.

For all certifications, refer http://certification.salesforce.com/

Wednesday, September 26, 2018

Tips for passing Salesforce Certified Field Service Lightning Consultant

Today (26th September'2018), I have successfully passed Salesforce Certified Field Service Lightning Consultant exam. Here are few tips to pass the exam.


Exam Outline


  • Content: 60 multiple-choice/multiple-select questions * (5 unscored questions will be added)
  • Time allotted to complete the exam: 90 minutes (time allows for unscored questions)  
  • Passing Score: 70%  
  • Registration fee: USD 200, plus applicable taxes as required per local law 
  • Retake fee: USD 100, plus applicable taxes as required per local law 
  • Delivery options: Proctored exam delivered onsite at a testing center or in an online proctored environment. 
  • References: No hard-copy or online materials may be referenced during the exam. 
  • Prerequisite(s):  Salesforce Certified Administrator credential and Salesforce Certified Service Cloud Consultant credential.

I have faced 65 questions and regarding the complexity level it is easier as compared to Sales Cloud, Service Cloud certifications.



Preparation

I have attended Salesforce training for during month of August and here is following points which I have used during my preparation.


Core Data Model

 


(above 2 images referred from Salesforce documents)

Topics I have received on Exam


  • Managing assets and preparing BoM (Billing of material) from asset hierarchy.
  • Sequence of configuring Milestones, Entitlement Process, Entitlements, Create Case
  • Entitlement Models (Entitlements only, Entitlements + Service Contracts, Entitlements + Service Contract + Line Items)
  • Configuring and use case of product specific entitlements
  • Use of entitlement templates for predefined support contracts.
  • Customer support interactions through Cases and Work Orders and their life cycle.
  • Use Cases of relating Work Orders to Asset, Account, Contacts.
  • Use case of using preferred resource.
  • Updating Work Order when all work order line items are complete.
  • Updating Case status on work order closure
  • Scenarios of signature capturing at client location.
  • Creating follow up task or service appointment and relating with parent.
  • Attaching knowledge article to work order or work order line item which can be used in client location
  • Use case of maintenance job
  • Work Order process
  • Use case on linking Work Order with Asset
  • Service reports and when to use what
  • Tracking of product consumed, product transfers, shipments
  • Use of operating hours at resource and service appointment
  • Skills and Work Types
  • Scheduling optimization - Scheduling policies (Customer First, Soft Boundaries, High Intensity) which can be changed from
    • Gantt
    • per object for Appointment Booking
    • for optimization request
  • Marking active resources
  • Finding minimum travel from home
  • Work Rules and Service Objectives
  • Global Actions for upsell opportunities
  • Emergency Dispatch configuration
  • Use of Contracts for capacity based resource allocation
  • Use of external workforce
  • Enabling status transition
  • Location Management
  • FSL Mobile Setup - changing color, logo, using knowledge, using quick actions
  • In door service appointment
  • Single and Bulk appointment scheduling
  • Fixing overlaps
Hope, this will help you to prepare for the exam.

Tuesday, August 28, 2018

Tips for passing Salesforce Certified CPQ Specialist

Today (27th August'2018), I have successfully passed Salesforce Certified CPQ Specialist. Here are few tips to pass the exam.


Exam Outline


  • Content: 60 multiple-choice/multiple-select questions * (5 unscored questions will be added)
  • Time allotted to complete the exam: 105 minutes (time allows for unscored questions)  
  • Passing Score: 68%  
  • Registration fee: USD 200, plus applicable taxes as required per local law 
  • Retake fee: USD 100, plus applicable taxes as required per local law 
  • Delivery options: Proctored exam delivered onsite at a testing center or in an online proctored environment. 
  • References: No hard-copy or online materials may be referenced during the exam. 
  • Prerequisite: None required; course attendance highly recommended. 

I have faced 65 questions, some of the questions are descriptive and contained long code script, which took time to read and understand the question. This exam is much harder than any of the Consultant exams.

Above all, it's good to see me passed.


Preparation

I have attended Salesforce training for Partner during month of June and here is following points which I have used during my preparation.

Refer, CPQ architecture diagram



Refer, CPQ Data Model


Refer, Quote-to-Cash Functionality



Topics I have received on Exam


  • CPQ Product fields - Hidden, Quantity Editable
  • Subscription Products, Subscription Terms, Types of Subscription Pricing and usage, Percentage (%) of Total and its effect on calculation.
  • Proration
  • Subscription Prorate Precision
  • Subscription Term unit
  • Product Bundle
  • Configuration Type and Event
  • Features
  • Option Constraints, Constrained Option, Constraining Option, Type (Dependency, Exclusion) 
  • Numbering for sequence
  • Different types of Product Options (Component, Accessory, Related Product)
  • Percentage of Scope (Package, Component, Both)
  • Product Rule (at-least 4-5 question on this), Evaluation Event (Load, Edit, Save), Type (Validation, Selection)
  • Error Condition Fields (Tested Object, Tested Field)
  • Product Action Fields (Type = Add/Remove, Enable/Disable, Show/Hide)
  • Configuration Selection Rules
  • Create Production rule based on prior Asset.
  • Configuration Attributes
  • Auto-mapping (Twin fields)
  • Hiding options in Configurator
  • Custom actions
  • Dynamic Custom actions
  • Search filters
  • Guided Selling
  • Building workflow to map quote process
  • Pricing Structure (List Price, Regular Price, Customer Price, Partner Price, Net Price)
  • Discount Schedule (Volume, Term, Cost), Type (Range, Slab), Cross Products, Cross Orders
  • Pricing Methods (List, Block, MDQ, Cost + Markup, Subscription Products & Proation)
  • Pricing Rule (Inject a value into Quote or Quote Line Field), Calculator Evaluation Event
  • Summary Variable
  • Quote Template, Template content, Template Sections, Line Columns, Page Break
  • Types of Template Content
  • Use of merge fields
  • Troubleshooting (Like Attempt to de-reference a null object error during previewing a quote template)
  • Renewal Contract
Hope, this will help you to prepare for the exam.

Monday, July 30, 2018

Tips for passing Salesforce Certified Commerce Cloud Digital Developer

Today (30th July'2018), I have successfully passed Salesforce Certified Commerce Cloud Digital Developer. Here is few tips to pass the exam.

Exam Outline

  • Content: 60 multiple-choice/multiple-select questions * (5 unscored questions will be added)
  • Time allotted to complete the exam: 105 minutes (time allows for unscored questions)
  • Passing Score: 70%
  • Registration fee: USD 200, plus applicable taxes as required per local law
  • Retake fee: USD 100, plus applicable taxes as required per local law
  • Delivery options: Proctored exam delivered onsite at a testing center or in an online proctored environment. Click here for information on scheduling an exam.
  • References: No hard-copy or online materials may be referenced during the exam.
  • Prerequisite: None
I have faced 65 questions, some of the questions are descriptive and contained long code script, which took time to read and understand the question. 

Above all, it's good to see me passed.



Prerequisites

You need a sandbox and access to Commerce Cloud Account Manager. If your company is Salesforce Partner then requesting to Salesforce will have access.

Topics I have received on Exam


  • How to connect sandbox from UXStudio.
  • Lot's of question on Import and Export, (including Site, Product etc)
  • What are different type of includes and for which purpose it is being used. Read on <include>, require()
  • Content Link functions like $url()$, $httpUrl()$, $httpsUrl()$, $include()$
  • Different types of scopes like Session, Request, Page and when to use what.
  • How to show error message when required mandatory input has not given.
  • How to create an instance of custom object.
  • Write a correct code to show Debug message.
  • Log file formats.
  • Accessing values for multi-lingual requirements.
  • Creating and using custom tags.
  • CSRF and how to prevent those.
  • Quota and what happens when it is exceeded and what needs to be done.
  • Cache: how to define cache
  • How to identity the cache related issues.
  • Creating custom attributes and how to make it indexed.
  • Open Commerce API (OCAPI) and calling webservices using SOAP, REST etc.
  • Correct syntax using GET and POST with authentication.
  • Hooks: Which hook needs to be used given a certain use case.
Hope, this will help you to prepare for the exam.


Wednesday, July 25, 2018

Engaging and working on Ideas using Salesforce

Use Case


I was answering this question End user adoption/understanding in Stackexchange and thought of having this use case. 

Usually the project team has an idea and they build a few features, alerts, dashboards, etc.
Yet, vendor often see that end users do not always understand everything we built. Vendor has noticed that his notes/guides tend to be somewhat technical, but maybe he should build some sort of knowledge base that tells the user 'alert 1' does XYZ.
How do you tackle it?

Probable approach


  1. If vendor has an idea then post this idea in chatter and get votes on this idea. Also, vendor should make sure users are adopting Chatter quite well, otherwise, ideas will not reach to the broader audience.
  2. Before actual implementation, vendor needs to engage your user on what you are planning to implement and how business will get benefited (either by, improvement of productivity, cost etc.)
  3. Show and Tell approach - Vendor can create a mock application to show customer and get customer's feedback and confidence.
  4. After implementation, vendor should create a Knowledge article, so that business can understand the effective use of the use case or need. Knowledge article should be readable and sometimes use of context sensitive pictures and flow charts helps users the understand the context.
  5. Easy access to the Knowledge article, so that when customers need it they will have it.
  6. Engaging them in Chatter when vendor comes up with this implementation.
  7. Taking feedback periodically, how Customers are using this feature and what's their suggestions for future improvements.
  8. Build continuous improvement process at your organization.

Sunday, July 8, 2018

Displaying lightning:radioGroup dynamically from SOQL query

Use Case


Sometimes we receive a use case to display dynamic radio button with dynamic options querying the data from database via SOQL query.

Let's say, questions and answers to be populated and displayed in lightning components.

I was answering this question lightning:radioGroup - not able to select the options in stackexchange and able to produce a small poc with an approach.

Approach


Create Question and Answer custom object with following attributes.

Question Object (Question__c)
  • Question Name (Auto number)
  • Question Text (QuestionText__c, TextArea(255)).
Answer Object (Answer__c)
  • Question (Master-Detail (Question)
  • Option (TextArea (255))
  • Correct Answer (Checkbox)
Following things to considered when implementing this solution:

  1. To group the options for individual question, the name should be unique. Here QuestionText has been used. You can use QuestionId.
  2. We can see in the reference Radio group in Lightning Component Library that options attribute takes label and value as follows. So we need to pull the options as AnswerText__c from Answer object and assign those values as label and value.


<aura:component>
    <aura:attribute name="options" type="List" default="[
    {'label': 'Sales', 'value': 'option1'},
    {'label': 'Force', 'value': 'option2'}
    ]"/>
    <aura:attribute name="value" type="String" default="option1"/>

    <lightning:radioGroup name="radioGroup"
                          label="Radio Group"
                          options="{! v.options }"
                          value="{! v.value }"
                          type="radio"/>
</aura:component>

So, the component code will look like this.

Quiz.cmp

 <aura:component controller="QuestionAnswerClass" access="global" >  
      <aura:attribute name="Questions" type="List"/>  
   <aura:attribute name="radioGrpValue" type="List"/>   
   <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>  
   <aura:iteration items="{!v.Questions}" var="ques">  
     <lightning:radioGroup name="{!ques.QuestionText__c}"  
                           label="{! ques.QuestionText__c}"   
                           options="{!ques.Answers__r}"  
                           value="{! v.radioGrpValue}"  
                           type="radio"  
                           required="true"/>  
   </aura:iteration>   
 </aura:component>  

QuizController.js


({
 doInit : function(component, event, helper) {
  helper.doInit(component, event,helper);       
 }
})

QuizHelper.js


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
({
 doInit : function(component, event, helper) {
        
  var action = component.get("c.getQuestionAnswers");
        
        action.setCallback(this, function(response) {
            var state = response.getState();
            if (state === "SUCCESS") {
                var returnVal = response.getReturnValue();
                var finalList = [];
                for(var i=0; i<returnVal.length; i++)
                {
                    var answers = returnVal[i].Answers__r;
                    //append label and values into the list so it can be displayed as options
                    for(var j=0; j<answers.length; j++)
                    {
                        answers[j].label = answers[j].Option__c;
                        answers[j].value = answers[j].Option__c;
                    }
                    finalList.push(returnVal[i]);         
                }
                
                component.set("v.Questions", finalList);
            }
            else {
                console.log("Failed with state: " + state);
            }
        });
        // Send action off to be executed
        $A.enqueueAction(action);
 }
})

Apex Controller


public class QuestionAnswerClass
{
 @AuraEnabled
 public static List<Question__c> getQuestionAnswers()
 {
  List<Question__c> lstQues = [SELECT Name, QuestionText__c, 
     (SELECT Name, Option__c, Correct_Answer__c FROM Answers__r)
     FROM Question__c];
  return lstQues;
  
 } 
}

Quiz.app


<aura:application extends = "force:slds">
    <c:Quiz/>
</aura:application>

Desired Results


If we load the application clicking on preview, it will display like this.

User can see the dynamic questions with options and able to select options respective to questions.


For more information, refer Radio group in Lightning Component Library

Wednesday, May 2, 2018

Retain your knowledge using Salesforce Knowledge

Motivation behind this


Many a times, we have seen that when we come across a good information about a code snippet or documentation which has been used personally or professionally in project we use to save at our system. Sometimes we take a backup of the code using Force.com IDE.

But at times those are either not searchable or easy to find it when we need it.


Proposed Solutions

Create your own knowledge base

Idea of leveraging Salesforce knowledge to create own knowledge base which will help knowledge sharing, knowledge retaining, documenting tips & tricks, learning from POCs done in projects etc.
Here is my knowledge base tips and tricks


Use of data category to filter out relevant search



Keyword search



Example of an article (taken from my own answer at http://salesforce.stackexchange.com)


To create Salesforce knowledge, refer Getting started with Knowledge trailhead.


Salesforce provides nice knowledge management functionality which helps to retain our knowledge. We can create 100 articles in Developer edition.

If we can develop this and keep creating articles then it will be a huge effort saving on day to day  work and for future reference.

Appreciation from Salesforce


The above blog post has been appreciated by Salesforce in twitter. 



Saturday, March 17, 2018

Keyword Search Series - Display paginated data using Visualforce and Datatable for CaseComments with server side search

Use Case


User wants to search on Case Comment's body based on search input. The nature of functionality will as follows:
  • User will be navigated from Account Details page. Account records can have may cases and each case records may have many case comments.
  • User will provide the search input and based on the search input, data will be displayed at Visualforce page.
  • Keyword search needs to be performed on body of Case Comment.
  • Data will be displayed in the paginated way.
  • The keyword will be highlighted in yellow color.

The screen will be look like this:




Approach


If I like to follow my solution provided in the last post Keyword Search Series - Display data using Visualforce and Datatable using sever side ajax, it will not going to work.

Reason behind this, StandardSetController cannot take a List of Task, Event or CaseComment records. 

Secondly, in my last post I have used the Container Page that is main Visualforce page which doesn't have Controller. If I try to use Controller along with server side ajax which is using another Visualforce page then cross origin violation error will occur.

But the main page, I have to use Controller which might needed for other operations. Like I can have different buttons and can perform other actions etc (through it is not related to the small use case, but it is quite justified for most the scenarios).

Thirdly, for pagination purpose I can use jQuery Datatable, but the datatable search box will not use. As because, it will perform server side search and then pull the records from the Salesforce database.

Solution


Visualforce

1. For searching, declare textbox like this

<apex:inputText value="{!searchString}" label="Search in Comments"/>  

2. Create a pageBlockTable which will be used as jQuery Datatable
3. Since Datatable's searchbox should be hidden, use this style


.dataTables_wrapper .dataTables_filter {  
  float: right;  
  text-align: right;  
  visibility: hidden;  
}

4. Since we need to highlight the value, so we will assign datatable's "oSearch" attribute with the search input like this

"oSearch": {"sSearch": "{!searchString}"}

Is that sound interesting!!!

The full page will be as follows

1:  <apex:page id="AdvancedSearchCaseCommentPage" controller="AdvancedCommentSearchController" showHeader="false" action="{!init}" >  
2:    <head>  
3:      <apex:includescript value="//code.jquery.com/jquery-1.11.1.min.js" / >  
4:      <apex:includescript value="//cdn.datatables.net/1.10.4/js/jquery.dataTables.min.js" />  
5:      <apex:stylesheet value="//cdn.datatables.net/1.10.4/css/jquery.dataTables.css" />  
6:       <!-- Search Highlight -->  
7:      <apex:includeScript value="//bartaz.github.io/sandbox.js/jquery.highlight.js" />  
8:      <apex:includeScript value="//cdn.datatables.net/plug-ins/1.10.9/features/searchHighlight/dataTables.searchHighlight.min.js"/>  
9:      <apex:stylesheet value="//cdn.datatables.net/plug-ins/1.10.9/features/searchHighlight/dataTables.searchHighlight.css"/>  
10:      <style>  
11:        .filterMatches {  
12:          background-color: #BFFF00;  
13:        }  
14:        .tertiaryPalette {  
15:          color: #000 !important;  
16:        }  
17:        .dt-buttons {  
18:          margin-left: 10px;  
19:        }  
20:        .dataTables_wrapper .dataTables_filter {  
21:          float: right;  
22:          text-align: right;  
23:          visibility: hidden;  
24:        }  
25:      </style>  
26:      <script>  
27:        j$ = jQuery.noConflict();  
28:        j$(document).ready( function () {  
29:          var contactTable = j$('[id$="commentTable"]').DataTable({  
30:            "oSearch": {"sSearch": "{!searchString}"},  
31:            searchHighlight: true  
32:          });  
33:        });  
34:      </script>  
35:    </head>  
36:    <apex:form id="formid">  
37:      <apex:pageMessages id="msgsId"/>  
38:      <apex:pageBlock title="Advanced Search">  
39:        <apex:pageBlockSection >  
40:          <apex:outputText value="{!accountObj.Name}" label="Account:"/>   
41:          <br/>  
42:          <apex:inputText value="{!searchString}" label="Search in Comments"/>  
43:          <br/>          
44:        </apex:pageBlockSection>  
45:        <apex:pageBlockButtons location="bottom">      
46:          <apex:commandButton value="Search" action="{!searchComment}" />          
47:          <apex:commandButton value="Cancel" action="{!cancel}" />          
48:        </apex:pageBlockButtons>  
49:      </apex:pageBlock>  
50:       <apex:pageBlock title="Results" rendered="{!showResult}">  
51:         <apex:pageBlockTable value="{!lstRecords}" var="obj" rendered="{!showResult}" html-cid="commentTable" id="commentTable">           
52:            <apex:column headerValue="Case Number">  
53:              <apex:outputLink value="/{!obj.cont.ParentId}" target="_blank">{!obj.CaseNumber}</apex:outputLink>  
54:            </apex:column>  
55:            <apex:column headerValue="Comments">  
56:              {!obj.cont.CommentBody}  
57:            </apex:column>  
58:         </apex:pageBlockTable>   
59:      </apex:pageBlock>    
60:    </apex:form>  
61:  </apex:page>  

Controller


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**
Class:  AdvancedCommentSearchController
Author: Santanu Boral
Description: To search string from Case Comments.
------------------------------------------------------------------------------
*/

public class AdvancedCommentSearchController { 

    public String accountId {get;set;}
    public Account accountObj {get;set;} 
    public String searchString{get;set;}
    public Boolean showResult{get;set;}
    
    public List<CaseCommentWrapper> lstWrapper {get;set;}
    public List<CaseCommentWrapper> lstRecords{get;set;}
     
    String errorStr = ''; 
    
    public Boolean hasError { 
        get { 
            return ApexPages.hasMessages(); 
        }       
    }
    
    public AdvancedCommentSearchController()
    {    
        lstWrapper =  new List<CaseCommentWrapper>();
        lstRecords = new List<CaseCommentWrapper>();
    } 
    
    public void init()
    {
        accountId = ApexPages.CurrentPage().getParameters().get('id');
        accountObj = [SELECT Name FROM Account WHERE Id =:accountId];
    }
    
    public void searchComment()
    {
        lstWrapper =  new List<CaseCommentWrapper>();
        Map<Id,Id> commentToCaseIdMap = new Map<Id,Id>(); //commentId, CaseId
        
        try
        {
            //perform validations
            if(String.isNotBlank(searchString) && searchString.length()>2)
            {                 
                //retrieve the list of case comments
                List<CaseComment> lstComment = [FIND :searchString
                                    IN ALL FIELDS RETURNING CaseComment (id,ParentId,
                                    CommentBody
                                    WHERE Parent.AccountId = :accountId
                                    ORDER BY CreatedDate DESC)                         
                                    LIMIT 1000][0];
                                    
                
                if(lstComment.size()>0)
                {
                    showResult = true;
                    
                    //loop through the case comments and assign values to wrapper object.
                    for(CaseComment cont : lstComment )
                    {
                        commentToCaseIdMap.put(cont.Id,cont.ParentId); //commentId, CaseId
                        CaseCommentWrapper objWrapper = new CaseCommentWrapper();
                        objWrapper.cont = cont;
                        objWrapper.Id = cont.Id;
                        objWrapper.ParentId = cont.ParentId;
                        objWrapper.CommentBody = cont.CommentBody;
                        lstWrapper.add(objWrapper);
                    }
                    
                    //since we need to display CaseNumber so it should be retrieved via separate query
                    Map<Id, Case> mapCaseCommentQuery = new Map<Id, Case>([SELECT Id, CaseNumber
                                                                FROM Case
                                                                WHERE Id IN:commentToCaseIdMap.values()]);
                    
                    //assign CaseNumber to the respective comment entries.
                    for(CaseCommentWrapper wrapper:lstWrapper)
                    {   
                        if(mapCaseCommentQuery.containsKey(wrapper.ParentId))
                        {
                            wrapper.CaseNumber = mapCaseCommentQuery.get(wrapper.ParentId).CaseNumber;  
                        }         
                    }
                    
                    //create an instance of Iterable object
                    CustomCaseCommentIterable obj = new CustomCaseCommentIterable (lstWrapper); 
                    
                    //assign page size
                    obj.setPageSize = lstComment.size();
                    
                    //perform next
                    lstRecords = obj.next();
                }
                else
                {
                    showResult = false;
                    ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO,'No Records Found.'));
                }        
            }
            else if(searchString.length()<=2)
            {
                ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO,'Please enter at-least 2 characters'));
            }
         }
        catch(Exception ex)
        {
            errorStr ='Error Occured while Searching.';
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, 'errorStr:' +ex.getMessage()));
        }  
    }
    
    public PageReference cancel()
    {
        PageReference pRef =  (new ApexPages.StandardController (new Account(Id=accountId))).cancel();               
        pRef.setRedirect(true); 
        return pRef;
    }
}  

The visualforce page will be called from Custom Button which needs to be placed on Account page layout.

Code behind button

/apex/AdvancedSearchCaseCommentPage?id=<accountId>


Results


Initially user will be given to this page.


User will provide at-least 3 digit input and then controller's action method will populate the data based on SOSL search.


Conclusion


I have found this approach is really helpful in terms of performance and leveraging datatable's attributes mapping to the use case.

References