Wednesday, February 25, 2015

Filled Under: , , ,

Code and Visualforce Optimization using Custom Component and Abstraction


This post aims at minimizing Apex code and reusing visual force construct using custom components.

Let us start with a straight forward implementation, forgetting about any optimization. My requirement is I want to display an Account's Annual revenue only on a button click via a custom page.
I want do the same on the Contact page as well, here showing the associated Account's annual revenue.
I create two separate visualforce pages and two separate apex controllers to support them.
I added the visual force pages as inline to the Account layout and the Contact layout respectively.
Page 1: GetAccountAnnualRevenue
<apex:page standardController="Account" extensions="AnnualRevenueController">
<apex:form >
    <apex:pageBlock >
        <apex:pageBlockButtons location="top">
            <apex:commandButton value="Click Here" action="{!fetchAnnualRevenue}"/><br/><br/>
            <apex:outputText value="Annual Revenue   " />
            <apex:outputText value="{!annualRevenue}" label="Annual Revenue"></apex:outputText><br/>
        </apex:pageBlockButtons>
    </apex:pageBlock>
</apex:form>
</apex:page>


Controller 1: AnnualRevenueController 
public with sharing class AnnualRevenueController {

  public String annualRevenue {get;set;}
  public Id objectId {get;set;}
  public Account account {get;set;}
  
  public AnnualRevenueController(ApexPages.StandardController stdController){
    account = [SELECT Id,Name,AnnualRevenue
                  FROM Account WHERE Id =: ApexPages.currentPage().getParameters().get('id')];
  }
  
  public void fetchAnnualRevenue(){
    annualRevenue = account.AnnualRevenue.toPlainString();
  }
}

Page 2: GetContactAnnualRevenue
<apex:page standardController="Contact" extensions="ContactAnnualRevenueController">
<apex:form >
    <apex:pageBlock >
        <apex:pageBlockButtons location="top">
            <apex:commandButton value="Click Here" action="{!fetchAnnualRevenue}"/><br/><br/>
            <apex:outputText value="Annual Revenue   " />
            <apex:outputText value="{!annualRevenue}" label="Annual Revenue"></apex:outputText><br/>
        </apex:pageBlockButtons>
    </apex:pageBlock>
</apex:form>
</apex:page>

Controller 1: ContactAnnualRevenueController
public with sharing class ContactAnnualRevenueController {
  public String annualRevenue {get;set;}
  public Id objectId {get;set;}
  public Contact contact {get;set;}
  
  public ContactAnnualRevenueController(ApexPages.StandardController stdController){
    
    contact = [SELECT Id,Name,Account.AnnualRevenue
                  FROM Contact WHERE Id =: ApexPages.currentPage().getParameters().get('id')];
  }
  
  public void fetchAnnualRevenue(){
    annualRevenue = contact.Account.AnnualRevenue.toPlainString();
  }
}

The Account Page shows the Annual revenue something like this:
And on click


Now, we are doing the same thing for two different pages, the only difference is the way we pull in the Annual Revenue data. Once from an Account record and the second time from a Contact record.
We display the exact same thing, but have ended up putting in the same lines for the two different pages. If we tomorrow decide to show the same for an Opportunity record, we will mimic all the lines of code in another page. Unnecessary.
Now, let us collate these together for a more precise solution.
First, what we show in both the pages, and perhaps multiple other pages in future, come into a component as below:
<apex:component >
<apex:attribute name="revenueController" description="This is the Controller" type="AnnualRevenueController" required="true"/>
<apex:form >
    <apex:pageBlock >
        <apex:pageBlockButtons location="top">
            <apex:commandButton value="Click Here" action="{!revenueController.fetchAnnualRevenue}"/><br/><br/>
            <apex:outputText value="Annual Revenue   " />
            <apex:outputText value="{!revenueController.annualRevenue}" label="Annual Revenue"></apex:outputText><br/>
        </apex:pageBlockButtons>
    </apex:pageBlock>
