salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)
上一篇内容是通过Process Builder和Approval Processes实现锁定记录的功能,有的时候,往往锁定一条记录需要很多的限制条件,如果通过Approval Processes的条件判断写起来可能很麻烦,有些逻辑通过Apex写起来很容易,此篇内容为通过Process Builder 和Apex代码实现锁定记录。
需求:对Opportunity表进行判断是否加锁或者解锁。当Delivery/Installation Status这一项的值为'Completed'情况下加锁,为其他的值情况下,如果原来记录加锁,则解锁。
一.获取允许在apex中使用Lock 和UnLock记录的权限:Setup->Build->Create->Workflow&Approvals->Process Automation Settings。点进去将Enable record locking and unlocking in Apex这一项选中。

二.Apex代码实现加锁解锁
写代码之前我们需要先了解一些基础知识。当我们使用Process Builder选择Action为Apex的时候,我们需要选择相关Action执行的类,此类中的方法必须要是InvocableMethod的一个方法,即需要添加@InvocableMethod注解。一个类中仅允许有一个此注解的方法。
加锁的类如下所示:
public class RecordLockController {
@InvocableMethod(label='Lock Opportunities' description='Lock opportunities and return the record ids')
public static List<Id> lockRecord(List<Id> opportunityIds) {
system.debug('=========opportunityIds=======' + opportunityIds);
system.debug('---------userName-------' + UserInfo.getUserName());
List<ID> alreadyLockedList = new List<ID>();
Map<Id,Boolean> isLockedMap = Approval.isLocked(opportunityIds);
for(Id currentOpportunityId : opportunityIds) {
Boolean isCurrentOpportunityLocked = isLockedMap.get(currentOpportunityId) == null ? false : isLockedMap.get(currentOpportunityId);
if(!isCurrentOpportunityLocked) {
Approval.LockResult lockResult = Approval.lock(currentOpportunityId);
if(lockResult.isSuccess()) {
alreadyLockedList.add(currentOpportunityId);
} else {
for(Database.Error error : lockResult.getErrors()) {
System.debug('error message : ' + error.getMessage());
}
}
}
}
system.debug(alreadyLockedList);
return alreadyLockedList;
}
}
解锁的类如下所示
public class UnLockRecordController {
@InvocableMethod(label='UnLock Opportunities' description='UnLock Opportunities and return the record ids')
public static List<ID> unlockRecords(List<ID> opportunityIds) {
system.debug('=========opportunityIds=======' + opportunityIds);
system.debug('---------userName-------' + UserInfo.getUserName());
List<ID> alreadyUnLockedList = new List<ID>();
Map<Id,Boolean> isLockedMap = Approval.isLocked(opportunityIds);
for(Id currentOpportunityId : opportunityIds) {
Boolean isCurrentOpportunityLocked = isLockedMap.get(currentOpportunityId) == null ? false : isLockedMap.get(currentOpportunityId);
if(isCurrentOpportunityLocked) {
Approval.UnLockResult unLockResult = Approval.unlock(currentOpportunityId);
if(unLockResult.isSuccess()) {
alreadyUnLockedList.add(currentOpportunityId);
} else {
for(Database.Error error : unLockResult.getErrors()) {
System.debug('error message : ' + error.getMessage());
}
}
}
}
system.debug(alreadyUnLockedList);
return alreadyUnLockedList;
}
}
三.设置Process Builder
1.Setup->Build->Create->Workflow&Approvals->Process Builder.点击进入后选择右上方的new

2.设置相关信息名称

3.选择要操作的Object,这里选择Opportunity

4.设置锁定的条件

5.设置加锁条件所走的Action,我们在Action Type选择Apex代码,并选择相关操作的类,并且要传递参数,程序中传的是ID,这里我们选择Opportunity的ID

6.在FALSE下添加解锁条件

7.添加解锁的Action,选择Apex,选择执行此Action的Apex Class,添加参数,点击save以后点击右上方activate将其激活。

