SlideShare a Scribd company logo
Beyond Custom Metadata Types
Avrom Roy-Faderman
Principal Member of Techincal Staff
Salesforce App Cloud
aroyfaderman@salesforce.com
@aroyfaderman
The Vision for “Platform on the Platform” in Force.com
Haripriya Murthy
Senior Member of Techincal Staff
Salesforce App Cloud
hmurthy@salesforce.com
@haripriyamurthy
Safe harbor statement under the Private Securities Litigation Reform Act of 1995:
This presentation may contain forward-looking statements that involve risks, uncertainties, and assumptions. If any such uncertainties materialize
or if any of the assumptions proves incorrect, the results of salesforce.com, inc. could differ materially from the results expressed or implied by the
forward-looking statements we make. All statements other than statements of historical fact could be deemed forward-looking, including any
projections of product or service availability, subscriber growth, earnings, revenues, or other financial items and any statements regarding
strategies or plans of management for future operations, statements of belief, any statements concerning new, planned, or upgraded services or
technology developments and customer contracts or use of our services.
The risks and uncertainties referred to above include – but are not limited to – risks associated with developing and delivering new functionality for
our service, new products and services, our new business model, our past operating losses, possible fluctuations in our operating results and rate
of growth, interruptions or delays in our Web hosting, breach of our security measures, the outcome of any litigation, risks associated with
completed and any possible mergers and acquisitions, the immature market in which we operate, our relatively limited operating history, our ability
to expand, retain, and motivate our employees and manage our growth, new releases of our service and successful customer deployment, our
limited history reselling non-salesforce.com products, and utilization and selling to larger enterprise customers. Further information on potential
factors that could affect the financial results of salesforce.com, inc. is included in our annual report on Form 10-K for the most recent fiscal year
and in our quarterly report on Form 10-Q for the most recent fiscal quarter. These documents and others containing important disclosures are
available on the SEC Filings section of the Investor Information section of our Web site.
Any unreleased services or features referenced in this or other presentations, press releases or public statements are not currently available and
may not be delivered on time or at all. Customers who purchase our services should make the purchase decisions based upon features that are
currently available. Salesforce.com, inc. assumes no obligation and does not intend to update these forward-looking statements.
Safe Harbor
CRM Apps ISV Apps IT Apps
The “Standard” Force.com Platform
App Cloud
Customer
The Salesforce Advantage
IT Apps
The “Platform on the Platform” Vision
App Cloud
CRM Apps ISV Apps IT Apps
Customer
IT AppsISV Apps
ISV Platform IT Platform
The <Your Company Name> Advantage
RemoteSiteSetting
ValidationRule
CustomObjectTranslation
PermissionSet
<Many more examples>
Standard Metadata Types Custom Metadata Types
The Story So Far…
ApiMapping
StockPointRule
InternationalVatRule
AclRule
<Whatever you want>
Instances are:
• Packageable/Upgradeable
• Deployable (change set/MD API)
• Free to access (via Describe)
• Salesforce writes the code that “makes them go”
Standard Metadata Types Custom Metadata Types
The Story So Far…
Instances are:
• Packageable/Upgradeable
• Deployable (change set/MD API)
• Free to access (via SOQL)
• You write the code that “makes them go”
The Vision for the Future
Demo: Coming… Now
• For everyone: Create Custom Metadata Types and Records in the Setup UI
• For ISVs: Control Field Editability and Record Visibility
Metadata Relationships
Dynamic Triggers
• With pseudocode walkthrough
Apex DDL
• With pseudocode walkthrough
Custom Datatypes
Summary/Roadmap/Q&A
And the Agenda for Today
Haripriya Murthy
Senior Member of the Technical Staff, Salesforce App Cloud
Demo
Coming… now (Winter 2016)
Metadata Relationships
Integrate your types into a unified declarative platform
RollupOverLookup__mdt
ParentObject__c: MD Rel
ParentField__c: MD Rel
SummarizedObject__c: MD Rel
LookupField__c: MD Rel
FieldToSummarize__c: MD Rel
RollupOperation__c: Picklist
Active__c: Checkbox
Description__c: LTA
Metadata relationships to SObjects
Triggerable SObject Types
RollupOverLookup__mdt
ParentObject__c: MD Rel
ParentField__c: MD Rel
SummarizedObject__c: MD
RelLookupField__c: MD Rel
LookupField__c: MD Rel
FieldToSummarize__c: MD Rel
RollupOperation__c: Picklist
Active__c: Checkbox
Description__c: LTA
Metadata relationships to SObjects
Triggerable SObject Types
ParentObject__c ParentField__c SummarizedObject__c FieldToSummarize__c RollupOperation__c
Contact TotalOppValue__c Opportunity Amount SUM
JobListing__c TotalAppliedCandidates__c Candidate__c COUNT
Metadata relationships to other types
RollupFilter__mdt
FilterField__c: MD Rel
FilterOperation__c: Picklist
Value__c: String
Summary__c: MD Rel
RollupOverLookup__mdt
ParentObject__c: MD Rel
ParentField__c: MD Rel
SummarizedObject__c: MD
RelLookupField__c: MD Rel
LookupField__c: MD Rel
FieldToSummarize__c: MD Rel
RollupOperation__c: Picklist
Active__c: Checkbox
Description__c: LTA
Metadata relationships to other types
FilterField__c FilterOperation__c Value__c Summary__c
Stage NOT EQUALS Closed Lost TotalAmountByContact__md
IsEmployee__c EQUALS False TotalApplicants__md
RollupFilter__mdt
FilterField__c: MD Rel
FilterOperation__c: Picklist
Value__c: String
Summary__c: MD Rel
RollupOverLookup__mdt
ParentObject__c: MD Rel
ParentField__c: MD Rel
SummarizedObject__c: MD Rel
LookupField__c: MD Rel
FieldToSummarize__c: MD Rel
RollupOperation__c: Picklist
Active__c: Checkbox
Description__c: LTA
RollupOverLookup__mdt
ParentObject__c: MD Rel
ParentField__c: MD Rel
SummarizedObject__c: MD Rel
LookupField__c: MD Rel
FieldToSummarize__c: MD Rel
RollupOperation__c: Picklist
Active__c: Checkbox
Description__c: LTA
Metadata relationships to Fields
Fields
Metadata relationships to other entities
Apex Classes
Custom
metadata
type
Permsets
Static resources
Creating a metadata relationship field
Metadata relationship in SOQL
Access the fields as is
select ParentObject__c, ParentField__c from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’;
Metadata relationship in SOQL
Access the fields as is
select ParentObject__c, ParentField__c from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’;
Traverse relationship from child
select ParentObject__r.Name from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’;
Metadata relationship in SOQL
Access the fields as is
select ParentObject__c, ParentField__c from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’;
Traverse relationship from child
select ParentObject__r.Name from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’;
Filter using relationship
select ParentField__c from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’ and
ParentObject__r.Name = ‘Opportunity’;
Dynamic Triggers
Customize the record save process
CustomField is of type Number?
• Non-numeric data rejected
CustomField is of type RollupSummary?
• On save of children, parents are updated
WorkflowRule exists on object?
• Should fire when the object saves and filter is
matched
Standard Metadata Types Custom Metadata Types
Metadata Should Affect the Save Process
InternationalVatRule applies?
• VAT should get added on save
“Rollup over Lookup” exists?
• On save of children, parents are updated
Object-Object mapping exists?
• When first object is inserted, transformed second
object should be inserted too
Step 1: Create a Custom Metadata Type
With a Relationship to Triggerable SObject Types
Triggerable SObject Types
RollupFilter__mdt
FilterField__c: MD Rel
FilterOperation__c: Picklist
Value__c: String
Summary__c: MD Rel
RollupOverLookup__mdt
ParentObject__c: MD Rel
ParentField__c: MD Rel
SummarizedObject__c: MD Rel
LookupField__c: MD Rel
FieldToSummarize__c: MD Rel
RollupOperation__c: Picklist
Active__c: Checkbox
Description__c: LTA
Step 2: Write a Dynamic Apex Trigger
over the Relationship
dynamic trigger RecalcRollupTrigger
over RollupOverLookup__mdt.SummarizedObject__c
(BEFORE INSERT, BEFORE UPDATE, BEFORE DELETE)
{
/* … */
}
You or an Admin Can Do This
Step 3: Populate the Custom Metadata Type
ParentObject__c ParentField__c SummarizedObject__c FieldToSummarize__c RollupOperation__c
Contact TotalOppValue__c Opportunity Amount SUM
JobListing__c TotalAppliedCandidates__c Candidate__c COUNT
FilterField__c FilterOperation__c Value__c Summary__c
Stage NOT EQUALS Closed Lost TotalAmountByContact__md
IsEmployee__c EQUALS False TotalApplicants__md
Runtime Example 1
Opportunities
End-user inserts some opportunities
RollupOverLookup__mdt records with
SummarizedObject__c = Opportunity found!
RecalcRollupTrigger executes before insert
• Trigger.sObjectType = Opportunity.sObjectType
• Trigger.customMetadata = [found records of RollupOverLookup__mdt]
Runtime Example 2
End-user inserts some contacts
No RollupOverLookup__mdt records with
SummarizedObject__c = Contact found!
RecalcRollupTrigger does not execute
Contacts
Pseudocode Example
dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c
(BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) {
Schema.SObjectType thisObject = Trigger.sObjectType;
RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata;
for (RollupOverLookup__mdt summary : summariesOfThisObject) {
RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c,
Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id];
if (Trigger.isInsert) {
SObject[] matchingChildren = Trigger.new;
for (RollupFilter__mdt oneFilter : filters) {
matchingChildren = FilterUtil.filter(matchingChildren, oneFilter);
}
SObject[] parents = RollupUtil.getParents(
matchingChildren, summary.ParentObject__r.QualifiedApiName,
summary.LookupField__r.QualifiedApiName);
RollupUtil.adjustParents(
parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c,
matchingChildren, summary.FieldToSummarize__r.QualifiedApiName);
update parents;
}
…
}
}
Pseudocode Example
dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c
(BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) {
Schema.SObjectType thisObject = Trigger.sObjectType;
RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata;
for (RollupOverLookup__mdt summary : summariesOfThisObject) {
RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c,
Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id];
if (Trigger.isInsert) {
SObject[] matchingChildren = Trigger.new;
for (RollupFilter__mdt oneFilter : filters) {
matchingChildren = FilterUtil.filter(matchingChildren, oneFilter);
}
SObject[] parents = RollupUtil.getParents(
matchingChildren, summary.ParentObject__r.QualifiedApiName,
summary.LookupField__r.QualifiedApiName);
RollupUtil.adjustParents(
parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c,
matchingChildren, summary.FieldToSummarize__r.QualifiedApiName);
update parents;
}
…
}
}
Pseudocode Example
dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c
(BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) {
Schema.SObjectType thisObject = Trigger.sObjectType;
RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata;
for (RollupOverLookup__mdt summary : summariesOfThisObject) {
RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c,
Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id];
if (Trigger.isInsert) {
SObject[] matchingChildren = Trigger.new;
for (RollupFilter__mdt oneFilter : filters) {
matchingChildren = FilterUtil.filter(matchingChildren, oneFilter);
}
SObject[] parents = RollupUtil.getParents(
matchingChildren, summary.ParentObject__r.QualifiedApiName,
summary.LookupField__r.QualifiedApiName);
RollupUtil.adjustParents(
parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c,
matchingChildren, summary.FieldToSummarize__r.QualifiedApiName);
update parents;
}
…
}
Pseudocode Example
dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c
(BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) {
Schema.SObjectType thisObject = Trigger.sObjectType;
RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata;
for (RollupOverLookup__mdt summary : summariesOfThisObject) {
RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c,
Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id];
if (Trigger.isInsert) {
SObject[] matchingChildren = Trigger.new;
for (RollupFilter__mdt oneFilter : filters) {
matchingChildren = FilterUtil.filter(matchingChildren, oneFilter);
}
SObject[] parents = RollupUtil.getParents(
matchingChildren, summary.ParentObject__r.QualifiedApiName,
summary.LookupField__r.QualifiedApiName);
RollupUtil.adjustParents(
parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c,
matchingChildren, summary.FieldToSummarize__r.QualifiedApiName);
update parents;
}
…
}
}
Pseudocode Example
dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c
(BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) {
Schema.SObjectType thisObject = Trigger.sObjectType;
RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata;
for (RollupOverLookup__mdt summary : summariesOfThisObject) {
RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c,
Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id];
if (Trigger.isInsert) {
SObject[] matchingChildren = Trigger.new;
for (RollupFilter__mdt oneFilter : filters) {
matchingChildren = FilterUtil.filter(matchingChildren, oneFilter);
}
SObject[] parents = RollupUtil.getParents(
matchingChildren, summary.ParentObject__r.QualifiedApiName,
summary.LookupField__r.QualifiedApiName);
RollupUtil.adjustParents(
parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c,
matchingChildren, summary.FieldToSummarize__r.QualifiedApiName);
update parents;
}
…
}
}
• Lets the platform developer control the save process of Sobjects using your custom metadata types.
• Code written by the platform developer will be executed for entities that might not even exist at the
time the code was written.
• ISVs can package dynamic triggers and the triggers can be used to modify save process of the
customer org’s objects that use the platform built by the ISVs.
Dynamic triggers
Apex DDL
Set up metadata natively
Create metadata in native apex
• Fewer manual install procedures
• Easier custom tooling
• No callouts required
public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child,
FieldDefinition summarized, FieldDefinition lookup,
PicklistValue op) {
MetadataContainer mdc = new MetadataContainer();
insert mdc;
FieldDefinition summarizingField = new FieldDefintion();
summarizingField.EntityId = parent.EntityId;
summarizingField.DeveloperName = devName;
…
mdc.addMember(summarizingField);
RollupOverLookup__mdt rollup = new RollupOverLookup__mdt();
rollup.ParentObject__c = parent.EntityId;
rollup.SummarizedObject__c = child.EntityId;
rollup.RollupOperation__c = op;
rollup.parentField__r = summarizingField;
…
mdc.addMember(rollup);
mdc.deploy();
}
Pseudocode Example
Pseudocode Example
public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child,
FieldDefinition summarized, FieldDefinition lookup,
PicklistValue op) {
MetadataContainer mdc = new MetadataContainer();
insert mdc;
FieldDefinition summarizingField = new FieldDefintion();
summarizingField.EntityId = parent.EntityId;
summarizingField.DeveloperName = devName;
…
mdc.addMember(summarizingField);
RollupOverLookup__mdt rollup = new RollupOverLookup__mdt();
rollup.ParentObject__c = parent.EntityId;
rollup.ChildObject__c = child.EntityId;
rollup.RollupOperation__c = op;
rollup.parentField__r = summarizingField;
…
mdc.addMember(rollup);
mdc.deploy();
}
public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child,
FieldDefinition summarized, FieldDefinition lookup,
PicklistValue op) {
MetadataContainer mdc = new MetadataContainer();
insert mdc;
FieldDefinition summarizingField = new FieldDefintion();
summarizingField.EntityId = parent.EntityId;
summarizingField.DeveloperName = devName;
…
mdc.addMember(summarizingField);
RollupOverLookup__mdt rollup = new RollupOverLookup__mdt();
rollup.ParentObject__c = parent.EntityId;
rollup.ChildObject__c = child.EntityId;
rollup.RollupOperation__c = op;
rollup.parentField__r = summarizingField;
…
mdc.addMember(rollup);
mdc.deploy();
}
Pseudocode Example
public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child,
FieldDefinition summarized, FieldDefinition lookup,
PicklistValue op) {
MetadataContainer mdc = new MetadataContainer();
insert mdc;
FieldDefinition summarizingField = new FieldDefintion();
summarizingField.EntityId = parent.EntityId;
summarizingField.DeveloperName = devName;
…
mdc.addMember(summarizingField);
RollupOverLookup__mdt rollup = new RollupOverLookup__mdt();
rollup.ParentObject__c = parent.EntityId;
rollup.ChildObject__c = child.EntityId;
rollup.RollupOperation__c = op;
rollup.parentField__r = summarizingField;
…
mdc.addMember(rollup);
mdc.deploy();
}
Pseudocode Example
public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child,
FieldDefinition summarized, FieldDefinition lookup,
PicklistValue op) {
MetadataContainer mdc = new MetadataContainer();
insert mdc;
FieldDefinition summarizingField = new FieldDefintion();
summarizingField.EntityId = parent.EntityId;
summarizingField.DeveloperName = devName;
…
mdc.addMember(summarizingField);
RollupOverLookup__mdt rollup = new RollupOverLookup__mdt();
rollup.ParentObject__c = parent.EntityId;
rollup.ChildObject__c = child.EntityId;
rollup.RollupOperation__c = op;
rollup.parentField__r = summarizingField;
…
mdc.addMember(rollup);
mdc.deploy();
}
Pseudocode Example
public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child,
FieldDefinition summarized, FieldDefinition lookup,
PicklistValue op) {
MetadataContainer mdc = new MetadataContainer();
insert mdc;
FieldDefinition summarizingField = new FieldDefintion();
summarizingField.EntityId = parent.EntityId;
summarizingField.DeveloperName = devName;
…
mdc.addMember(summarizingField);
RollupOverLookup__mdt rollup = new RollupOverLookup__mdt();
rollup.ParentObject__c = parent.EntityId;
rollup.ChildObject__c = child.EntityId;
rollup.RollupOperation__c = op;
rollup.parentField__r = summarizingField;
…
mdc.addMember(rollup);
mdc.deploy();
}
Pseudocode Example
public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child,
FieldDefinition summarized, FieldDefinition lookup,
PicklistValue op) {
MetadataContainer mdc = new MetadataContainer();
insert mdc;
FieldDefinition summarizingField = new FieldDefintion();
summarizingField.EntityId = parent.EntityId;
summarizingField.DeveloperName = devName;
…
mdc.addMember(summarizingField);
RollupOverLookup__mdt rollup = new RollupOverLookup__mdt();
rollup.ParentObject__c = parent.EntityId;
rollup.ChildObject__c = child.EntityId;
rollup.RollupOperation__c = op;
rollup.parentField__r = summarizingField;
…
mdc.addMember(rollup);
mdc.deploy();
}
Pseudocode Example
Avrom Roy-Faderman
Principal Member of the Technical Staff, Salesforce App Cloud
Custom Datatypes
Create your own meta-schema
Custom Datatypes
Compound and configurable
Custom datatype
Column
Column
Column
One or more columns of
standard datatypes
Custom metadata type
Custom Datatypes
Compound and configurable
Custom datatype
Column
Column
Column
Custom Field
DefinitionsMD Rel Field
Values of this field get
auto-populated with
fields of the custom
datatype
Custom metadata type
Custom Datatypes
Compound and configurable
Custom datatype
Column
Column
Column
MD Rel Field
Field
Field
Other fields here contain
additional metadata
relevant to fields of this
type
RollupOverLookup__mdt
Example Custom Datatype
RollupOverLookup
RollupOverLookup
Value__s Fields of type
RollupOverLookupParentField__c
SummarizedField__c
Operation__c
…
Creating a Field of the Custom Type
Summary and Roadmap
Our vision: Open up the platform to partners and customers the way the platform opens up apps
• Custom metadata types are a first step towards this, providing custom types of metadata with standard:
• SDLC
• Packaging
• Setup UI
• Fast runtime access
• More features on our roadmap
• Metadata relationships for type integration (plus other datatypes!)
• Customizable save process via dynamic triggers
• Custom tooling and automated setup via Apex DDL
• Custom datatypes for fields
• Even more stuff in the longer term!
Summary
Available now Spring ’16 Summer ’16 Winter ’17 Beyond
Metadata
Relationships
Apex DDL
Dynamic
Triggers
Custom
Datatypes
Extra-super-special safe harbor!
Roadmap
Pilot GA
Pilot GA
GA
Pilot GA
Share Your Feedback, and Win a GoPro!
3
Earn a GoPro prize entry for
each completed survey
Tap the bell to take a
survey2Enroll in a session1
Thank you
Ad

