salesforce零基础学习(一百三十一)Validation 一次的bypass设计
本篇参考:
https://admin.salesforce.com/blog/2022/how-i-solved-it-bypass-validation-rules-in-flows
背景:作为系统的全局考虑,我们在设计validation rule / flow / trigger时,往往会使用Hierarchy Custom Setting来通过标签设置白名单,当有数据清洗时,可以只关注于当前的指定字段,指定逻辑的清洗。

简单的validation rule作为一个demo:Account表有一个自定义字段 SLAExpirationDate__c,需要这个字段超过custom metadata所要求的最低的默认值。

效果展示:

这种设计在实际项目中很正常,考虑到validation rule创建以后,历史数据可能有脏数据,有些可以基于逻辑进行数据清洗,有些只能数据owner进行手动操作。
我们在项目中除了本表操作以外,还可能涉及到关联表操作更新父表的情况,举个例子,当创建Event / Task / Opportunity等数据情况下,某些场景可能需要更新到Account,比如某些场景下,针对Report使用可能需要记录一些时间戳。这里进行一个简单的demo。针对Task,Task针对Account创建的第一条数据,记录时间戳到Account自定义字段: Task_First_Created_Date__c。简单的flow操作以及效果展示。

现在问题在于,针对Account的脏数据,如果SLA Expiration Date有问题,就会导致当创建Task时,会更新Account然后报错。针对创建Task的用户不一定是Account的Owner,也可能是Account Team成员,他们不希望创建Task时,因为一个仅用于时间戳的字段(仅report用)而影响到了他们实际的业务流程或者销售流程,所以我们在实际项目中还需要考虑 onetime bypass的情况,即针对Task创建更新到Account数据,不应该触发Validation Rule,只有针对Account自身数据的编辑,才需要遵循。

针对这种情况,目前想到两种可行的方案。
1. 基于Hierarchy Custom Setting,先将当前User的数据插入进去,设置Disable_Validation_Rule__c为true,当流程结束以后,再将当前user的当前记录删除。以下是效果展示。

2. 基于参考链接中的方式,理解起来也很容易,我们可以基于3步走。
1. 目标表创建两个字段,一个Datetime类型,设置默认值为系统当前日期,一个Formula checkbox类型,使用刚创建的Datetime类型变量减去(当前日期减去几秒时间),如果结果大于0,证明允许bypass,值为true,否则不允许bypass,值为false。
Note:之所以这么设计是当前的Datetime字段,只有初始化是当前值,之后使用就会小于0,则需要走validation rule,当其他的关联表需要bypass时,设置这个Datetime字段为当前时间。之所以减去几秒时间,代表当前关联表transaction操作时间,参考链接中写的是减去5秒,实际的transaction很难超过这个时间,通常都是毫秒级别。
2. Validation Rule进行增强,只有这个formula为false才会要求执行vlaidation rule,如果为true,则bypass跳过validation。
3. Flow进行增强,设置Datetime类型为当前时间。
效果如下方gif所示。