</apex:form>
</apex:component>

Now, the Visualforce page can be concised to as :
<apex:page standardController="Account" extensions="AnnualRevenueController">
<c:commonannualrevenuedisplay revenueController="{!this}"></c:commonannualrevenuedisplay>
</apex:page>

Ok, let's see what we did. The Visualforce component does all the work. From the page we just assign the instance of the AnnualRevenueController class to the revenueController attribute of the component. Using the revenueController the component can fetch and display the revenue.
The actual Annual Revenue is fetched from database by the AnnualRevenueController.
To make this work, add the below lines to your AnnualRevenueController 
//returns the instance of this class
    public AnnualRevenueController getThis(){
      return this;
    }

This above snippet of code, basically, returns the current instance of the AnnualRevenueController class to the visualforce page and in turn the component.

So, we slimmed down the visualforce page. However, we still have a problem here.

We arrived at a station but not our destination. What happens to our Contact page? I have passed the Account related controller to the component, and hence it would work only for the Account page.
Here, we do another trick - one of the strongest tool OOPs provides - "ABSTRACTION"
We create an abstract class to fetch and initialize the Annual revenue from the page. See below:
public abstract class AbstractAnnualRevenueController{
    abstract String getAnnualRevenue();
    public String annualRevenue{get;set;};
    
    public void fetchAnnualRevenue(){
        annualRevenue = getAnnualRevenue();
    }
}

Now, abstract class is a class which cannot be initialized. Simply put, this class is incomplete. We have declared a method getAnnualRevenue, but never defined what is does.
Here,is where, abstraction starts, as we mark this method as abtract, we need not define it, but we enforce other classes (child) who extend this class to define this method.
The individual classes can decide what to do inside and what final value to return. 
So, the trick is let the page get the details from the same attribute/methos. Internally, you channel your method to fetch the actual relevant data.

Now,let us see what changed in our controller classes


public with sharing class AnnualRevenueController extends AbstractAnnualRevenueController{

   public Account account {get;set;}
        
    public AnnualRevenueController(ApexPages.StandardController stdController){
        account = [SELECT Id,Name,AnnualRevenue
                                  FROM Account WHERE Id =: ApexPages.currentPage().getParameters().get('id')];
    }            
    //returns the instance of this class
    public AnnualRevenueController getThis(){
      return this;
    }
    
    public String getAnnualRevenue(){
        return account.AnnualRevenue.toPlainString();
    }
}



public with sharing class ContactAnnualRevenueController  extends AbstractAnnualRevenueController {
    
    public Contact contact {get;set;}    
    public ContactAnnualRevenueController(ApexPages.StandardController stdController){
        
        contact = [SELECT Id,Name,Account.AnnualRevenue
                                  FROM Contact WHERE Id =: ApexPages.currentPage().getParameters().get('id')];
    }    
    //returns the instance of this class
    public ContactAnnualRevenueController getThis(){
      return this;
    }
    
    public String getAnnualRevenue(){
        return contact.Account.AnnualRevenue.toPlainString();
    }
}

As simple as that, and now we make a very small change in our component


<apex:attribute name="revenueController" description="This is the Controller" type="AbstractAnnualRevenueController" required="true"/>

Our contact page can also be concise now:


<apex:page standardController="Contact" extensions="ContactAnnualRevenueController">
<c:commonannualrevenuedisplay revenueController="{!this}"></c:commonannualrevenuedisplay>
</apex:page>

And that completes our goal. Our Account and Contact page successfully renders the Annual Revenue : 


We reused a single component and an abstract class to create a custom page displaying the Annual revenue for an Account, a Contact and in future can plug in any object to show its Annual revenue. 
All we need to do is extend the class AbstractAnnualRevenueController and override the method getAnnualRevenue. Voila!!
Try doing this for an Opportunity record. It will be a cake walk.

Hope all of you enjoyed this, do post your comments and any queries.