More Related Content

What's hot (20)

Performing a successful technical debt assessment in Salesforce
Performing a successful technical debt assessment in SalesforcePerforming a successful technical debt assessment in Salesforce
Performing a successful technical debt assessment in Salesforce
Coforge (Erstwhile WHISHWORKS)
 
15 Tips on Salesforce Data Migration - Naveen Gabrani & Jonathan Osgood
15 Tips on Salesforce Data Migration - Naveen Gabrani & Jonathan Osgood15 Tips on Salesforce Data Migration - Naveen Gabrani & Jonathan Osgood
15 Tips on Salesforce Data Migration - Naveen Gabrani & Jonathan Osgood
Salesforce Admins
 
Business Plan Executive Summary Drivers Challenges
Business Plan Executive Summary Drivers ChallengesBusiness Plan Executive Summary Drivers Challenges
Business Plan Executive Summary Drivers Challenges
SlideTeam
 
Decluttering your Salesfroce org
Decluttering your Salesfroce orgDecluttering your Salesfroce org
Decluttering your Salesfroce org
Roy Gilad
 
Webinar: Take Control of Your Org with Salesforce Optimizer
Webinar: Take Control of Your Org with Salesforce OptimizerWebinar: Take Control of Your Org with Salesforce Optimizer
Webinar: Take Control of Your Org with Salesforce Optimizer
Salesforce Admins
 
