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_ ...
随机推荐
- 为什么 Biopython 的在线 BLAST 这么慢?
用过网页版本 BLAST 的童鞋都会发现,提交的序列比对往往在几分钟,甚至几十秒就可以得到比对的结果:而通过调用 API 却要花费几十分钟或者更长的时间!这到底是为什么呢? NCBIWWW 基本用法 ...
- 【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏
目录 一.开发背景 二.爬虫代码 2.1 爬微博列表 2.2 爬微博评论 2.3 导入MySQL数据库 三.可视化代码 3.1 大标题 3.2 词云图(含:加载停用词) 3.3 玫瑰图(含:snown ...
- 20230611 再次升级SSD
家里常用电脑的硬盘又显得捉襟见肘,老规矩,升级SSD.幸亏几年前摸索的方法记录下来了,翻出以前的博客复习一下.为了保险起见,也重新在网上搜了一下,看是不是有新的更方便的方法,答案是没有,只是搜出很多推 ...
- Python异步编程之web框架 异步vs同步 Redis并发对比
测试基本信息 主题:比较异步框架和同步框架在RedisIO操作的性能差异 python版本:python 3.8 数据库:redis 5.0.7 压测工具:locust web框架:同步:flask ...
- 通用密钥,无需密码,在无密码元年实现Passkeys通用密钥登录(基于Django4.2/Python3.10)
毋庸讳言,密码是极其伟大的发明,但拜病毒和黑客所赐,一旦密码泄露,我们就得绞尽脑汁再想另外一个密码,但记忆力并不是一个靠谱的东西,一旦遗忘密码,也会造成严重的后果,2023年业界巨头Google已经率 ...
- 【技术积累】Git中的基础知识【一】
Git是什么?有什么特点? Git是一个分布式版本控制系统,常用于软件开发中的源代码管理.它最初由Linux开发者Linus Torvalds创建,旨在管理Linux内核的开发. Git具有以下特点: ...
- React后台管理系统 04 配置路径别名、全局样式设置、模块化scss
ts中对于@符号指定的路径不支持,同时vite中也是不支持的,所以我们需要在vite.config.ts中进行指定配置,path是node中自带的一个模块这里爆红的原因是没有进行声明: 我们使用命令对 ...
- ASL芯片CS5466方案设计|集睿致远CS5466代理商|Type-c转HDMI电路原理
CS5466作为ASL集睿致远新推出的高性能Type-C to HDMI2.1协议转换器,可以通过HDMI输出端口作为TMDS或FRL发射机进行操作. CS5466适配于多个配件市场和现实应用主板,例 ...
- SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件
之前我们已经,出了一些列文章. 讲解如何封统一全局响应Restful API. 感兴趣的可以看我前面几篇文章 (整个starter项目发展史) SpringBoot定义优雅全局统一Restful AP ...
- C#选择排序(Selection Sort)算法
选择排序原理介绍 选择排序(Selection Sort)是一种简单的排序算法,其实现原理如下: 遍历待排序数组,从第一个元素开始. 假设当前遍历的元素为最小值,将其索引保存为最小值索引(minInd ...