67 comments:

  1. I have read your blog and I gathered some needful information from your blog. Keep update your blog. Awaiting for your next update.

    salesforce training in hyderabad

    ReplyDelete
  2. Nice information thank you,if you want more information please visit our link salesforce Online course

    ReplyDelete
  3. Greetings. I know this is somewhat off-topic, but I was wondering if you knew where I could get a captcha plugin for my comment form? I’m using the same blog platform like yours, and I’m having difficulty finding one? Thanks a lot.
    Big data training in tambaram

    Big data training in tambaram

    ReplyDelete
  4. Your good knowledge and kindness in playing with all the pieces were very useful. I don’t know what I would have done if I had not encountered such a step like this.
    Devops Training in pune

    Devops Training in Chennai

    Devops Training in Bangalore

    AWS Training in chennai

    AWS Training in bangalore

    ReplyDelete
  5. I have been meaning to write something like this on my website and you have given me an idea. Cheers.
    python training in tambaram
    python training in annanagar
    python training in OMR

    ReplyDelete
  6. I would like to thank you for your nicely written post, its informative and your writing style encouraged me to read it till end. Thanks
    java training in chennai | java training in bangalore

    java online training | java training in pune

    ReplyDelete
  7. Awwsome informative blog ,Very good information thanks for sharing such wonderful blog with us ,after long time came across such knowlegeble blog. keep sharing such informative blog with us.
    Aviation Academy in Chennai | Aviation Courses in Chennai | Best Aviation Academy in Chennai | Aviation Institute in Chennai | Aviation Training in Chennai

    ReplyDelete
  8. Nice post. I learned some new information. Thanks for sharing.

    redbeardpress
    Article submission sites

    ReplyDelete
  9. adding your RSS feed to my Google account. I look forward to fresh updates and will talk about this blog with my Facebook group. Chat soon!
    industrial safety courses in chennai

    ReplyDelete
  10. I appreciate your efforts because it conveys the message of what you are trying to say. It's a great skill to make even the person who doesn't know about the subject could able to understand the subject . Your blogs are understandable and also elaborately described. I hope to read more and more interesting articles from your blog. All the best.
    python training in rajajinagar | Python training in bangalore | Python training in usa

    ReplyDelete
  11. Well Said, you have furnished the right information that will be useful to anyone at all time. Thanks for sharing your Ideas.
    python course institute in bangalore | python Course institute in bangalore| python course institute in bangalore

    ReplyDelete
  12. Whoa! I’m enjoying the template/theme of this website. It’s simple, yet effective. A lot of times it’s very hard to get that “perfect balance” between superb usability and visual appeal. I must say you’ve done a very good job with this.

    Oracle Training in Chennai | Best Oracle Training Institute in Chennai
    Web Design Training in Chennai
    Web Design Training in Chennai|Best Web Design Training in Chennai
    AngularJS Training in Chennai |Advanced SAS Training in Chennai | Best SAS Training in Chennai

    ReplyDelete
  13. The knowledge of technology you have been sharing thorough this post is very much helpful to develop new idea. here by i also want to share this.
    angularjs Training in bangalore

    angularjs Training in bangalore

    angularjs online Training

    angularjs Training in marathahalli

    angularjs interview questions and answers

    ReplyDelete
  14. The blog which you are shared is very much helpful for us to knew about the web designing. thanks for your information.
    Devops Training in Chennai | Devops Training Institute in Chennai

    ReplyDelete
  15. It’s very informative and helpful, Thank you for sharing this wonderful post.


    ExcelR Data Science in Bangalore

    ReplyDelete
  16. I have to search sites with relevant information on given topic and provide them to teacher our opinion and the article.
    ExcelR Data science courses in Bangalore

    ReplyDelete


  17. I just got to this amazing site not long ago. I was actually captured with the piece of resources you have got here. Big thumbs up for making such wonderful blog page!


    data science course malaysia

    ReplyDelete
  18. In our culture, the practice of treatment through various burn fat herbs and
    spices is widely prevalent. This is mainly due to the reason that different burn fat herbs grow in great abundance here. In addition to the
    treatment of various ailments these herbs prove beneficial in Healthy Ways To Lose Weight
    , especially for those who want to burn fat herbs

    we live in a world where diseases and their prevalence has gone off
    the charts. With the ever-growing incidences of illnesses and
    sufferings, one finds themselves caught up in a loop of medications
    and doctors’ visits. We, at https://goodbyedoctor.com/ , aim to find solutions for
    all your health-related problems in the most natural and harmless ways.
    We’re a website dedicated to providing you with the best of home
    remedies, organic solutions, and show you a path towards a healthy,
    happy life. visit https://goodbyedoctor.com/
    this site daily to know more about health tips and beauty tips.

    ReplyDelete
  19. I like you article. if you you want to saw Sufiyana Pyaar Mera Star Bharat Serials Full
    Sufiyana Pyaar Mera

    ReplyDelete
  20. PhenQ Reviews - Is PhenQ a new Scam?
    Does it really work? Read this honest review and make a wise purchase decision. PhenQ ingredients are natural and ...
    It has been deemed fit for use in the market. It is not found to be a Scam weight loss pill.
    By far it is the safest and most effective weight loss pill available in the market today.

    Phenq reviews ..This is a powerful slimming formula made by combining the multiple weight loss
    benefits of various PhenQ ingredients. All these are conveniently contained in one pill. It helps you get the kind of body that you need. The ingredients of
    the pill are from natural sources so you don’t have to worry much about the side effects that come with other types of dieting pills.Is PhenQ safe ? yes this is completly safe.
    Where to buy PhenQ ? you can order online. you don`t know Where to order phenq check this site .

    visit https://mpho.org/ this site to know more about PhenQ Reviews.

    ReplyDelete
  21. http://karachipestcontrol. com/-Karachi Best Pest Control and Water Tank Cleaning Services.

    M/S. KarachiPestControl has very oldKarachi Pest Control Services Technical Pest Control workers
    thatfumigation services in Karachi live and add your space sevenfumigation in Karachi
    days every week.Pest services in karachiThis implies we are able toTermite Fumigation in Karachi
    be with you actuallytermite proofing in karachi quickly and keep our costs very competitive. an equivalent
    nativeUnique fumigation technician can see yourBed bugs fumigation in Karachi cuss management
    drawback through from begin to complete.Rodent Control Services Karachi Eco friendly technologies isWater tank cleaner in karachi
    also used.We are the firstWater Tank Cleaning Services in Karachi and still only professional water
    tank cleaning company in Karachi.With M/S. KarachiPestControlyou’re totallyBest Fumigation in karachi protected.


    Check Our Website http://karachipestcontrol. com/.

    ReplyDelete
  22. Gold and silver for life reviews.
    Thousands Across The Globe Using Mineshaft Bhindari gold and silver for life Training To Protect Their Wealth And Creating A Passive Income of 12% To 26.4% Per Year….


    Gold and silver for life reviews- How It Works?

    Minesh Bhindi created Gold and silver for life reviews because, after a long career in helping people grow their wealth through investment,
    he noticed something that he felt should benefit everyone. Since 2010, Gold and Silver for life has been helping people grow their wealth securely through strategic Investing in precious metals , gold and silver.
    As proud founder of Reverent Capital, a secure investment advisory firm, he consults with high net worth individuals from around the globe on the importance of secure
    investments in gold and silver

    Learn How to invest in gold from here kingsslyn.com now.

    ReplyDelete
  23. Weed Supermarket.
    Cannabis oil for sale, buy cannabis oil online, where to buy cannabis oil, cannabis oil for sale, buy cannabis oil online,
    cannabis oil for sale UK, cannabis oil for sale, where to buy cannabis oil UKBuy cbd oil, buying marijuana edibles online legal,
    online marijuana sales, buy cbd oil UK, best cbd oil UK, cheap cbd oil UK, pure thc for sale, cbd oil wholesale UK, cbd oil online buy UK
    Cbd flower for sale uk, cbd buds wholesale uk, cbd flower for sale uk, buy hemp buds uk, cheap cbd, flower uk, buy cbd buds online uk,
    cbd flowers buds uk, cbd buds for sale, cbd buds for sale uk, hemp, buds for sale uk, cbd flower for sale uk, high cbd hemp buds,
    cbd buds uk for sale, cbd buds online buy uk, hemp flowers wholesale uk, cheapest cbd flowers ukMarijuana weeds, buy marijuana weed online,
    marijuana weed in UK, marijuana weed for sale, where to order marijuana weed, cheap marijuana weed online, best quality marijuana weed,
    how to buy marijuana weed, marijuana hash, buy marijuana hash online, marijuana hash for sale, where to buy marijuana hash, buy marijuana hash online UK,
    buy marijuana hash in Germany, buy marijuana hash in Belgium, top quality marijuana hash, mail order marijuana hash, cheap marijuana hash
    You can buy Weed, Cannabis, Vape Pens & Cartridges, THC Oil Cartridges, Marijuana Seeds Online in the UK, Germany, France, Italy, Switzerland,
    Netherlands, Poland, Greece, Austria, Ukraine. We deliver fast using next Day Delivery.
    THC vape oil for sale, dank vapes for sale, buy dank vapes online, mario cartridges for sale, weed vape, thc vape, cannabis vape, weed vape oil,
    buy vape pen online, buy afghan kush online, blue dream for sale, marijuana edibles,

    Visit here https://www.dankrevolutionstore.com/ to know more.

    ReplyDelete
  24. Big Truck Tow: Heavy Duty towing service san jose
    We're rated the most reliable heavy duty towing san jose service & roadside assistance in San Jose!
    Call us now! We're ready to help you NOW!

    Since 1999, tow truck san jose has provided quality services to clients by providing them
    with the professional care they deserve. We are a professional and affordable Commercial
    Towing Company. BIG TRUCK TOW provides a variety of services, look below for the list of
    services we offer. Get in touch today to learn more about our heavy duty towing


    Click here to Find tow truck near me

    ReplyDelete
  25. Genuine Import Medicine.http://noelbiotech.com/Named Patient Medicine.Genuine Cancer Medicine.

    Noel Biotech is an Indian entity,Genuine Import Medicines in India facilitating access to Advanced Healthcare Solutions
    Genuine cancer medicinesrecommended for various nicheNamed Patient Medicines in India therapeutic segments. Driven by an unparallel commitment
    to assist IndianReference Listed Drugs Patients and Medical Fraternity, Noel has been consistent in its approach
    Gene Therapy Innovationsto channelize globally advanced and relevant solutions that are essential for the Indian
    scenario of Healthcare andGene Therapies for Cancer Care (Oncology) India Disease Management.

    Noel Biotech’s Brentuximab Vedotin costingvision is to enable Indian Patients to experience the Clinical
    BenefitsIpilimumab cost in India of novel medications form across the globe, anticipatingVentoclax cost in India
    Prolonged Survival with Better Quality of Life.

    Check our website-http://noelbiotech.com/

    ReplyDelete
  26. Keto Pills The Fastest Way to Get Into Ketosis?
    Keto diet pills reviews to let you know how to get into ketosis fast and feel
    young & energetic. These keto diet pills work wonders when taken as advised.
    Read This Informative article from top to bottom about Best Keto diet pills reviews & See
    Keto pills can help you to get into ketogenesis quickly and enjoy life-long benefits of
    maintaining healthy weight.our amazing Keto Diet Pills Recommendation at the end!
    How to get into ketogenesis ?
    If you Don’t know Where to buy keto diet pills click here.
    To Know More Information Click https://ketodietpillsinfo.com/ here.

    ReplyDelete
  27. crowdsourcehttp://www.incruiter.com recruitment agency.

    We ’incruiter’ provide a uniquerecruitment agencies platform to various committed professionals
    placement consultancyacross the globe to use their skills and expertise to join as a recruiter and
    interviewer to empower the industry with talented human resources.Searching for the right candidate is never easy.
    job consultancy We use crowdsource recruitment to find right talent pool at much faster pace.
    Our candidate search follows application of a rigorous methodology, and a comprehensive screening to find an individual
    whorecruitment consultants is not only skilled but is also the right culture fit for your organization.
    Our interviewers are best in the industry,staffing agencies being experts from various verticals to judge right
    candidate for the job. They interview candidates taking into account primarily defined job specification of our clients and targeting
    them for needs of the organization.Thinking about payment?placement agencies Don’t worry, you pay when you hire.
    Whether you are a startup or an established enterprise, join our 10x faster recruitment process that reduces your hiring process by 50% and give you
    manpower consultancyefficient results.

    check our website:http://www.incruiter.com.

    ReplyDelete
  28. SSC Result 2020 Published Date & Time by ssc result
    ssc result 2020
    Education Board of Bangladesh.
    Many of You Search For SSC Result Kobe Dibe on Internet
    as Well as Facebook. The results of Secondary School Certificate
    (SSC)—and its equivalent examinations—for 2020 have been published.
    SSC & Dakhil Result 2020 Published Date is Very Important For T
    he Students Who Attend The SSC Exam 2020.

    ReplyDelete
  29. Calculate your EMI for personal loan, home loan, car loan, student loan, business loan in India. Check EMI eligibilty,
    interest rates, application process, loan.
    EMI Calculator calculate EMI for home loan, car loan, personal loan , student loan in India .

    visit https://emi-calculators.com/ here for more information.

    ReplyDelete
  30. ترفند برد و آموزش بازی انفجار آنلاین و شرطی، نیترو بهترین و پرمخاطب ‌ترین سایت انفجار ایرانی، نحوه برد و واقعیت ربات ها و هک بازی انجار در
    اینجا بخوانید
    کازینو آنلاین نیترو
    بازی حکم آنلاین نیترو
    بازی حکم آنلاین
    Introducing the Nitro Blast game site
    معرفی سایت بازی انفجار نیترو
    همان طور که می دانید بازی های کازینو های امروزه از محبوبیت ویژه ای برخودارند که این محبوبیت را مدیون سایت های شرط می باشند. با گسترش اینترنت این بازی ها محدودیت های مکانی و زمانی را پشت سرگذاشته و به صورت آنلاین درآمده اند.
    بازی انفجار نیترو
    بازی انفجار
    یکی از محبوب ترین بازی های کازینو، بازی انفجار می باشد که ساخته سایت های شرط بندی می باشد و امروزه از طرفداران ویژه ای برخودار است. با گسترش اینترنت سایت های شرط بندی مختلفی ایجاد شده اند که این بازی را به صورت آنلاین ساپورت می کنند. یکی از این سایت ها، سایت معتبر نیترو می باشد. در این مقاله قصد داریم به معرفی
    سایت بازی انفجار نیترو بپردازیم.
    سایت پیش بینی فوتبال نیتر
    سایت پیش بینی فوتبال
    بازی رولت نیترو
    کازینو آنلاین

    Visit https://www.wmsociety.org/
    here for more information

    ReplyDelete
  31. Thanks for sharing this information. I really like your blog post very much. You have really shared a informative and interesting blog.Such a very useful article. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article.
    Data Science Training In Chennai

    Data Science Online Training In Chennai

    Data Science Training In Bangalore

    Data Science Training In Hyderabad

    Data Science Training In Coimbatore

    Data Science Training

    Data Science Online Training

    ReplyDelete
  32. Thanks for sharing such beautiful information with us. oracle training in chennai

    ReplyDelete
  33. Generic Latisse : Eyelashes drops 3ml with Bimatoprost 3%

    Natural Ways to Encourage eyelashes growth , iBeauty Care offers a wide variety of natural products for skin care

    iBeauty Care offers a wide variety of natural products for skin care, eyelashes growth, acne and many other health problems. All products are with clinically proven effects and great therapeutic results.
    Visit https://www.ibeauty care.com/home/21-generic-latisse.html here to buy this ar low cost.
    or visit The home page https://www.ibeauty-care.com/.

    ReplyDelete
  34. Right about now, you may be wondering if there is a specific date when you can try out the service. The answer is yes, there is a date set up for many people to take advantage of the service. This is generally set up for a few weeks before February 14th. You are curious to know more about video chat apps, discover here.

    ReplyDelete
  35. Plumbing & HVAC Services San Diego
    Air Star Heating guarantees reliability and quality for all equipment and services.
    Air Star Heating is specializing in providing top-quality heating, ventilating, air conditioning, and plumbing services to our customers and clients.
    Our company is leading the market right now. By using our seamless and huge array of services. Our customers can now have the privilege of taking benefit from our services very easily and swiftly. To cope up with the desires and needs of our clients we have built an excellent reputation. We are already having a huge list of satisfied customers that seem to be very pleased with our services.

    Plumbing & HVAC Services in San Diego. Call now (858) 900-9977 ✓Licensed & Insured ✓Certified Experts ✓Same Day Appointment ✓Original Parts Only ✓Warranty On Every Job.
    Visit:- https://airstarheating.com

    ReplyDelete
  36. National University is published the nu honours 4th year exam result 2021 on online. Students now can check the result from nu.ac.bd/results as well as examresulthub.com

    ReplyDelete
  37. I'm excited to uncover this page. I need to to thank you for ones time for this particularly fantastic read !! I definitely really liked every part of it.Educational Institute in Visakhapatnam.

    ReplyDelete
  38. The following time I read a blog, I trust that it doesn't bomb me similarly as much as this specific one. That is to say, I realize it was my decision to peruse, regardless I really trusted you would presumably have something valuable to discuss. All I hear is a lot of crying about something you could fix on the off chance that you were not very bustling searching for consideration. best interiors

    ReplyDelete
  39. Rather than utilizing nearby assets, the business can utilize and share the equipment and programming through web. Salesforce developer institutes in Pune

    ReplyDelete
  40. this is really nice to read..informative post is very good to read..thanks a lot!
    data scientist training in malaysia

    ReplyDelete
  41. This is a smart blog. I mean it. You have so much knowledge about this issue, and so much passion. You also know how to make people rally behind it, obviously from the responses.
    data analytics courses in hyderabad with placements

    ReplyDelete
  42. Informative blog and knowledgeable content. Keep posting more blogs like this. Thank you.
    Data Science Classes in Hyderabad

    ReplyDelete
  43. I just couldn't leave your website before telling you that I truly enjoyed the top quality info you present to your visitors? Will be back again frequently to check up on new posts. data science course in mysore

    ReplyDelete
  44. I wanted to leave a little comment to support you and wish you a good continuation. Wishing you the best of luck for all your blogging efforts.
    data analytics courses in hyderabad with placements

    ReplyDelete
  45. Much obliged correspondingly a ton for this proposal. I really want to permit you remember I agree in regards to a few of the elements you are making here and others might require some computation outline, however i'm ready to see your viewpoint. KMS Activator For Windows 10

    ReplyDelete
  46. incredibly great article! I pulsate individuals to acknowledge exactly how amicable this compensation for an assessment is for your article. Its tempting, convincing substance material. Your points of view are greatly gone my own getting into excuse to for this topic. Coffeecup Responsive Site Designer Crack

    ReplyDelete
  47. Having a brother like you is a blessing from the heavens. Happy birthday, dearest. Wishing you the sweetest things in life. Birthday Wishes For Little Brother

    ReplyDelete