Apex Testing Best Practices
Apex Testing Best PracticesApex Testing Best Practices
Apex Testing Best Practices
Salesforce Developers
 
Complete Guide To Salesforce Einstein Analytics
Complete Guide To Salesforce Einstein AnalyticsComplete Guide To Salesforce Einstein Analytics
Complete Guide To Salesforce Einstein Analytics
Cloud Analogy
 
From Sandbox To Production: An Introduction to Salesforce Release Management
From Sandbox To Production: An Introduction to Salesforce Release ManagementFrom Sandbox To Production: An Introduction to Salesforce Release Management
From Sandbox To Production: An Introduction to Salesforce Release Management
Salesforce Developers
 
Discover salesforce, dev ops and Copado CI/CD automations
Discover salesforce, dev ops and Copado CI/CD automationsDiscover salesforce, dev ops and Copado CI/CD automations
Discover salesforce, dev ops and Copado CI/CD automations
JackGuo20
 
Salesforce CI/CD - A strategy for success
Salesforce CI/CD - A strategy for successSalesforce CI/CD - A strategy for success
Salesforce CI/CD - A strategy for success
Yassine ELQANDILI ☁
 
Salesforce and SAP Integration with Informatica Cloud
Salesforce and SAP Integration with Informatica CloudSalesforce and SAP Integration with Informatica Cloud
Salesforce and SAP Integration with Informatica Cloud
Darren Cunningham
 
Adminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発TipsAdminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発Tips
Takashi Hatamoto
 
Managing Change With A Sensible Sandbox Architecture
Managing Change With A Sensible Sandbox ArchitectureManaging Change With A Sensible Sandbox Architecture
Managing Change With A Sensible Sandbox Architecture
Alexander Sutherland
 
Salesforce Development Best Practices
Salesforce Development Best PracticesSalesforce Development Best Practices
Salesforce Development Best Practices
Vivek Chawla
 
How to Rock a Salesforce Demo (and why it matters)
How to Rock a Salesforce Demo (and why it matters)How to Rock a Salesforce Demo (and why it matters)
How to Rock a Salesforce Demo (and why it matters)
Salesforce Admins
 
Salesforce Continuous Integration with AutoRABIT
Salesforce Continuous Integration with AutoRABITSalesforce Continuous Integration with AutoRABIT
Salesforce Continuous Integration with AutoRABIT
Vishnu Raju Datla
 
Salesforce.com Org Migration Overview
Salesforce.com Org Migration OverviewSalesforce.com Org Migration Overview
Salesforce.com Org Migration Overview
Shell Black
 
Basecamp copenhagen B2C Commerce
Basecamp copenhagen B2C CommerceBasecamp copenhagen B2C Commerce
Basecamp copenhagen B2C Commerce
Salesforce - Sweden, Denmark, Norway
 
Salesforce Architecture framework, Martin Kona
Salesforce Architecture framework, Martin KonaSalesforce Architecture framework, Martin Kona
Salesforce Architecture framework, Martin Kona
CzechDreamin
 
Salesforce Deck Template
Salesforce Deck TemplateSalesforce Deck Template
Salesforce Deck Template
Phil Weinmeister
 
Performing a successful technical debt assessment in Salesforce
Performing a successful technical debt assessment in SalesforcePerforming a successful technical debt assessment in Salesforce
Performing a successful technical debt assessment in Salesforce
Coforge (Erstwhile WHISHWORKS)
 
15 Tips on Salesforce Data Migration - Naveen Gabrani & Jonathan Osgood
15 Tips on Salesforce Data Migration - Naveen Gabrani & Jonathan Osgood15 Tips on Salesforce Data Migration - Naveen Gabrani & Jonathan Osgood
15 Tips on Salesforce Data Migration - Naveen Gabrani & Jonathan Osgood
Salesforce Admins
 
Business Plan Executive Summary Drivers Challenges
Business Plan Executive Summary Drivers ChallengesBusiness Plan Executive Summary Drivers Challenges
Business Plan Executive Summary Drivers Challenges
SlideTeam
 
Decluttering your Salesfroce org
Decluttering your Salesfroce orgDecluttering your Salesfroce org
Decluttering your Salesfroce org
Roy Gilad
 
Webinar: Take Control of Your Org with Salesforce Optimizer
Webinar: Take Control of Your Org with Salesforce OptimizerWebinar: Take Control of Your Org with Salesforce Optimizer
Webinar: Take Control of Your Org with Salesforce Optimizer
Salesforce Admins
 
