salesforce零基础学习(三十六)通过processbuilder以及apex代码实现锁定记录(lockrecord)

zero.zhang zero.zhang     2022-07-28     448

关键词:

上一篇内容是通过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注解。一个类中仅允许有一个此注解的方法。

加锁的类如下所示:

 1 public class RecordLockController {
 2     @InvocableMethod(label='Lock Opportunities' description='Lock opportunities and return the record ids') 
 3     public static List<Id> lockRecord(List<Id> opportunityIds) {
 4         system.debug('=========opportunityIds=======' + opportunityIds);
 5         system.debug('---------userName-------' + UserInfo.getUserName());
 6         List<ID> alreadyLockedList = new List<ID>();
 7         Map<Id,Boolean> isLockedMap = Approval.isLocked(opportunityIds);
 8         for(Id currentOpportunityId : opportunityIds) {
 9             Boolean isCurrentOpportunityLocked = isLockedMap.get(currentOpportunityId) == null ? false : isLockedMap.get(currentOpportunityId);
10             if(!isCurrentOpportunityLocked) {
11                 Approval.LockResult lockResult = Approval.lock(currentOpportunityId);
12                 if(lockResult.isSuccess()) {
13                     alreadyLockedList.add(currentOpportunityId);
14                 } else {
15                     for(Database.Error error : lockResult.getErrors()) {
16                         System.debug('error message : ' + error.getMessage());
17                     }
18                 }
19             }
20         }
21         system.debug(alreadyLockedList);
22         return alreadyLockedList;
23     }
24     
25     
26 }

解锁的类如下所示

 1 public class UnLockRecordController {
 2     @InvocableMethod(label='UnLock Opportunities' description='UnLock Opportunities and return the record ids')
 3     public static List<ID> unlockRecords(List<ID> opportunityIds) {
 4         system.debug('=========opportunityIds=======' + opportunityIds);
 5         system.debug('---------userName-------' + UserInfo.getUserName());
 6         List<ID> alreadyUnLockedList = new List<ID>();
 7         Map<Id,Boolean> isLockedMap = Approval.isLocked(opportunityIds);
 8         for(Id currentOpportunityId : opportunityIds) {
 9             Boolean isCurrentOpportunityLocked = isLockedMap.get(currentOpportunityId) == null ? false : isLockedMap.get(currentOpportunityId);
10             if(isCurrentOpportunityLocked) {
11                 Approval.UnLockResult unLockResult = Approval.unlock(currentOpportunityId);
12                 if(unLockResult.isSuccess()) {
13                     alreadyUnLockedList.add(currentOpportunityId);
14                 } else {
15                     for(Database.Error error : unLockResult.getErrors()) {
16                         System.debug('error message : ' + error.getMessage());
17                     }
18                 }
19             }
20         }
21         system.debug(alreadyUnLockedList);
22         return alreadyUnLockedList;
23     }
24 }

三.设置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零基础学习(八十六)ajaxtoolkit(vf页面中使用及javascriptaction使用)

AjaxToolkit参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pdf/apex_ajax.pdf在项目中,我们有时会在自定义button或者action上使用javascript进行一些SOQL或者DML操作处理;有时会在VF页面中获取相关数据进行逻辑处理,或者进行简... 查看详情

《c#零基础入门之百识百例》(三十六)方法重载--回文数

C#零基础入门函数--方法返回值前言一,方法重载定义1.1方法的签名信息1.2方法重载示例二,方法重载调用2.1解析步骤三,实例练习--回文数3.1题目描述3.2问题分析3.3参考代码前言本文属于C#零基础入门之百识百例系列文章。此系... 查看详情

salesforce零基础学习(五十二)trigger使用篇

...er中写的代码分到Handler中,代码更加清晰。十七篇链接:salesforce零基础学习(十七)Trigger用法有的时候对于sObject的trigger处理复杂的情况下,比如一个sObject的beforeupdate要实现功能1,2..... 查看详情

零基础学java—stringbuilder类(三十六)

【零基础学Java】—StringBuilder的原理(三十六)一、String类字符串是常量,他们的值在创建之后不能更改字符串的底层是一个被final修饰的数组,不能改变,是一个常量privatefinalbyte[]value;进行字符串的相加,... 查看详情

salesforce零基础学习(五十五)java通过soap方式定时访问某个文件然后插入到sobject中

...码:https://github.com/zhangyueqidlmu/SOAP-Access-SFDC.git项目背景:salesforce端相关数据需要其他系统提供,其他系统可以提供相关数据的CSV文件。使用SOAP方式java代码定时将文件读取解析并插入到salesforce相关数据表中。项目实现功能:固... 查看详情

