A blog dedicated to Salesforce Ohana

Summer'17 :: Retrieve and Deploy Metadata through Apex

In Salesforce World, Metadata plays a very important role. Metadata types and components are used to represent org specific configuration and customization. Salesforce is having a very good page explaining Metadata. Here is the link - "An Introduction to Force.com Metadata". 

Before Summer'17 release, in order to access Metadata, you need to use the Metadata API, but now Salesforce comes up with Metadata namespace. You can use classes in Metadata namespace to access Metadata components through Apex.

Why do I need to access Metadata?
Salesforce documentation explains it correctly and here are the possible reasons why you may need to access Metadata.

In this post, I am going to explain how you can access and deploy Metadata changes through Apex with an example.

Example -
In my Salesforce Org, I have one Custom Metadata Type named - "Admin Preference" which is -
The values of this Custom Metadata Type are -

Now I will create a simple VisualForce Page which will retrieve this Metadata Values and display them. At the same time from the same page, I will change the values. 

To implement this requirement, I will use the Salesforce Summer'17 New Feature - classes Metadata namespace.

Let's Start -
In order to store the Custom Metadata Values, I will use the below class -

public class MetadataHelper{
    public String name {get;set;}
    public Boolean isEnabled {get;set;}

    public MetadataHelper(String name, Boolean isEnabled){
        this.name = name;
        this.isEnabled = isEnabled;

    public String getFullName(){
        String fullName = 'Admin_Preference__mdt.';
        if(name.equalsIgnoreCase('Process Builder Preference')){
            fullName = fullName + 'Process_Builder_Preference';
        }else if(name.equalsIgnoreCase('Trigger Preference')){
            fullName = fullName + 'Trigger_Preference';
        }else if(name.equalsIgnoreCase('Validation Rule Preference')){
            fullName = fullName + 'Validation_Rule_Preference';
        }else if(name.equalsIgnoreCase('Workflow Preference')){
            fullName = fullName + 'Workflow_Preference';
        return fullName;

How to retrieve the Custom Metadata Types and it's Values: 

To retrieve the Custom MetadataTypes, the command is - Metadata.Operations.retrieve(). This method will retrieve the Metadata synchronously. We need to pass the list of component names and this method will return a list of matching component data (Metadata.Metadata format).

Once you have the list, power is completely in your hand. Trust me!! Really you have all the power you need then. You can iterate through the list and get the each CustomMetadataRecord. Now each CustomMetadataRecord is having CustomMetadataValues which also you can fetch and play around. 
CustomMetadataValues are stored in two fields - the first one is "field" which stores the API name of the field and the second one is "value" which stores the value of that field for that CustomMetadataRecord. Confused??? Don't worry I will give you now a clean picture which helped me to understand and I hope it will help you as well.

To understand how the custom metadata information is stored in Salesforce, consider our Custom Metadata Type mentioned above - Admin Preference. And let's consider one value here - 

So according to the above example - Metadata.Operations.retrieve() will retrieve the CustomMetadataRecord - Process Builder Preference. Now this record is having the label - "Process Builder Preference", which we can get from the label field. The fullName of this record is - "Admin_Preference__mdt.Process_Builder_Preference" which we can get from the method getFullName()
In the above example, this CustomMetadata is having only one value which is stored inside a field of type Metadata.CustomMetadataValue. For that single  Metadata.CustomMetadataValue, the field = 'Enabled__c" and value = true.

So the visual representation of the flow is -

With the above explanation, here comes to code -

How to deploy Custom Metadata Types and it's Values: 
The method Metadata.Operations.enqueueDeployment is used to deploy the changes to the org. The operation is happening in asynchronous mode and that is the reason we need to provide a callback method to handle the success/failure scenarios. To create the callback, we need to implement the interface Metadata.DeployCallback and by doing that we need to put our logic in the method - handleResult.

Below is the CallBack method -

Now to deploy the changes below is the code -

You can find the full code in my Github repository.

With all these changes, below is how the functionality working - 

Limitation - Metadata access in Apex is currently only possible for custom metadata records and page layouts. You can retrieve, create or update custom metadata, but you cannot delete metadata through Apex.


Summer'17 :: Embed Your Flow in Lightning Experience

In this post, I am going to explain the new Flow features introduced by Salesforce in Summer'17.

Add Flow into Record Detail Pages:
With Summer'17 Salesforce release, now you can add flows into any Lightning Pages. You need to add the Flow component to your Lightning pages. This feature was introduced by Salesforce in Winter'17 release as a beta functionality, and in Summer'17 this is now Generally Available.

In this section, I am going to explain how you can add flow into record details page through Lightning App Builder.

Let's first create a flow which needs a parameter which is basically the record Id. The intention is that when we will add this flow into the record detail page, we will pass the record Id to flow and then flow will fetch necessary information from the record and prepare its own view.
So here is the flow -

Flow Name: Survey Customer
This flow is having one input variable - "recordId" which will store the Salesforce Record Id passed from record detail page.

With this variable, the flow will query the Salesforce Contact Record, fetch Contact's First Name and Last Name and generate the customized Welcome Message. I am not going to show how Flow is configured because the intention of this post is to demonstrate how to use the flow inside Lightning Experience.
Here is the final view of the flow -

Now, will come the fun part. Let's say we wanted to display this message in Contact Detail Page. What we need to do is - Open the contact detail page and then click on the Edit Page option from Top Right.
This will open the Contact Detail page in Lightning App Builder

From the left section, select the Flow Component under Standard and drag it under Activity Section at the button.
Now select the Flow component, and you will see the configuration panel at right next to it. This is the place where you will select your flow and also the parameters you will pass to the flow. See the animation below -
And that's all. Now the contact details page will look like -

Enjoy Flow in Lightning. Please provide your feedback.

Follow Me

Enter your email address:

Delivered by FeedBurner

Popular Posts


Salesforce (105) Apex (44) admin (27) ADM (20) visualforce (20) dev 501 (19) integration (18) learn salesforce (18) 501 (16) SOAP (13) lightning (12) tutorial (11) Certification. (9) javascript (8) Trigger (7) test class (7) unit testing (7) Sharing and Visibility (6) design pattern (6) report (6) security (6) trailhead (6) Advanced Admin (5) Certification (5) Kitchener Developer Group (5) New Features (5) SOQL (5) css (5) dashboard (5) debug (5) developer (5) formula (5) mobile (5) salesforce release (5) service cloud (5) solution management (5) use case (5) JSON (4) Lightning Experience (4) Salesforce DX (4) WebSphere (4) best practice (4) cast iron (4) component (4) deployment (4) github (4) html (4) polymer (4) profiles (4) responsive (4) tdd (4) ui (4) Advanced Apex (3) Architect (3) Live Chat (3) Online Event (3) Performance (3) Products (3) Role (3) Sales Cloud (3) Scratch Org (3) Study Notes. (3) Summer15 (3) Tips (3) Web Technology (3) dynamic apex (3) event (3) license (3) map (3) mapbox (3) singleton (3) version controlling (3) Bulkify (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) Kitchener User Group (2) Lightning Design System (2) Live Agent (2) Metadata (2) Opportunity (2) Price Book (2) REST (2) SOSL (2) Sharing (2) Spring 15 (2) Summer17 (2) Territory (2) ant (2) automation tool (2) basic (2) chatter (2) coding (2) communication (2) console (2) controller (2) documentation (2) flow (2) git (2) jquery (2) logging (2) object (2) permission (2) process builder (2) release (2) salesforce1 (2) strategy (2) xml (2) Action Plan (1) Action Plan Template (1) Agent Productivity (1) Analytics (1) Apex Sharing (1) Arrow (1) Asynchronous callout (1) Aura Framework (1) Bots (1) Browser (1) Bulk data load (1) CTA (1) Calendar (1) Canon (1) Case Management (1) Cheat Sheet (1) Classic (1) Community (1) Constructor (1) Contact Center (1) Continuation (1) Continuous Integration (1) Convert (1) Cookie (1) Custom Metadata (1) Custom Object (1) Customer (1) Decorator Design Pattern (1) Dev Hub (1) Diwali (1) Email (1) FSC (1) Function (1) Goals (1) Guide (1) Household (1) Ideas (1) Improvement (1) KPIs (1) Large Data Volume (1) LastModifiedDate (1) Lightning Web Component (1) Manual Sharing (1) Metrics (1) New (1) OOPS (1) OWD (1) Omni-Channel (1) Partner (1) Person Account (1) Photo (1) Pipeline (1) Platform Developer I (1) Presentation (1) Product Schedule (1) Profile (1) Promise (1) Prototype (1) Public Site (1) Query Plan (1) QuickReference (1) Reports (1) Retrieve (1) Role Hierarchy (1) SFDX (1) Salesforce Optimizer (1) Session (1) Sharing Rule (1) Sharing Sets (1) Site (1) Skills (1) Snap-ins (1) Spring 17 (1) Summer14 (1) Summer16 (1) Switch (1) SystemModStamp (1) User License (1) Users (1) Webservice (1) Winter'15 (1) Winter'17 (1) access (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) configuration (1) csv (1) custom button (1) custom settings (1) customization (1) data loader (1) database (1) delegate Admin (1) describe (1) dom (1) dreamforce (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)

Total Subscribers

Total Pageviews