Complete Guide To Salesforce Einstein Analytics
Complete Guide To Salesforce Einstein AnalyticsComplete Guide To Salesforce Einstein Analytics
Complete Guide To Salesforce Einstein Analytics
Cloud Analogy
 
From Sandbox To Production: An Introduction to Salesforce Release Management
From Sandbox To Production: An Introduction to Salesforce Release ManagementFrom Sandbox To Production: An Introduction to Salesforce Release Management
From Sandbox To Production: An Introduction to Salesforce Release Management
Salesforce Developers
 
Discover salesforce, dev ops and Copado CI/CD automations
Discover salesforce, dev ops and Copado CI/CD automationsDiscover salesforce, dev ops and Copado CI/CD automations
Discover salesforce, dev ops and Copado CI/CD automations
JackGuo20
 
Salesforce CI/CD - A strategy for success
Salesforce CI/CD - A strategy for successSalesforce CI/CD - A strategy for success
Salesforce CI/CD - A strategy for success
Yassine ELQANDILI ☁
 
Salesforce and SAP Integration with Informatica Cloud
Salesforce and SAP Integration with Informatica CloudSalesforce and SAP Integration with Informatica Cloud
Salesforce and SAP Integration with Informatica Cloud
Darren Cunningham
 
Adminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発TipsAdminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発Tips
Takashi Hatamoto
 
Managing Change With A Sensible Sandbox Architecture
Managing Change With A Sensible Sandbox ArchitectureManaging Change With A Sensible Sandbox Architecture
Managing Change With A Sensible Sandbox Architecture
Alexander Sutherland
 
Salesforce Development Best Practices
Salesforce Development Best PracticesSalesforce Development Best Practices
Salesforce Development Best Practices
Vivek Chawla
 
How to Rock a Salesforce Demo (and why it matters)
How to Rock a Salesforce Demo (and why it matters)How to Rock a Salesforce Demo (and why it matters)
How to Rock a Salesforce Demo (and why it matters)
Salesforce Admins
 
Salesforce Continuous Integration with AutoRABIT
Salesforce Continuous Integration with AutoRABITSalesforce Continuous Integration with AutoRABIT
Salesforce Continuous Integration with AutoRABIT
Vishnu Raju Datla
 
Salesforce.com Org Migration Overview
Salesforce.com Org Migration OverviewSalesforce.com Org Migration Overview
Salesforce.com Org Migration Overview
Shell Black
 
Salesforce Architecture framework, Martin Kona
Salesforce Architecture framework, Martin KonaSalesforce Architecture framework, Martin Kona
Salesforce Architecture framework, Martin Kona
CzechDreamin
 

Similar to Beyond Custom Metadata Types (20)

Aan009 Contreras 091907
Aan009 Contreras 091907Aan009 Contreras 091907
Aan009 Contreras 091907
Dreamforce07
 
Building Smart Apps
Building Smart AppsBuilding Smart Apps
Building Smart Apps
Salesforce Developers
 
Developer Tour on the Salesforce1 Platform
Developer Tour on the Salesforce1 PlatformDeveloper Tour on the Salesforce1 Platform
Developer Tour on the Salesforce1 Platform
Salesforce Deutschland
 
ISV Tech Talk: Usage Metrics (October 15, 2014)
ISV Tech Talk: Usage Metrics (October 15, 2014)ISV Tech Talk: Usage Metrics (October 15, 2014)
ISV Tech Talk: Usage Metrics (October 15, 2014)
Salesforce Partners
 
Developers guide to the Salesforce1 Platform
Developers guide to the Salesforce1 PlatformDevelopers guide to the Salesforce1 Platform
Developers guide to the Salesforce1 Platform
John Stevenson
 
Become a Superstar Admin with Custom Metadata Types
Become a Superstar Admin with Custom Metadata TypesBecome a Superstar Admin with Custom Metadata Types
Become a Superstar Admin with Custom Metadata Types
Salesforce Admins
 
Mbf2 salesforce webinar 2
Mbf2 salesforce webinar 2Mbf2 salesforce webinar 2
Mbf2 salesforce webinar 2
BeMyApp
 
Salesforce Campus Tour - Developer Intro
Salesforce Campus Tour - Developer IntroSalesforce Campus Tour - Developer Intro
Salesforce Campus Tour - Developer Intro
James Ward
 
Toronto dev group mar2019
Toronto dev group mar2019Toronto dev group mar2019
Toronto dev group mar2019
rikkehovgaard
 
Building Visualforce Custom Events Handlers
Building Visualforce Custom Events HandlersBuilding Visualforce Custom Events Handlers
Building Visualforce Custom Events Handlers
Salesforce Developers
 
Processing Big Data At-Scale in the App Cloud
Processing Big Data At-Scale in the App CloudProcessing Big Data At-Scale in the App Cloud
Processing Big Data At-Scale in the App Cloud
Salesforce Developers
 
Salesforce Campus Tour - Declarative
Salesforce Campus Tour - DeclarativeSalesforce Campus Tour - Declarative
Salesforce Campus Tour - Declarative
James Ward
 
Understanding the Salesforce Architecture: How We Do the Magic We Do
Understanding the Salesforce Architecture: How We Do the Magic We DoUnderstanding the Salesforce Architecture: How We Do the Magic We Do
Understanding the Salesforce Architecture: How We Do the Magic We Do
Salesforce Developers
 
Introduction to Force.com
Introduction to Force.comIntroduction to Force.com
Introduction to Force.com
Salesforce Developers
 
Salesforce Winter '23 Release Highlights.pptx
Salesforce Winter '23 Release Highlights.pptxSalesforce Winter '23 Release Highlights.pptx
Salesforce Winter '23 Release Highlights.pptx
Om Prakash
 
Singapore dg salesforce einstein + spring 17 release by manish
Singapore dg   salesforce einstein + spring 17 release by manishSingapore dg   salesforce einstein + spring 17 release by manish
Singapore dg salesforce einstein + spring 17 release by manish
Manish Thaduri
 
sf tools from community
sf tools from communitysf tools from community
sf tools from community
Durgesh Dhoot
 
Pardot Story: Beyond List Email
Pardot Story: Beyond List EmailPardot Story: Beyond List Email
Pardot Story: Beyond List Email
Pardot
 
Data.com APIs in Action ? Bringing Data to Life in Salesforce
Data.com APIs in Action ? Bringing Data to Life in SalesforceData.com APIs in Action ? Bringing Data to Life in Salesforce
Data.com APIs in Action ? Bringing Data to Life in Salesforce
Salesforce Developers
 
CCT London 2013 Theatre Intro to Apex
CCT London 2013 Theatre Intro to ApexCCT London 2013 Theatre Intro to Apex
CCT London 2013 Theatre Intro to Apex
Peter Chittum
 
Aan009 Contreras 091907
Aan009 Contreras 091907Aan009 Contreras 091907
Aan009 Contreras 091907
Dreamforce07
 
Developer Tour on the Salesforce1 Platform
Developer Tour on the Salesforce1 PlatformDeveloper Tour on the Salesforce1 Platform
Developer Tour on the Salesforce1 Platform
Salesforce Deutschland
 
ISV Tech Talk: Usage Metrics (October 15, 2014)
ISV Tech Talk: Usage Metrics (October 15, 2014)ISV Tech Talk: Usage Metrics (October 15, 2014)
ISV Tech Talk: Usage Metrics (October 15, 2014)
Salesforce Partners
 
Developers guide to the Salesforce1 Platform
Developers guide to the Salesforce1 PlatformDevelopers guide to the Salesforce1 Platform
Developers guide to the Salesforce1 Platform
John Stevenson
 
Become a Superstar Admin with Custom Metadata Types
Become a Superstar Admin with Custom Metadata TypesBecome a Superstar Admin with Custom Metadata Types
Become a Superstar Admin with Custom Metadata Types
Salesforce Admins
 
Mbf2 salesforce webinar 2
Mbf2 salesforce webinar 2Mbf2 salesforce webinar 2
Mbf2 salesforce webinar 2
BeMyApp
 
Salesforce Campus Tour - Developer Intro
Salesforce Campus Tour - Developer IntroSalesforce Campus Tour - Developer Intro
Salesforce Campus Tour - Developer Intro
James Ward
 
Toronto dev group mar2019
Toronto dev group mar2019Toronto dev group mar2019
Toronto dev group mar2019
rikkehovgaard
 
Building Visualforce Custom Events Handlers
Building Visualforce Custom Events HandlersBuilding Visualforce Custom Events Handlers
Building Visualforce Custom Events Handlers
Salesforce Developers
 
