学习目标
- 实现高级公式以匹配复杂的用例。
- 写干净,易于理解的公式。
先进的公式
我们已经在这个模块中看到了很多复杂的公式。然而,将业务问题转化为基于公式的解决方案并不总是容易的。这个单位有几个提示从概念到现实的公式。
把它写出来
当你有一个公式的想法,在你拉起高级公式编辑器之前,用日常语言思考。首先问自己你的目标是什么,然后对话描述。
此示例来自Salesforce Trailblazer社区:假设您的目标是确保如果系统管理员以外的任何人将机会标记为“已关闭丢失”,则必须提供解释。
对于这个例子,我们假设你已经有了自定义的选项列表字段Loss Reason,并填充了失去机会的有效理由。由于没有人能够在不提供理由的情况下保存记录,因此我们使用验证规则公式来实现我们的目标。
用简单的语言,你的公式是:
当机会阶段由非系统管理员的人员更改为“已关闭丢失”时显示错误,并且丢失原因为空。
在写出公式之后,查找与本模块中使用的函数相对应的关键字“and”,“or”,“if”。这些功能是更大,更复杂的公式的基石。在用例中识别它们可以帮助你实现这样的公式。
要检查用户不是系统管理员,请插入$ Profile.Name,这是一个合并字段,表示对记录进行编辑的配置文件。要检查StageName是否已更新,请使用ISCHANGED()。如果字段的当前值不同于以前的值,则ISCHANGED()返回true。
您可以使用ISPICKVAL()检查其余的需求。有关ISPICKVAL()的更多信息,请参阅在公式中使用选取列表。
- 在安装程序中,使用快速查找框来查找 Object Manager.
- 点击 .
- 点击 New.
- 在 Rule Name,输入 Loss Reason Required.
- 在 Error Condition Formula, 输入以下公式:
AND( $Profile.Name <> "System Administrator", ISCHANGED(StageName), ISPICKVAL(StageName, "Closed Lost"), ISPICKVAL(Loss_Reason__c, "") )
- 在 Error Message, 输入 Opportunities can’t be marked Closed Lost without providing a Loss Reason.
- 对于错误位置,请选择 Field 和 Loss Reason.
- 点击 Save.
现在,只要不是系统管理员的用户将机会标记为“关闭丢失”,就会显示错误消息。
使用清除间距和格式
使用适当的间距和格式时,公式更易于阅读和理解。当我们使用文本公式时,我们写了一个公式,根据国家,收入和来源动态地给一个潜在客户分配评分。
IF(AND(AnnualRevenue > 1000000, CONTAINS(CASE(Country,
"United States", "US", "America", "US", "USA", "US", "US", "US",
"NA"), "US")), IF(ISPICKVAL(LeadSource, "Partner Referral"),
"Hot", IF(OR(ISPICKVAL (LeadSource, "Purchased List"),
ISPICKVAL(LeadSource, "Web")), "Warm”, "Cold")), "Cold")
IF(
AND(AnnualRevenue > 1000000,
CONTAINS(CASE(Country, "United States", "US", "America",
"US", "USA", "US", "US", "US", "NA"), "US")),
IF(
ISPICKVAL(LeadSource, "Partner Referral"), "Hot",
IF(
OR(
ISPICKVAL(LeadSource, "Purchased List"),
ISPICKVAL(LeadSource, "Web")
), "Warm”, "Cold"
)
), "Cold"
)
IF(
AnnualRevenue > 1000000 &&
CONTAINS(CASE(Country, "United States", "US", "America", "US",
"USA", "US", "US", "US", "NA"), "US"),
IF(
ISPICKVAL(LeadSource, "Partner Referral"), "Hot",
IF(
ISPICKVAL(LeadSource, "PurchasedList") ||
ISPICKVAL(LeadSource, "Web"),
"Warm", "Cold"
)
), "Cold"
)
把事情简单化
在编写复杂的公式时,很容易陷入嵌套的逻辑语句和对其他字段的引用。通常,最简单的公式是最好的公式。
OR (
CloseDate < DATE( YEAR(TODAY()), MONTH(TODAY()), 1),
IF (
AND (
MONTH (TODAY() ) =1,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =2,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 28)),
true,
IF (
AND (
MONTH (TODAY() ) =3,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =4,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =5,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =6,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =7,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =8,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =9,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =10,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =11,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =12,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true, false
)))))))))))))
NOT(
AND(
MONTH( CloseDate ) = MONTH( TODAY() ),
YEAR( CloseDate ) = YEAR( TODAY() )
)
)