本篇参考:

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设计的更多相关文章

  1. salesforce 零基础学习(三十一)关于LookUp字段点击Save时的Validation

    今天在群里大概遇到了这样一个问题,明明这个User存在,但是save的时候提示信息说Value不存在,大概的意思如下图所示,目前认为这种问题常见的可能情况有两种. 一.此字段设置Validation ...

  2. salesforce 零基础学习(四十一)Group

    salesforce中,有的时候我们需要将一组用户放进一个Group,用来实现以下主要功能: 1.通过sharing rule设置默认的共享访问; 2.将记录分享给其他用户; 3.指定同步的联系人,这 ...

  3. salesforce 零基础学习(三十九) soql函数以及常量

    在salesforce中,我们做SOQL查询时,往往需要用到计算式,比如求和,求平均值,或者过滤数据时,往往需要通过时间日期过滤,SOQL已经封装了很多的函数,可以更加方便我们的sql查询而不需要自己 ...

  4. salesforce 零基础学习(三十八)Translate 的使用(国际化处理)

    本篇参考:http://resources.docs.salesforce.com/200/17/en-us/sfdc/pdf/salesforce_workbench_cheatsheet.pdf ...

  5. salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)

    上一篇内容是通过Process Builder和Approval Processes实现锁定记录的功能,有的时候,往往锁定一条记录需要很多的限制条件,如果通过Approval Processes的条件 ...

  6. salesforce 零基础学习(六十一)apex:component简单使用以及图片轮转播放的实现

    有的时候,我们项目有可能有类似需求:做一个简单的图像轮转播放功能,不同的VF页面调用可以显示不同的图片以及不同的图片描述.这种情况,如果在每个页面单独处理相关的图像轮转播放则显得代码特别冗余,此种情况 ...

  7. salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)

    此篇请参看:https://resources.docs.salesforce.com/202/latest/en-us/sfdc/pdf/salesforce_developer_environme ...

  8. salesforce 零基础学习(三十七) DML及Database方法简单描述

    在apex中通过soql查询可以使用两种方式,使用DML语句或者使用Database的方法. 使用DML语句和使用Database类的方法对于我们来说用的都很多,并且都很常见.对于数据库常见的操作:增 ...

  9. salesforce 零基础学习(三十五) 通过Process Builder和Approval Processes锁定记录(Lock Record)

    有的时候我们可能有这样的需求,当某个字段为特定的值情况下,便锁定此条记录,仅允许Profile为System Admin的用户修改或者解锁,其他的用户只能查看此条记录,不能修改此条记录,这种情况下我们 ...

  10. salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesforce

    本篇参考Trail教程: https://developer.salesforce.com/trailhead/force_com_dev_intermediate/apex_integration_ ...

随机推荐

  1. 【Python&目标识别】调用百度智能云API实现植被识别

           ​百度智能云于2015年正式对外开放运营,以"云智一体"为核心赋能千行百业,致力于为企业和开发者提供全球领先的人工智能.大数据和云计算服务及易用的开发工具.凭借先进的 ...

  2. Rust中的变量的声明和定义

    变量的声明和定义 Rust中合法的标识符(包括变量名.函数名.triat名等)必须由数字.字母.下划线组成,而且不能以数字开头.这个和很多语言都是一样的.Rust将来也会允许其他Unicode字符作为 ...

  3. Educational Codeforces Round 150 (Rated for Div. 2) A-E

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  4. 学习websocket,原来这么简单

    简单介绍 websocket WebSocket是一种在TCP连接上进行全双工通信的协议. WebSocket通信协议于2011年被IETF定为标准. 然后WebSocket API也被W3C定为标准 ...

  5. AI作画本地搭建

    前言 Novel AI (简称NAI)是一个线上的深度学习小说续写平台,而 NAI Diffusion 是 NAI 在2022年10月3日推出的基于 Stable Diffusion 算法的自动生成二 ...

  6. Maven资源大于配置问题

    资源大于配置问题 <!--pom.xml中在build中配置resources,来防止我们资源导出失败的问题--> <build> <resources> < ...

  7. 脚手架服务运行 报错 error:03000086:digital envelope routines::initialization error

    报错图片 解决方法: 降低版本 https://nodejs.org/zh-cn/ 安装后(安装前先卸载高版本,点击左下放大镜搜索"卸载程序" 进行卸载) 安装完成后,再次回到vu ...

  8. (一)centos7下如何搭建Nginx和FastDFS文件管理-环境搭建

    一.关于FastDFS 1.FastDFS简介 FastDFS(Fast Distributed File System)是一个开源的分布式文件系统,旨在解决大规模文件存储和访问的问题,例如图片.音视 ...

  9. EC600U-4G模组,连接阿里云测试服务器和物联网平台

    原博主视频:https://www.bilibili.com/video/BV1yT4y1P7Gw?share_source=copy_web 连接阿里云服务器 !!需要公网ip(服务器)才能远程,不 ...

  10. 【MAUI Blazor踩坑日记】4.只在特定平台上引用包

    其实这个并不是MAUI特有的问题,只是在MAUI中可能会遇到. 例如某个包只在Windows上有用,但打包的时候,安卓.ios也会把这个包计算在内 所以需要在不是特定平台时把它排除. 万幸从微软文档找 ...