Processing Big Data At-Scale in the App Cloud
Processing Big Data At-Scale in the App CloudProcessing Big Data At-Scale in the App Cloud
Processing Big Data At-Scale in the App Cloud
Salesforce Developers
 
Salesforce Campus Tour - Declarative
Salesforce Campus Tour - DeclarativeSalesforce Campus Tour - Declarative
Salesforce Campus Tour - Declarative
James Ward
 
Understanding the Salesforce Architecture: How We Do the Magic We Do
Understanding the Salesforce Architecture: How We Do the Magic We DoUnderstanding the Salesforce Architecture: How We Do the Magic We Do
Understanding the Salesforce Architecture: How We Do the Magic We Do
Salesforce Developers
 
Salesforce Winter '23 Release Highlights.pptx
Salesforce Winter '23 Release Highlights.pptxSalesforce Winter '23 Release Highlights.pptx
Salesforce Winter '23 Release Highlights.pptx
Om Prakash
 
Singapore dg salesforce einstein + spring 17 release by manish
Singapore dg   salesforce einstein + spring 17 release by manishSingapore dg   salesforce einstein + spring 17 release by manish
Singapore dg salesforce einstein + spring 17 release by manish
Manish Thaduri
 
sf tools from community
sf tools from communitysf tools from community
sf tools from community
Durgesh Dhoot
 
Pardot Story: Beyond List Email
Pardot Story: Beyond List EmailPardot Story: Beyond List Email
Pardot Story: Beyond List Email
Pardot
 
Data.com APIs in Action ? Bringing Data to Life in Salesforce
Data.com APIs in Action ? Bringing Data to Life in SalesforceData.com APIs in Action ? Bringing Data to Life in Salesforce
Data.com APIs in Action ? Bringing Data to Life in Salesforce
Salesforce Developers
 
CCT London 2013 Theatre Intro to Apex
CCT London 2013 Theatre Intro to ApexCCT London 2013 Theatre Intro to Apex
CCT London 2013 Theatre Intro to Apex
Peter Chittum
 
Ad

More from Salesforce Developers (20)

Sample Gallery: Reference Code and Best Practices for Salesforce Developers
Sample Gallery: Reference Code and Best Practices for Salesforce DevelopersSample Gallery: Reference Code and Best Practices for Salesforce Developers
Sample Gallery: Reference Code and Best Practices for Salesforce Developers
Salesforce Developers
 
Maximizing Salesforce Lightning Experience and Lightning Component Performance
Maximizing Salesforce Lightning Experience and Lightning Component PerformanceMaximizing Salesforce Lightning Experience and Lightning Component Performance
Maximizing Salesforce Lightning Experience and Lightning Component Performance
Salesforce Developers
 
Local development with Open Source Base Components
Local development with Open Source Base ComponentsLocal development with Open Source Base Components
Local development with Open Source Base Components
Salesforce Developers
 
TrailheaDX India : Developer Highlights
TrailheaDX India : Developer HighlightsTrailheaDX India : Developer Highlights
TrailheaDX India : Developer Highlights
Salesforce Developers
 
Why developers shouldn’t miss TrailheaDX India
Why developers shouldn’t miss TrailheaDX IndiaWhy developers shouldn’t miss TrailheaDX India
Why developers shouldn’t miss TrailheaDX India
Salesforce Developers
 
CodeLive: Build Lightning Web Components faster with Local Development
CodeLive: Build Lightning Web Components faster with Local DevelopmentCodeLive: Build Lightning Web Components faster with Local Development
CodeLive: Build Lightning Web Components faster with Local Development
Salesforce Developers
 
CodeLive: Converting Aura Components to Lightning Web Components
CodeLive: Converting Aura Components to Lightning Web ComponentsCodeLive: Converting Aura Components to Lightning Web Components
CodeLive: Converting Aura Components to Lightning Web Components
Salesforce Developers
 
Enterprise-grade UI with open source Lightning Web Components
Enterprise-grade UI with open source Lightning Web ComponentsEnterprise-grade UI with open source Lightning Web Components
Enterprise-grade UI with open source Lightning Web Components
Salesforce Developers
 
TrailheaDX and Summer '19: Developer Highlights
TrailheaDX and Summer '19: Developer HighlightsTrailheaDX and Summer '19: Developer Highlights
TrailheaDX and Summer '19: Developer Highlights
Salesforce Developers
 
Live coding with LWC
Live coding with LWCLive coding with LWC
Live coding with LWC
Salesforce Developers
 
Lightning web components - Episode 4 : Security and Testing
Lightning web components  - Episode 4 : Security and TestingLightning web components  - Episode 4 : Security and Testing
Lightning web components - Episode 4 : Security and Testing
Salesforce Developers
 
LWC Episode 3- Component Communication and Aura Interoperability
LWC Episode 3- Component Communication and Aura InteroperabilityLWC Episode 3- Component Communication and Aura Interoperability
LWC Episode 3- Component Communication and Aura Interoperability
Salesforce Developers
 
Lightning web components episode 2- work with salesforce data
Lightning web components   episode 2- work with salesforce dataLightning web components   episode 2- work with salesforce data
Lightning web components episode 2- work with salesforce data
Salesforce Developers
 
Lightning web components - Episode 1 - An Introduction
Lightning web components - Episode 1 - An IntroductionLightning web components - Episode 1 - An Introduction
Lightning web components - Episode 1 - An Introduction
Salesforce Developers
 
Migrating CPQ to Advanced Calculator and JSQCP
Migrating CPQ to Advanced Calculator and JSQCPMigrating CPQ to Advanced Calculator and JSQCP
Migrating CPQ to Advanced Calculator and JSQCP
Salesforce Developers
 
Scale with Large Data Volumes and Big Objects in Salesforce
Scale with Large Data Volumes and Big Objects in SalesforceScale with Large Data Volumes and Big Objects in Salesforce
Scale with Large Data Volumes and Big Objects in Salesforce
Salesforce Developers
 
Replicate Salesforce Data in Real Time with Change Data Capture
Replicate Salesforce Data in Real Time with Change Data CaptureReplicate Salesforce Data in Real Time with Change Data Capture
Replicate Salesforce Data in Real Time with Change Data Capture
Salesforce Developers
 
Modern Development with Salesforce DX
Modern Development with Salesforce DXModern Development with Salesforce DX
Modern Development with Salesforce DX
Salesforce Developers
 
Get Into Lightning Flow Development
Get Into Lightning Flow DevelopmentGet Into Lightning Flow Development
Get Into Lightning Flow Development
Salesforce Developers
 
Integrate CMS Content Into Lightning Communities with CMS Connect
Integrate CMS Content Into Lightning Communities with CMS ConnectIntegrate CMS Content Into Lightning Communities with CMS Connect
Integrate CMS Content Into Lightning Communities with CMS Connect
Salesforce Developers
 
Sample Gallery: Reference Code and Best Practices for Salesforce Developers
Sample Gallery: Reference Code and Best Practices for Salesforce DevelopersSample Gallery: Reference Code and Best Practices for Salesforce Developers
Sample Gallery: Reference Code and Best Practices for Salesforce Developers
Salesforce Developers
 
Maximizing Salesforce Lightning Experience and Lightning Component Performance
Maximizing Salesforce Lightning Experience and Lightning Component PerformanceMaximizing Salesforce Lightning Experience and Lightning Component Performance
Maximizing Salesforce Lightning Experience and Lightning Component Performance
Salesforce Developers
 
Local development with Open Source Base Components
Local development with Open Source Base ComponentsLocal development with Open Source Base Components
Local development with Open Source Base Components
Salesforce Developers
 
TrailheaDX India : Developer Highlights
TrailheaDX India : Developer HighlightsTrailheaDX India : Developer Highlights
TrailheaDX India : Developer Highlights
Salesforce Developers
 
Why developers shouldn’t miss TrailheaDX India
Why developers shouldn’t miss TrailheaDX IndiaWhy developers shouldn’t miss TrailheaDX India
Why developers shouldn’t miss TrailheaDX India
Salesforce Developers
 
CodeLive: Build Lightning Web Components faster with Local Development
CodeLive: Build Lightning Web Components faster with Local DevelopmentCodeLive: Build Lightning Web Components faster with Local Development
CodeLive: Build Lightning Web Components faster with Local Development
Salesforce Developers
 
CodeLive: Converting Aura Components to Lightning Web Components
CodeLive: Converting Aura Components to Lightning Web ComponentsCodeLive: Converting Aura Components to Lightning Web Components
CodeLive: Converting Aura Components to Lightning Web Components
Salesforce Developers
 
Enterprise-grade UI with open source Lightning Web Components
Enterprise-grade UI with open source Lightning Web ComponentsEnterprise-grade UI with open source Lightning Web Components
Enterprise-grade UI with open source Lightning Web Components
Salesforce Developers
 