salesforce零基础学习(八十七)apex中picklist类型通过control字段值获取dependentlist值(代码片段)

注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-from.html群里面有个小伙伴问了一个关于两个有Dependence关系的Picklist字段如何在Apex中通过control字段的值获取到Dependence字段的值,针... 查看详情

salesforce零基础学习(五十三)多个文件生成一个zip文件(使用git上封装的代码)

此篇参考git代码:https://github.com/pdalcol/Zippex学习salesforce可以访问一个朋友的网站:https://www.xgeek.net首先感谢git上提供代码的大神,学到了新的知识。salesforce不像java提供生成Zip文件的类库,通过git上copy的代码可以实现此功能,... 查看详情

salesforce零基础学习(四十三)运算取余

工作中遇到一个简单的小问题,判断两个数是否整除,如果不整除,获取相关的余数。习惯java的我毫不犹豫的写下了代码publicBooleanisDivisibility(Integerdividend,Integerdivider){returndividend%divider==0;}提交代码发现竟然提交不上??后来查... 查看详情

salesforce零基础学习(八十四)配置篇:自定义你的homepagelayout

当我们进入salesforce系统或者切换app后,默认第一个看到的就是home页面。home页面简单的来说可以包括左侧(narrowcomponent)和右侧(widecomponent)两部分。 左侧包含RecentView,CustomLink,CreateNew等快捷入口等组件,右侧包括tasks,itemtoapproval,... 查看详情

salesforce零基础学习(八十九)使用inputtype=file以及remoteaction方式上传附件(代码片段)

在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取。salesforce零基础学习(二十四)解析csv格式内容中有类似的使用此标签进行解析附件内容,后台只要声明String类型变量用来存储附件名称,Blob... 查看详情

salesforce零基础开发入门学习salesforce功能介绍,ide配置以及资源下载

...www.cnblogs.com/zero-zyq/p/5275134.html目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少。上个月末跳槽去了新公司,主要做的就是salesforce,不过当时想要看一些相关资料确实比较难。为了避免想要零基础学习的人... 查看详情

《c#零基础入门之百识百例》(三十八)常用方法--math类

C#零基础入门函数--Math类常用方法前言一,基础数值二,三种取整三,指数对数平方根四,三角函数前言本文属于C#零基础入门之百识百例系列文章。此系列文章旨在为学习C#语言的童鞋提供一套系统的学习路径。此系列文章都会... 查看详情

wpf学习第三十六章样式基础(代码片段)

原文:【WPF学习】第三十六章样式基础  前面三章介绍了WPF资源系统,使用资源可在一个地方定义对象而在整个标记中重用他们。尽管可使用资源存储各种对象,但使用资源最常见的原因之一是通过他们的保存样式。  样式... 查看详情

salesforce零基础学习(四十四)实现checkbox列表简单过滤功能

现在做的项目代码是原来其他公司做的,要在原来基础上业务进行适当调整加上一些CR,其中有一个需要调整的需求如下:原来使用apex:selectCheckboxes封装了一个checkbox列表,因为数据太多导致显示起来比较丑,用户希望改进一下UI... 查看详情

开发零基础怎么学习salesforce开发知识

学习Salesforce开发,最好有一定的Java基础,Salesforce的Apex语言与Java非常相似,而且会简单一些,平台上面有很多集成化的东西,不需要开发,可以直接拿来用。如果有Java基础的话,会非常容易上手。你如果英语好的,其实可以去... 查看详情

《c#零基础入门之百识百例》(三十一)方法定义--猜数游戏

C#零基础入门函数--方法的介绍和使用前言一,方法介绍1.1函数和方法1.2方法的定义1.3代码示例:求和二,实例练习--猜数游戏2.1题目描述2.2问题分析2.3参考代码前言本文属于C#零基础入门之百识百例系列文章。此系列文章旨在为... 查看详情

salesforce零基础学习(八十一)更改标准字段的label名称(admin)

我们在开发中往往需要考虑国际化功能,salesforce提供了国际化功能,在search部分搜索translate,便可以找到translate部分,从而对需要的进行translate。比如picklistvalues的中英文,字段标题的中英文翻译等等 翻译部分有一项可以设... 查看详情

salesforce零基础学习(六十)wizard样式创建数据

项目中表之间关联关系特别多,比如三个表中A,B,C C作为主表,A,B作为从表,有时候C表需要创建数据时,同时需要创建A,B两个表的数据,这种情况下,使用Wizard样式会更加友好。以Goods__c表和Goods_Vendor__c表为例,Goods__c为主... 查看详情