salesforce零基础学习(一百二十七)Custom Metadata Type 篇二
本篇参考:
salesforce零基础学习(一百一十一)custom metadata type数据获取方式更新
https://trailhead.salesforce.com/content/learn/modules/custom_metadata_types_dec/cmt_overview
我们在之前的篇中简单描述了 custom metadata type的使用,最开始的 custom metadata type是来建议取代 list custom setting,好处是可以基于metadata进行部署,不用像custom setting基于数据方式,容易出现漏部署情况,所以基于当时的版本来说, custom metadata type相对 list custom setting来说好处是基于metadata部署避免遗漏。
随着 custom metadata type的不断升级,目前增加了很多吸引人的点,主要是针对 Metadata Relationship字段类型的展开,接下来我们看一下这个新的类型可以实现的内容和场景。
一. Metadata Relationship类型
当我们在 custom metadata type创建字段时,目前字段类型增加了Metadata Relationship类型,此种类型可以设置两类的关联关系。
关联到其他的custom metadata type,比如metadata type中维护省和市的信息,可以在市的metadata type中关联到省的metadata type。
关联到salesforce标准的表或者自定义表/字段的实例中,比如关联到 Account表的 Industry字段(场景可以基于配置方式设置 default value)。

当我们点击此类型创建的下一步,会让你选择系统已经存在的 custom metadata type还是选择 Entity Definition。需要注意的是,如果你的系统曾经已经创建过 Entity Definition,那样以后的步骤中,还会再列表中可以选择 Field Definition以及Entity Particle,这个在下面图中会有涉及。

demo中会创建这两种类型,其中关联自定义 metadata type的创建步骤不在此处罗列,主要讲一下 Entity Definition相关的关联,当我们创建了关联到 Entity Definition的字段以后,我们继续创建 Metadata Relationship类型的字段,就可以看到下图内容。其中:
- Field Definition:关联的是上述选定的表的标准或者自定义字段
- Entity Particle:关联的是上述选定的表的标准字段中的复合类型字段或者地理信息类型字段。

当我们选择 Field Definition类型以后,点击下一步会选择 controling field,这样就会实现当选择某个表信息以后,就可以选择到当前这个表的字段。

当我们创建表相关的表数据以后,我们就可以为custom metadata type设置数据,下图demo中维护了Account Customer Priority(自定义字段)默认值的一条数据,我们可以看到当Object Name选择了 Account以后,Field Name就可以自动的基于Account(作为 controling field)选择到 Account表中的字段。

这里针对父子的场景不做一步一步处理,感兴趣的可以基于下图进行数据的创建。

二. Custom Metadata Type使用场景介绍
1. 字段default value: 我们在项目上,有时需要在字段级别或者后台代码设置字段的默认值。原有方式是可以基于类型进行设置,比如picklist可以通过选择,其他类型就在 Default Value处设置初始值。apex端设置可以通过Custom Label或者hardcode方式写。除此以外,我们建议使用 Custom Metadata Type来统一维护初始值设置。UI方面可以基于指定的写法进行设置,格式如下图所示。

2. 用于validation rule / formula / process builder:这里只针对validation rule进行举例,写法相同。举个例子,当系统validation rule需要配置的规则用于很多表,并且这个值可能是动态修改的,我们不能每次变更都修改所引用到的所有的validation rule,这时我们可以基于custom metadata type进行配置来更好的可配置化管理。