TrailheaDX and Summer '19: Developer Highlights
TrailheaDX and Summer '19: Developer HighlightsTrailheaDX and Summer '19: Developer Highlights
TrailheaDX and Summer '19: Developer Highlights
Salesforce Developers
 
Lightning web components - Episode 4 : Security and Testing
Lightning web components  - Episode 4 : Security and TestingLightning web components  - Episode 4 : Security and Testing
Lightning web components - Episode 4 : Security and Testing
Salesforce Developers
 
LWC Episode 3- Component Communication and Aura Interoperability
LWC Episode 3- Component Communication and Aura InteroperabilityLWC Episode 3- Component Communication and Aura Interoperability
LWC Episode 3- Component Communication and Aura Interoperability
Salesforce Developers
 
Lightning web components episode 2- work with salesforce data
Lightning web components   episode 2- work with salesforce dataLightning web components   episode 2- work with salesforce data
Lightning web components episode 2- work with salesforce data
Salesforce Developers
 
Lightning web components - Episode 1 - An Introduction
Lightning web components - Episode 1 - An IntroductionLightning web components - Episode 1 - An Introduction
Lightning web components - Episode 1 - An Introduction
Salesforce Developers
 
Migrating CPQ to Advanced Calculator and JSQCP
Migrating CPQ to Advanced Calculator and JSQCPMigrating CPQ to Advanced Calculator and JSQCP
Migrating CPQ to Advanced Calculator and JSQCP
Salesforce Developers
 
Scale with Large Data Volumes and Big Objects in Salesforce
Scale with Large Data Volumes and Big Objects in SalesforceScale with Large Data Volumes and Big Objects in Salesforce
Scale with Large Data Volumes and Big Objects in Salesforce
Salesforce Developers
 
Replicate Salesforce Data in Real Time with Change Data Capture
Replicate Salesforce Data in Real Time with Change Data CaptureReplicate Salesforce Data in Real Time with Change Data Capture
Replicate Salesforce Data in Real Time with Change Data Capture
Salesforce Developers
 
Modern Development with Salesforce DX
Modern Development with Salesforce DXModern Development with Salesforce DX
Modern Development with Salesforce DX
Salesforce Developers
 
Integrate CMS Content Into Lightning Communities with CMS Connect
Integrate CMS Content Into Lightning Communities with CMS ConnectIntegrate CMS Content Into Lightning Communities with CMS Connect
Integrate CMS Content Into Lightning Communities with CMS Connect
Salesforce Developers
 
Ad

Recently uploaded (20)

What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...
Vishnu Singh Chundawat
 
Build Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For DevsBuild Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For Devs
Brian McKeiver
 
Hands On: Create a Lightning Aura Component with force:RecordData
Hands On: Create a Lightning Aura Component with force:RecordDataHands On: Create a Lightning Aura Component with force:RecordData
Hands On: Create a Lightning Aura Component with force:RecordData
Lynda Kane
 
Leading AI Innovation As A Product Manager - Michael Jidael
Leading AI Innovation As A Product Manager - Michael JidaelLeading AI Innovation As A Product Manager - Michael Jidael
Leading AI Innovation As A Product Manager - Michael Jidael
Michael Jidael
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx
Samuele Fogagnolo
 
Network Security. Different aspects of Network Security.
Network Security. Different aspects of Network Security.Network Security. Different aspects of Network Security.
Network Security. Different aspects of Network Security.
gregtap1
 
Salesforce AI Associate 2 of 2 Certification.docx
Salesforce AI Associate 2 of 2 Certification.docxSalesforce AI Associate 2 of 2 Certification.docx
Salesforce AI Associate 2 of 2 Certification.docx
José Enrique López Rivera
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Learn the Basics of Agile Development: Your Step-by-Step Guide
Learn the Basics of Agile Development: Your Step-by-Step GuideLearn the Basics of Agile Development: Your Step-by-Step Guide
Learn the Basics of Agile Development: Your Step-by-Step Guide
Marcel David
 
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
SOFTTECHHUB
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
Asthma presentación en inglés abril 2025 pdf
Asthma presentación en inglés abril 2025 pdfAsthma presentación en inglés abril 2025 pdf
Asthma presentación en inglés abril 2025 pdf
VanessaRaudez
 
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In FranceManifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
chb3
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...
Vishnu Singh Chundawat
 
Build Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For DevsBuild Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For Devs
Brian McKeiver
 
Hands On: Create a Lightning Aura Component with force:RecordData
Hands On: Create a Lightning Aura Component with force:RecordDataHands On: Create a Lightning Aura Component with force:RecordData
Hands On: Create a Lightning Aura Component with force:RecordData
Lynda Kane
 
Leading AI Innovation As A Product Manager - Michael Jidael
Leading AI Innovation As A Product Manager - Michael JidaelLeading AI Innovation As A Product Manager - Michael Jidael
Leading AI Innovation As A Product Manager - Michael Jidael
Michael Jidael
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx
Samuele Fogagnolo
 
Network Security. Different aspects of Network Security.
Network Security. Different aspects of Network Security.Network Security. Different aspects of Network Security.
Network Security. Different aspects of Network Security.
gregtap1
 
Salesforce AI Associate 2 of 2 Certification.docx
Salesforce AI Associate 2 of 2 Certification.docxSalesforce AI Associate 2 of 2 Certification.docx
Salesforce AI Associate 2 of 2 Certification.docx
José Enrique López Rivera
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Learn the Basics of Agile Development: Your Step-by-Step Guide
Learn the Basics of Agile Development: Your Step-by-Step GuideLearn the Basics of Agile Development: Your Step-by-Step Guide
Learn the Basics of Agile Development: Your Step-by-Step Guide
Marcel David
 
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
SOFTTECHHUB
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
Asthma presentación en inglés abril 2025 pdf
Asthma presentación en inglés abril 2025 pdfAsthma presentación en inglés abril 2025 pdf
Asthma presentación en inglés abril 2025 pdf
VanessaRaudez
 
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In FranceManifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
chb3
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 

