Salesforce 中的循环日期模式
隔周的周二。每月第 2 和第 4 个周五。每月最后一个周六。这些都是再普通不过的业务规则,而 Salesforce 没有任何字段能表达其中任何一个。
Salesforce 只为事件和任务提供重复功能,仅此而已。一旦您的日程存放在自定义对象上(班次、课程、检查、值班轮换),就只能靠自己了,通常的做法是有人在纸质日历上把日期算出来,再手动逐条录入。
人们说的“循环”其实有两种
这两种经常被混为一谈,但需要的逻辑完全不同。
| 类型 | 示例 | 需要什么 |
|---|---|---|
| 按间隔 | 每周、每 2 周、每 3 周 | 星期几加上重复间隔 |
| 按出现次数 | 第 1 个周一、第 2 和第 4 个周五、最后一个周六 | 每月中的第几次出现 |
按间隔循环从开始日期往后数,不管月份边界。按出现次数循环每个月重新计算,而“最后一个”很棘手,因为它会因月份不同落在第 4 周或第 5 周。大多数自己写的实现,就栽在这一个词上。
为什么自己写容易出错
每月天数不同
“第 5 个周一”有的月份有,有的月份没有。
闰年
任何假定一年天数固定的计算,都会被它悄悄打乱。
“隔周”需要一个起点
从哪一周开始隔周?两个人的答案很可能不一样。
周末和节假日
可能需要跳过,而您的节假日存放在您自己组织的数据里。
生成得太远
会生成成千上万条没人需要的记录。
单看每一项都不难。加在一起,就是一周的工作量,外加永远修不完的边界情况 bug。
生成日期,而不是存储规则
算法背后还有一个设计决策:是存储规则,在读取时再展开;还是一次性展开,把得到的日期存下来?
在 Salesforce 中,存储日期几乎总是更好的选择。具体的日期记录可以像其他数据一样用于报表、汇总、筛选和驱动自动化。存储的规则则在每个用到的地方都需要解析,而 Salesforce 报表根本无法解析它。代价是修改模式就得重新生成,所以模式选择器应该放在录入的地方,而不是埋在配置里。
屏幕上的三种模式
先说自定义星期几,因为没有任何标准字段能表达它。任意组合工作日,设置间隔,给定范围,日历就会在您保存之前填好所有匹配的日期。
工作日和周末是大家最常用的两个快捷选项,单击一下即可完成同样的展开。
先让用户看到日期,再确认
循环设置界面能做的最好的事,就是把结果摆出来。用户选择“每 2 周的周二”后,立刻在日历上看到高亮的实际日期,错误就能在保存前那一秒被发现,而不是一周之后。它还能立即平息“从哪一周开始隔周”的争论,因为起点一目了然。
合并也是同样的道理。如果您的循环选择得到连续六周的周一至周五,您可能想要三十条记录,也可能只想要六条,每周一条,带开始和结束日期。在选择时就决定,远比事后迁移省事。