这两种方式优缺点:
方式1优点:
- 更精确操作,避免几秒的误差导致用户误操作;
- 可以适用于批量数据的操作。
方式1缺点:
- 尽管Custom Setting属于数据层面,鉴于hierarchy custom setting的特殊性,可能出现未知的错误或者情况。频繁的插入和删除需要进行深度测试。
方式2优点:
- 简单操作并且逻辑易于理解。
方式2缺点:
- 几秒的时间不适用于批量数据的操作,容易出现偶发性错误风险,不够精确。
总结:本篇主要介绍了针对 validation rule的onetime bypass的两种方案,篇中的两种思路仅抛砖引玉,方案2感谢原国外作者的思路。篇中有错误地方欢迎指出,有不懂欢迎留言。有更好的实现方式欢迎讨论。
salesforce零基础学习(一百三十一)Validation 一次的bypass设计的更多相关文章
- salesforce 零基础学习(三十一)关于LookUp字段点击Save时的Validation
今天在群里大概遇到了这样一个问题,明明这个User存在,但是save的时候提示信息说Value不存在,大概的意思如下图所示,目前认为这种问题常见的可能情况有两种. 一.此字段设置Validation ...
- salesforce 零基础学习(四十一)Group
salesforce中,有的时候我们需要将一组用户放进一个Group,用来实现以下主要功能: 1.通过sharing rule设置默认的共享访问; 2.将记录分享给其他用户; 3.指定同步的联系人,这 ...
- salesforce 零基础学习(三十九) soql函数以及常量
在salesforce中,我们做SOQL查询时,往往需要用到计算式,比如求和,求平均值,或者过滤数据时,往往需要通过时间日期过滤,SOQL已经封装了很多的函数,可以更加方便我们的sql查询而不需要自己 ...
- salesforce 零基础学习(三十八)Translate 的使用(国际化处理)
本篇参考:http://resources.docs.salesforce.com/200/17/en-us/sfdc/pdf/salesforce_workbench_cheatsheet.pdf ...
- salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)
上一篇内容是通过Process Builder和Approval Processes实现锁定记录的功能,有的时候,往往锁定一条记录需要很多的限制条件,如果通过Approval Processes的条件 ...
- salesforce 零基础学习(六十一)apex:component简单使用以及图片轮转播放的实现
有的时候,我们项目有可能有类似需求:做一个简单的图像轮转播放功能,不同的VF页面调用可以显示不同的图片以及不同的图片描述.这种情况,如果在每个页面单独处理相关的图像轮转播放则显得代码特别冗余,此种情况 ...
- salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)
此篇请参看:https://resources.docs.salesforce.com/202/latest/en-us/sfdc/pdf/salesforce_developer_environme ...
- salesforce 零基础学习(三十七) DML及Database方法简单描述
在apex中通过soql查询可以使用两种方式,使用DML语句或者使用Database的方法. 使用DML语句和使用Database类的方法对于我们来说用的都很多,并且都很常见.对于数据库常见的操作:增 ...
- salesforce 零基础学习(三十五) 通过Process Builder和Approval Processes锁定记录(Lock Record)
有的时候我们可能有这样的需求,当某个字段为特定的值情况下,便锁定此条记录,仅允许Profile为System Admin的用户修改或者解锁,其他的用户只能查看此条记录,不能修改此条记录,这种情况下我们 ...
- salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesforce
本篇参考Trail教程: https://developer.salesforce.com/trailhead/force_com_dev_intermediate/apex_integration_ ...
随机推荐
- CF1477E&大户爱的送分题题解
CF1477E&大户爱的送分题题解 (CF1477E为我出的校内模拟赛的一道题--<大户爱的送分题>的待修版本) 大户爱的送分题 文件名OhtoAiFirst.cpp/.in/.o ...
- shell编程-发送消息
需求:利用 Linux 自带的 mesg 和 write 工具,编写一个向用户快速发送消息的脚本,输入用户名作为第一个参数,消息内容为第二个参数.脚本需要检测用户是否登录,是否打开消息功能,以及当前发 ...
- 现代 C++ 性能飞跃之:移动语义
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/Xd_FwT8E8Yx9Vnb64h6C8w 带给现代 C++ 性能 ...
- 从0搭建Vue3组件库(十):如何搭建一个 Cli 脚手架
本篇文章将实现一个名为create-easyest脚手架的开发,只需一个命令npm init easyest就可以将整个组件库开发框架拉到本地. 创建 Cli 包 首先,我们在 packages 目录 ...
- NOIP模拟测试A3 赛后总结
T1 谜之阶乘 可以发现题目要求我们求的实际上是若干个连续整数 \(c_i\) ,使得 \(\displaystyle \prod c_i = n\),通过打表可以发现这些连续整数的长度 \(d\) ...
- 记一次 .NET 某药材管理系统 卡死分析
一:背景 1. 讲故事 前段时间有位朋友找到我,说他们在查询报表的时候发现程序的稳定性会受到影响,但服务器的内存,CPU都是正常的,让我帮忙看下怎么回事,问了下程序的稳定性指的是什么?指的是卡死,那既 ...
- 基于C# 开发的SOL SERVER 操作数据库类(SQLHelp)
说明:以下是我近两年年来开发中最常用的C#操作sql server数据库访问类,对初学者非常有用,容易扩展,支持多库操作,多研究研究,有什么问题欢迎留言 当前环境为 C# .NET CORE 3.0 ...
- 【小小demo】Springboot + Vue 增删改查
vue-table-ui 该工程提供的是 一个简单的 Vue + Element-UI 的表格,增删改查操作. 工程代码在最下面. 环境 jdk1.8 idea maven springboot 2. ...
- Map集合_HashMap_TreeMap_等_小记
Map是一种依照键值对数据存储元素的容器. Map中的元素是两个对象,一个对象作为键,一个对象作为值.一个键(key)和它对应的值构成map集合中的一个元素.Map集合的数据结构只跟键有关,键不可以重 ...
- 因为一条DDL,差点搞挂整个系统,这次真的长了教训
有一次在线上提了一个sql变更,就是下面这条, -- 修改字段的数据类型由varchar(500)变更为text ALTER TABLE t MODIFY COLUMN name text; 提完之后 ...