Beyond Custom Metadata Types

  • 1. Beyond Custom Metadata Types Avrom Roy-Faderman Principal Member of Techincal Staff Salesforce App Cloud [email protected] @aroyfaderman The Vision for “Platform on the Platform” in Force.com Haripriya Murthy Senior Member of Techincal Staff Salesforce App Cloud [email protected] @haripriyamurthy
  • 2. Safe harbor statement under the Private Securities Litigation Reform Act of 1995: This presentation may contain forward-looking statements that involve risks, uncertainties, and assumptions. If any such uncertainties materialize or if any of the assumptions proves incorrect, the results of salesforce.com, inc. could differ materially from the results expressed or implied by the forward-looking statements we make. All statements other than statements of historical fact could be deemed forward-looking, including any projections of product or service availability, subscriber growth, earnings, revenues, or other financial items and any statements regarding strategies or plans of management for future operations, statements of belief, any statements concerning new, planned, or upgraded services or technology developments and customer contracts or use of our services. The risks and uncertainties referred to above include – but are not limited to – risks associated with developing and delivering new functionality for our service, new products and services, our new business model, our past operating losses, possible fluctuations in our operating results and rate of growth, interruptions or delays in our Web hosting, breach of our security measures, the outcome of any litigation, risks associated with completed and any possible mergers and acquisitions, the immature market in which we operate, our relatively limited operating history, our ability to expand, retain, and motivate our employees and manage our growth, new releases of our service and successful customer deployment, our limited history reselling non-salesforce.com products, and utilization and selling to larger enterprise customers. Further information on potential factors that could affect the financial results of salesforce.com, inc. is included in our annual report on Form 10-K for the most recent fiscal year and in our quarterly report on Form 10-Q for the most recent fiscal quarter. These documents and others containing important disclosures are available on the SEC Filings section of the Investor Information section of our Web site. Any unreleased services or features referenced in this or other presentations, press releases or public statements are not currently available and may not be delivered on time or at all. Customers who purchase our services should make the purchase decisions based upon features that are currently available. Salesforce.com, inc. assumes no obligation and does not intend to update these forward-looking statements. Safe Harbor
  • 3. CRM Apps ISV Apps IT Apps The “Standard” Force.com Platform App Cloud Customer The Salesforce Advantage
  • 4. IT Apps The “Platform on the Platform” Vision App Cloud CRM Apps ISV Apps IT Apps Customer IT AppsISV Apps ISV Platform IT Platform The <Your Company Name> Advantage
  • 5. RemoteSiteSetting ValidationRule CustomObjectTranslation PermissionSet <Many more examples> Standard Metadata Types Custom Metadata Types The Story So Far… ApiMapping StockPointRule InternationalVatRule AclRule <Whatever you want>
  • 6. Instances are: • Packageable/Upgradeable • Deployable (change set/MD API) • Free to access (via Describe) • Salesforce writes the code that “makes them go” Standard Metadata Types Custom Metadata Types The Story So Far… Instances are: • Packageable/Upgradeable • Deployable (change set/MD API) • Free to access (via SOQL) • You write the code that “makes them go”
  • 7. The Vision for the Future Demo: Coming… Now • For everyone: Create Custom Metadata Types and Records in the Setup UI • For ISVs: Control Field Editability and Record Visibility Metadata Relationships Dynamic Triggers • With pseudocode walkthrough Apex DDL • With pseudocode walkthrough Custom Datatypes Summary/Roadmap/Q&A And the Agenda for Today
  • 8. Haripriya Murthy Senior Member of the Technical Staff, Salesforce App Cloud
  • 10. Metadata Relationships Integrate your types into a unified declarative platform
  • 11. RollupOverLookup__mdt ParentObject__c: MD Rel ParentField__c: MD Rel SummarizedObject__c: MD Rel LookupField__c: MD Rel FieldToSummarize__c: MD Rel RollupOperation__c: Picklist Active__c: Checkbox Description__c: LTA Metadata relationships to SObjects Triggerable SObject Types
  • 12. RollupOverLookup__mdt ParentObject__c: MD Rel ParentField__c: MD Rel SummarizedObject__c: MD RelLookupField__c: MD Rel LookupField__c: MD Rel FieldToSummarize__c: MD Rel RollupOperation__c: Picklist Active__c: Checkbox Description__c: LTA Metadata relationships to SObjects Triggerable SObject Types ParentObject__c ParentField__c SummarizedObject__c FieldToSummarize__c RollupOperation__c Contact TotalOppValue__c Opportunity Amount SUM JobListing__c TotalAppliedCandidates__c Candidate__c COUNT
  • 13. Metadata relationships to other types RollupFilter__mdt FilterField__c: MD Rel FilterOperation__c: Picklist Value__c: String Summary__c: MD Rel RollupOverLookup__mdt ParentObject__c: MD Rel ParentField__c: MD Rel SummarizedObject__c: MD RelLookupField__c: MD Rel LookupField__c: MD Rel FieldToSummarize__c: MD Rel RollupOperation__c: Picklist Active__c: Checkbox Description__c: LTA
  • 14. Metadata relationships to other types FilterField__c FilterOperation__c Value__c Summary__c Stage NOT EQUALS Closed Lost TotalAmountByContact__md IsEmployee__c EQUALS False TotalApplicants__md RollupFilter__mdt FilterField__c: MD Rel FilterOperation__c: Picklist Value__c: String Summary__c: MD Rel RollupOverLookup__mdt ParentObject__c: MD Rel ParentField__c: MD Rel SummarizedObject__c: MD Rel LookupField__c: MD Rel FieldToSummarize__c: MD Rel RollupOperation__c: Picklist Active__c: Checkbox Description__c: LTA
  • 15. RollupOverLookup__mdt ParentObject__c: MD Rel ParentField__c: MD Rel SummarizedObject__c: MD Rel LookupField__c: MD Rel FieldToSummarize__c: MD Rel RollupOperation__c: Picklist Active__c: Checkbox Description__c: LTA Metadata relationships to Fields Fields
  • 16. Metadata relationships to other entities Apex Classes Custom metadata type Permsets Static resources
  • 17. Creating a metadata relationship field
  • 18. Metadata relationship in SOQL Access the fields as is select ParentObject__c, ParentField__c from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’;
  • 19. Metadata relationship in SOQL Access the fields as is select ParentObject__c, ParentField__c from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’; Traverse relationship from child select ParentObject__r.Name from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’;
  • 20. Metadata relationship in SOQL Access the fields as is select ParentObject__c, ParentField__c from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’; Traverse relationship from child select ParentObject__r.Name from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’; Filter using relationship select ParentField__c from RollupOverLookup__mdt where developerName = ‘OppExpectedRevenue’ and ParentObject__r.Name = ‘Opportunity’;
  • 21. Dynamic Triggers Customize the record save process
  • 22. CustomField is of type Number? • Non-numeric data rejected CustomField is of type RollupSummary? • On save of children, parents are updated WorkflowRule exists on object? • Should fire when the object saves and filter is matched Standard Metadata Types Custom Metadata Types Metadata Should Affect the Save Process InternationalVatRule applies? • VAT should get added on save “Rollup over Lookup” exists? • On save of children, parents are updated Object-Object mapping exists? • When first object is inserted, transformed second object should be inserted too
  • 23. Step 1: Create a Custom Metadata Type With a Relationship to Triggerable SObject Types Triggerable SObject Types RollupFilter__mdt FilterField__c: MD Rel FilterOperation__c: Picklist Value__c: String Summary__c: MD Rel RollupOverLookup__mdt ParentObject__c: MD Rel ParentField__c: MD Rel SummarizedObject__c: MD Rel LookupField__c: MD Rel FieldToSummarize__c: MD Rel RollupOperation__c: Picklist Active__c: Checkbox Description__c: LTA
  • 24. Step 2: Write a Dynamic Apex Trigger over the Relationship dynamic trigger RecalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c (BEFORE INSERT, BEFORE UPDATE, BEFORE DELETE) { /* … */ }
  • 25. You or an Admin Can Do This Step 3: Populate the Custom Metadata Type ParentObject__c ParentField__c SummarizedObject__c FieldToSummarize__c RollupOperation__c Contact TotalOppValue__c Opportunity Amount SUM JobListing__c TotalAppliedCandidates__c Candidate__c COUNT FilterField__c FilterOperation__c Value__c Summary__c Stage NOT EQUALS Closed Lost TotalAmountByContact__md IsEmployee__c EQUALS False TotalApplicants__md
  • 26. Runtime Example 1 Opportunities End-user inserts some opportunities RollupOverLookup__mdt records with SummarizedObject__c = Opportunity found! RecalcRollupTrigger executes before insert • Trigger.sObjectType = Opportunity.sObjectType • Trigger.customMetadata = [found records of RollupOverLookup__mdt]
  • 27. Runtime Example 2 End-user inserts some contacts No RollupOverLookup__mdt records with SummarizedObject__c = Contact found! RecalcRollupTrigger does not execute Contacts
  • 28. Pseudocode Example dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c (BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) { Schema.SObjectType thisObject = Trigger.sObjectType; RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata; for (RollupOverLookup__mdt summary : summariesOfThisObject) { RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c, Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id]; if (Trigger.isInsert) { SObject[] matchingChildren = Trigger.new; for (RollupFilter__mdt oneFilter : filters) { matchingChildren = FilterUtil.filter(matchingChildren, oneFilter); } SObject[] parents = RollupUtil.getParents( matchingChildren, summary.ParentObject__r.QualifiedApiName, summary.LookupField__r.QualifiedApiName); RollupUtil.adjustParents( parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c, matchingChildren, summary.FieldToSummarize__r.QualifiedApiName); update parents; } … } }
  • 29. Pseudocode Example dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c (BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) { Schema.SObjectType thisObject = Trigger.sObjectType; RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata; for (RollupOverLookup__mdt summary : summariesOfThisObject) { RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c, Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id]; if (Trigger.isInsert) { SObject[] matchingChildren = Trigger.new; for (RollupFilter__mdt oneFilter : filters) { matchingChildren = FilterUtil.filter(matchingChildren, oneFilter); } SObject[] parents = RollupUtil.getParents( matchingChildren, summary.ParentObject__r.QualifiedApiName, summary.LookupField__r.QualifiedApiName); RollupUtil.adjustParents( parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c, matchingChildren, summary.FieldToSummarize__r.QualifiedApiName); update parents; } … } }
  • 30. Pseudocode Example dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c (BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) { Schema.SObjectType thisObject = Trigger.sObjectType; RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata; for (RollupOverLookup__mdt summary : summariesOfThisObject) { RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c, Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id]; if (Trigger.isInsert) { SObject[] matchingChildren = Trigger.new; for (RollupFilter__mdt oneFilter : filters) { matchingChildren = FilterUtil.filter(matchingChildren, oneFilter); } SObject[] parents = RollupUtil.getParents( matchingChildren, summary.ParentObject__r.QualifiedApiName, summary.LookupField__r.QualifiedApiName); RollupUtil.adjustParents( parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c, matchingChildren, summary.FieldToSummarize__r.QualifiedApiName); update parents; } … }
  • 31. Pseudocode Example dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c (BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) { Schema.SObjectType thisObject = Trigger.sObjectType; RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata; for (RollupOverLookup__mdt summary : summariesOfThisObject) { RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c, Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id]; if (Trigger.isInsert) { SObject[] matchingChildren = Trigger.new; for (RollupFilter__mdt oneFilter : filters) { matchingChildren = FilterUtil.filter(matchingChildren, oneFilter); } SObject[] parents = RollupUtil.getParents( matchingChildren, summary.ParentObject__r.QualifiedApiName, summary.LookupField__r.QualifiedApiName); RollupUtil.adjustParents( parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c, matchingChildren, summary.FieldToSummarize__r.QualifiedApiName); update parents; } … } }
  • 32. Pseudocode Example dynamic trigger ReclalcRollupTrigger over RollupOverLookup__mdt.SummarizedObject__c (BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE) { Schema.SObjectType thisObject = Trigger.sObjectType; RollupOverLookup__mdt[] summariesOfThisObject = Trigger.customMetadata; for (RollupOverLookup__mdt summary : summariesOfThisObject) { RollupFilter__mdt[] filters = [SELECT FilterField__r.QualifiedApiName, Operation__c, Value__c FROM RollupFilter__mdt WHERE Summary__c = summary.Id]; if (Trigger.isInsert) { SObject[] matchingChildren = Trigger.new; for (RollupFilter__mdt oneFilter : filters) { matchingChildren = FilterUtil.filter(matchingChildren, oneFilter); } SObject[] parents = RollupUtil.getParents( matchingChildren, summary.ParentObject__r.QualifiedApiName, summary.LookupField__r.QualifiedApiName); RollupUtil.adjustParents( parents, summary.ParentField__r.QualifiedApiName, summary.RollupOperation__c, matchingChildren, summary.FieldToSummarize__r.QualifiedApiName); update parents; } … } }
  • 33. • Lets the platform developer control the save process of Sobjects using your custom metadata types. • Code written by the platform developer will be executed for entities that might not even exist at the time the code was written. • ISVs can package dynamic triggers and the triggers can be used to modify save process of the customer org’s objects that use the platform built by the ISVs. Dynamic triggers
  • 34. Apex DDL Set up metadata natively
  • 35. Create metadata in native apex • Fewer manual install procedures • Easier custom tooling • No callouts required
  • 36. public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child, FieldDefinition summarized, FieldDefinition lookup, PicklistValue op) { MetadataContainer mdc = new MetadataContainer(); insert mdc; FieldDefinition summarizingField = new FieldDefintion(); summarizingField.EntityId = parent.EntityId; summarizingField.DeveloperName = devName; … mdc.addMember(summarizingField); RollupOverLookup__mdt rollup = new RollupOverLookup__mdt(); rollup.ParentObject__c = parent.EntityId; rollup.SummarizedObject__c = child.EntityId; rollup.RollupOperation__c = op; rollup.parentField__r = summarizingField; … mdc.addMember(rollup); mdc.deploy(); } Pseudocode Example
  • 37. Pseudocode Example public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child, FieldDefinition summarized, FieldDefinition lookup, PicklistValue op) { MetadataContainer mdc = new MetadataContainer(); insert mdc; FieldDefinition summarizingField = new FieldDefintion(); summarizingField.EntityId = parent.EntityId; summarizingField.DeveloperName = devName; … mdc.addMember(summarizingField); RollupOverLookup__mdt rollup = new RollupOverLookup__mdt(); rollup.ParentObject__c = parent.EntityId; rollup.ChildObject__c = child.EntityId; rollup.RollupOperation__c = op; rollup.parentField__r = summarizingField; … mdc.addMember(rollup); mdc.deploy(); }
  • 38. public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child, FieldDefinition summarized, FieldDefinition lookup, PicklistValue op) { MetadataContainer mdc = new MetadataContainer(); insert mdc; FieldDefinition summarizingField = new FieldDefintion(); summarizingField.EntityId = parent.EntityId; summarizingField.DeveloperName = devName; … mdc.addMember(summarizingField); RollupOverLookup__mdt rollup = new RollupOverLookup__mdt(); rollup.ParentObject__c = parent.EntityId; rollup.ChildObject__c = child.EntityId; rollup.RollupOperation__c = op; rollup.parentField__r = summarizingField; … mdc.addMember(rollup); mdc.deploy(); } Pseudocode Example
  • 39. public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child, FieldDefinition summarized, FieldDefinition lookup, PicklistValue op) { MetadataContainer mdc = new MetadataContainer(); insert mdc; FieldDefinition summarizingField = new FieldDefintion(); summarizingField.EntityId = parent.EntityId; summarizingField.DeveloperName = devName; … mdc.addMember(summarizingField); RollupOverLookup__mdt rollup = new RollupOverLookup__mdt(); rollup.ParentObject__c = parent.EntityId; rollup.ChildObject__c = child.EntityId; rollup.RollupOperation__c = op; rollup.parentField__r = summarizingField; … mdc.addMember(rollup); mdc.deploy(); } Pseudocode Example
  • 40. public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child, FieldDefinition summarized, FieldDefinition lookup, PicklistValue op) { MetadataContainer mdc = new MetadataContainer(); insert mdc; FieldDefinition summarizingField = new FieldDefintion(); summarizingField.EntityId = parent.EntityId; summarizingField.DeveloperName = devName; … mdc.addMember(summarizingField); RollupOverLookup__mdt rollup = new RollupOverLookup__mdt(); rollup.ParentObject__c = parent.EntityId; rollup.ChildObject__c = child.EntityId; rollup.RollupOperation__c = op; rollup.parentField__r = summarizingField; … mdc.addMember(rollup); mdc.deploy(); } Pseudocode Example
  • 41. public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child, FieldDefinition summarized, FieldDefinition lookup, PicklistValue op) { MetadataContainer mdc = new MetadataContainer(); insert mdc; FieldDefinition summarizingField = new FieldDefintion(); summarizingField.EntityId = parent.EntityId; summarizingField.DeveloperName = devName; … mdc.addMember(summarizingField); RollupOverLookup__mdt rollup = new RollupOverLookup__mdt(); rollup.ParentObject__c = parent.EntityId; rollup.ChildObject__c = child.EntityId; rollup.RollupOperation__c = op; rollup.parentField__r = summarizingField; … mdc.addMember(rollup); mdc.deploy(); } Pseudocode Example
  • 42. public void createRollupField(String devName, EntityDefinition parent, EntityDefinition child, FieldDefinition summarized, FieldDefinition lookup, PicklistValue op) { MetadataContainer mdc = new MetadataContainer(); insert mdc; FieldDefinition summarizingField = new FieldDefintion(); summarizingField.EntityId = parent.EntityId; summarizingField.DeveloperName = devName; … mdc.addMember(summarizingField); RollupOverLookup__mdt rollup = new RollupOverLookup__mdt(); rollup.ParentObject__c = parent.EntityId; rollup.ChildObject__c = child.EntityId; rollup.RollupOperation__c = op; rollup.parentField__r = summarizingField; … mdc.addMember(rollup); mdc.deploy(); } Pseudocode Example
  • 43. Avrom Roy-Faderman Principal Member of the Technical Staff, Salesforce App Cloud
  • 44. Custom Datatypes Create your own meta-schema
  • 45. Custom Datatypes Compound and configurable Custom datatype Column Column Column One or more columns of standard datatypes
  • 46. Custom metadata type Custom Datatypes Compound and configurable Custom datatype Column Column Column Custom Field DefinitionsMD Rel Field Values of this field get auto-populated with fields of the custom datatype
  • 47. Custom metadata type Custom Datatypes Compound and configurable Custom datatype Column Column Column MD Rel Field Field Field Other fields here contain additional metadata relevant to fields of this type
  • 48. RollupOverLookup__mdt Example Custom Datatype RollupOverLookup RollupOverLookup Value__s Fields of type RollupOverLookupParentField__c SummarizedField__c Operation__c …
  • 49. Creating a Field of the Custom Type
  • 51. Our vision: Open up the platform to partners and customers the way the platform opens up apps • Custom metadata types are a first step towards this, providing custom types of metadata with standard: • SDLC • Packaging • Setup UI • Fast runtime access • More features on our roadmap • Metadata relationships for type integration (plus other datatypes!) • Customizable save process via dynamic triggers • Custom tooling and automated setup via Apex DDL • Custom datatypes for fields • Even more stuff in the longer term! Summary
  • 52. Available now Spring ’16 Summer ’16 Winter ’17 Beyond Metadata Relationships Apex DDL Dynamic Triggers Custom Datatypes Extra-super-special safe harbor! Roadmap Pilot GA Pilot GA GA Pilot GA
  • 53. Share Your Feedback, and Win a GoPro! 3 Earn a GoPro prize entry for each completed survey Tap the bell to take a survey2Enroll in a session1