三. 通过apex class获取 custom metadata type
1. 获取 field Definition类型的metadata type数据
基于 apex端,我们可以通过基于metadata的方式,或者基于SOQL搜索方式获取到这条数据,然后获取这条数据的信息,下方的demo仅供参考。
1). 通过 custom metadata type的getInstance方式获取。此方法前提是你需要了解到这个metadata type的 Name信息。
Default_Value__mdt defaultValue = Default_Value__mdt.getInstance('Account_Customer_Priority_Default');
system.debug('*** default value: ' + defaultValue.Default_Value__c);
2). 通过表字段的名称获取(这里代码可以进行优化,目前demo中的场景为有且仅有一条配置)。这里我们通过 FieldDefinition获取了当前表的 DurableId,原因是custom metadata type返回的 Field Definition是 DurableId,这个表会在下一篇博客做一些介绍。
List<Default_Value__mdt> defaultValueList = Default_Value__mdt.getAll().values(); Default_Value__mdt defaultValue; List<FieldDefinition> fieldDefinitionList = [SELECT Id, DeveloperName, DurableId
FROM FieldDefinition
WHERE DeveloperName = 'Customer_Priority'
AND EntityDefinition.QualifiedApiName = 'Account'];
//TODO 实际项目中禁止此种写法,需要非空判断
String customerPriorityDurableId = fieldDefinitionList.get(0).DurableId; for(Default_Value__mdt valueItem : defaultValueList) {
if('Account'.equalsIgnorecase(valueItem.Object_Name__c)
&& customerPriorityDurableId.equalsIgnorecase(valueItem.Field_Name__c)) {
defaultValue = valueItem;
}
} if(defaultValue != null) {
system.debug('*** default value : ' + defaultValue.Default_Value__c);
}
2. 获取到关联其他metadata type的数据
1). 通过 custom metadata type的getInstance方式获取,方式同上,不做说明。
2) 通过关联父表的数据的developerName进行获取(这里代码可以进行优化,目前demo中的场景为有且仅有一条配置)。
List<Default_Value__mdt> defaultValueList = Default_Value__mdt.getAll().values();
Default_Value__mdt targetDefaultValue;
for(Default_Value__mdt valueItem : defaultValueList) {
if(String.isNotBlank(valueItem.Parent_Metadata_Type__c)
&& 'test_parent'.equalsIgnorecase(valueItem.Parent_Metadata_Type__r.DeveloperName)) {
targetDefaultValue = valueItem;
}
}
system.debug(JSON.serialize(targetDefaultValue));
我们看一下目标数据通过 getAll返回的JSON结构,我们会发现如果有负责结构内容,会将复结构的信息同样返回。
{
"MasterLabel": "TEST_RELATION_WITH_PARENT",
"NamespacePrefix": null,
"QualifiedApiName": "TEST_RELATION_WITH_PARENT",
"Parent_Metadata_Type__c": "m005g000002FMry",
"Language": "zh_CN",
"attributes": {
"type": "Default_Value__mdt",
"url": "/services/data/v57.0/sobjects/Default_Value__mdt/m025g000000rtgz"
},
"DeveloperName": "TEST_RELATION_WITH_PARENT",
"Id": "m025g000000rtgz",
"Parent_Metadata_Type__r": {
"attributes": {
"type": "Parent_Metadata_Type__mdt"
},
"DeveloperName": "test_parent"
},
"Field_Name__c": null,
"Object_Name__c": null,
"Label": "TEST_RELATION_WITH_PARENT",
"SystemModstamp": "2023-03-15T10:00:03.000+0000",
"Default_Value__c": null
}
总结:本篇主要是介绍了一下 metadata type除取代list custom setting以外的其他的使用场景以及使用apex获取的方式。篇中的demo也仅用于获取数据用,对判断,逻辑,可行性操作都可以进一步优化。篇中有错误地方欢迎指出,有不懂欢迎留言。
salesforce零基础学习(一百二十七)Custom Metadata Type 篇二的更多相关文章
- salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值
注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...
- salesforce 零基础学习(六十七)SingleEmailMessage 那点事
在salesforce开发中,发送邮件是一个很常见的功能.比如在进入审批流以后的通过和拒绝的操作需要发送邮件给记录的owner,和其他系统交互以后更改了某些状态通知相关的User或者Contact等等 ...
- salesforce零基础学习(九十七)Big Object
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.224.0.bigobjects.meta/bigobjects/async_query ...
- salesforce 零基础学习(四十七) 数据加密简单介绍
对于一个项目来说,除了稳定性以及健壮性以外,还需要有较好的安全性,此篇博客简单描述salesforce中关于安全性的一点小知识,特别感谢公司中的nate大神和鹏哥让我学到了新得知识. 项目简单背景: ...
- salesforce 零基础学习(三十七) DML及Database方法简单描述
在apex中通过soql查询可以使用两种方式,使用DML语句或者使用Database的方法. 使用DML语句和使用Database类的方法对于我们来说用的都很多,并且都很常见.对于数据库常见的操作:增 ...
- salesforce零基础学习(七十七)队列的实现以及应用
队列和栈简单的区别为栈是后进先出,队列是先进先出.队列也是特殊的线性表,所以队列也分为顺序存储结构和链式存储结构.本篇主要描述顺序存储结构. 我们先假定一个队列里有5个元素,当我们添加新元素时,添加到 ...
- salesforce零基础学习(九十七)Event / Task 针对WhoId的浅谈
我们在Sales Cloud中经常会创建顾客,如果针对TO C业务,会启用个人顾客,比如针对车企行业,有一些场景是需要卖给个人的,而不只是企业采购.当通过打电话或者其他的场景有潜在客户并且转换成客户以 ...
- salesforce 零基础学习(五十七)Test 类中创建TestUser帮助类
我们写Test Class的时候往往都需要指定一个uesr去run test method. TestUserHelper类如下: public class TestUserHelper { publ ...
- salesforce零基础学习(八十四)配置篇: 自定义你的home page layout
当我们进入salesforce系统或者切换app后,默认第一个看到的就是home页面.home页面简单的来说可以包括左侧(narrow component)和右侧(wide component)两部分 ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
随机推荐
- windows下解决mysql5中文乱码的问题
1.问题描述:一开始无论是在命令行,还是在mysql的客户端输入中文都会出现 "???" 问题之类的乱码问题: 2.解决办法: 1)cmd 进入mysql ,命令mysql -ur ...
- nacos之服务注册、发现及维持心跳
注册服务(增加健康检查) 服务发现(默认15s没有心跳请求,则自动注销服务) 心跳(维持服务运行状态) 参数说明 serviceName:服务名称 beat:服务的详细信息 ip 端口等,json ...
- Study python_01
Python历史事件 1989 年 --- 荷兰人吉多·范罗苏姆决心开发一个新的脚本解释程序: 1991 年 --- 第一个用C语言实现的Python编译器诞生,Python 的代码对外公布,版本为 ...
- Git配置新学
Git中的AutoCRLF与SafeCRLF换行符问题 https://zhuanlan.zhihu.com/p/380574688 https://xiaozhuanlan.com/topic/40 ...
- A Super Hero
DP? QwQ这题似乎不能直接贪心2333-- 阶段 很明显的阶段性,\(n\)关便为\(n\)个阶段, 状态 分好阶段后,容易构造出状态的表达: \(f[i,j]\)表示Ma5termind在最开始 ...
- hive:使用concat_ws实现 array转string案例
concat_ws(',',collect_set(if(step_name <> '',step_name,null))) AS step_names,
- nkIO方法
import java.util.*; public class Main{ public static void main(String args[]){ Scanner sc = new Scan ...
- Django框架搭建web项目(一)
建议查看官方文档:https://docs.djangoproject.com/zh-hans/4.0/intro/tutorial01/ 1.本地安装python环境(略) 2.本地安装Django ...
- SpringBoot加载相关注解
springBoot加载 @Configuration 表明该类是一个配置类常常配合@Bean使用,让容器管理对象 @Configuration(proxyBeanMethods = true) pr ...
- LeetCode刷题感想之滑动窗口
发现滑动窗口也是一种经典解题思路,这一篇简单聊一下滑动窗口. 通常在碰到求XX子数组,子字符串,连续XX等题眼,可以考试用滑动窗口的思路来解决问题. 窗口的类型有几种: 1. 固定长度的窗口. 2. ...