总结:此篇内容仅仅通过很简单的业务逻辑进行加锁解锁,如果业务逻辑复杂,可以自行添加,如果内容有不对的地方欢迎指正,如果有不懂的地方欢迎留言。
如果想通过Permission Set来判断是否可以加锁解锁,也可以设置一个自定义的button,button调用apex代码,代码中通过permission set来判断是否拥有加锁解锁权限,如果拥有此权限则可以通过Approval的lock或者unlock方法进行操作。
salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)的更多相关文章
- salesforce 零基础学习(十六)Validation Rules & Date/time
上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...
- salesforce零基础学习(九十六)Platform Event浅谈
本篇参考:https://developer.salesforce.com/blogs/2018/07/which-streaming-event-do-i-use.html https://trai ...
- salesforce零基础学习(九十六)项目中的零碎知识点小总结(四)
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.216.0.apexcode.meta/apexcode/apex_classes_ke ...
- salesforce 零基础学习(十九)Permission sets 讲解及设置
Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...
- salesforce 零基础学习(十八)WorkFlow介绍及用法
说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...
- salesforce零基础学习(一百零五)Change Data Capture
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
- salesforce 零基础学习(三十五) 通过Process Builder和Approval Processes锁定记录(Lock Record)
有的时候我们可能有这样的需求,当某个字段为特定的值情况下,便锁定此条记录,仅允许Profile为System Admin的用户修改或者解锁,其他的用户只能查看此条记录,不能修改此条记录,这种情况下我们 ...
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...
随机推荐
- 【洛谷P2737】Beef McNuggets
首先有这样一个结论:若p,q为自然数,且gcd(p,q)=1,那么px+qy不能表示的最大数为pq-p-q 那么本题中p,q均取决于最大的两个数,不妨取256,那么上界为256^2-256*2 之后就 ...
- 【洛谷P3076】Taxi
这道题值得好好想一会 我们通过对一些小数据的手算,以及对于每段路程的拆分,可以发现: 1.每个st对应的ed这段路程无论如何都要算上 2.额外还要计算的一段路程,就是"切换"费用 ...
- hadoop搭建初步总结
1.安装JDK1.1上传运用软件FileZilla,将windows上的jdk压缩包放到linux的root目录下 1.2解压jdk #创建文件夹 mkdir /usr/java(不要挂在在" ...
- IOS学习笔记 O1
第一章 Objective-C语言基础 一.OC语言与C语言的比较 C语言是一门面向过程的语言,而OC则是一门面向对象的语言. C语言文件默认保存格式为.c,OC语言默认保存格式为.m,两者头文件格式 ...
- Java程序,猜大小游戏
一个骰子,通常有1.2.3.4.5.6等6种点数.我们将1.2.3记作“小”,将4.5.6记作“大”.猜中显示“猜对了”,猜错记作“猜错了”之类的字样.本程序可以用Java实现. import jav ...
- JS与Jquery学习笔记(一)
一. Javascript的作用域,大坑! 1. JS作用域奇怪表现之一:预编译 在其他的语言里我们如果使用一个变量在声明其之前,是会报错的,但是在js里面却不一定,比如: function f1() ...
- PERL/LEX/YACC技术实现文本解析--XML解析
继周六的p_enum.pl后,再来一篇说说我用perl做的lex,yacc工具.之前说了,我学习lex和yacc的最初动机是为了做个C语言解释器的SHELL:但后来工作中的实际需要也是制作perl版l ...
- SIFT中的尺度空间和传统图像金字塔
SIFT中的尺度空间和传统图像金字塔 http://www.zhizhihu.com/html/y2010/2146.html 最近自己混淆了好多概念,一边弄明白的同时,也做了一些记录,分享一下.最近 ...
- C# final project
Problem Statement You are tasked with developing a task manager. The task manager will allow people ...
- 如何运用boolean跳出循环
用布尔类型跳出循环:1.首先申明一个布尔变量:boolean y =false:申明位置在:方法内,循环外:public void s(){//在此申明布尔变量:for(){}}if(!y){}2,进 ...