公式(7)错误

学习目标

完成本单元后,您将能够:

  • 了解常见配方错误的原因。
  • 排查高级公式字段。

语法错误

即使是高级配方大师偶尔也会遇到他们的配方的问题。最常见的公式错误是语法错误。要随时检查公式的语法,请单击 Check Syntax.

缺少或额外的括号

在你的公式中不小心输入一个额外的括号或者留下一个。嵌套逻辑语句(如IF(),AND()和OR()时,此错误尤为常见。

如,这个公式在最后缺少一个左括号。

A syntax error for a missing parenthesis

如果在函数内有太多括号或逗号,则也会出现此错误。这是相同的公式,但带有一个额外的括号。

A syntax error for an extra parenthesis

字段不存在

当涉及语法错误时,高级公式编辑器是您的朋友。在使用插入操作符或插入字段按钮时,几乎不可能拼错字段或函数的名称。

A syntax error for an incorrectly spelled field name

这里我们打算引用Principal__c而不是Principle__c。如果忘记在文本字符串周围加上引号,也会出现此错误。

参数数量不正确

如果某个函数使用的参数数量不正确,则会遇到语法错误。对使用可变数量参数的函数(如CASE())要格外小心。

A syntax error for the incorrect number of parameters in a function

这个公式在CASE()语句中遗漏了最后一个参数,即贯穿案例。公式编辑器假设我们只想检查四个案例,而不是五个。所以总共找了10个论点,我们真的要给它12个。

未知功能

当您拼错函数名称或者尝试使用不存在的函数时,您也会遇到错误。

A syntax error for an unknown function

此公式尝试引用不存在的函数MINIMUM()。我们打算使用MIN(),它取一个数字列表并返回最小值。

使用不同的数据类型

在创建公式时,请在编写公式之前考虑希望它返回的数据类型。如果您的公式返回的数据类型不是您选择的数据类型,则无法保存。

在类型之间转换数值或使用类似数据类型(如日期和日期/时间或数字和货币)时很容易混淆数据类型。例如,此公式被写为在所选公式返回类型为Date / Time时返回Date值。

This formula's return type differs from the data type of the value it is written to return.

若要更正此错误,您可以将公式字段的返回类型更改为日期。或者,您可以用NOW()替换TODAY()来生成日期/时间值而不是日期。

编译大小和公式长度错误

公式字段功能强大,但规模受限。公式限制为3,900个字符或4,000个字节,包括空格,返回字符和注释,编译时不能超过5,000个字节。了解这些大小限制之间的区别以及如何解决或限制这些限制很重要。

长度限制

公式限于3,900个字符。你可以用几种方法缩短长公式。用&&​​替换AND(),例如,每次使用都会保存几个字符,就像使用CASE()语句替换嵌套的IF()语句一样。较短的字段名称和注释也会在公式的长度上产生一个小而显着的差异。

如果您的公式字段明显长于3,900个字符,请使用助手公式字段。

编译大小限制

小于3,900个字符的公式仍可能超过5,000字节的编译大小限制。当公式超过编译大小限制时,创建助手字段并缩短字段名称或注释并没有什么区别。引用辅助字段时,其编译大小将被添加到引用它的公式的编译大小。减少公式编译大小的一种方法是最小化对其他公式字段的引用。

一些用于减少公式长度的方法,例如用CASE()语句替换嵌套的IF()语句,也减少了公式的编译大小。

考虑两个领域:

  • Date1__c 是日期字段。
  • Date2__c 是从Date1__c创建日期的公式字段。
    DATE( YEAR( Date1__c ), MONTH( Date1__c ), DAY( Date1__c ) )
    下面的公式返回给定日期的月份的最后一天的日期(假设2月总是有28天):
DATE(
 YEAR( SomeDate__c ),
 MONTH( SomeDate__c ),
 IF(
   OR(
     MONTH( SomeDate__c ) = 4,
     MONTH( SomeDate__c ) = 6,
     MONTH( SomeDate__c ) = 9,
     MONTH( SomeDate__c ) = 11
   ),
   30,
   IF(
     MONTH( SomeDate__c ) = 2,
     28,
     31
   )
 )
)
该公式首先检查30天的月份,然后是2月份,剩下的月份是31天。它需要一个嵌套的IF()函数,这是不太可读的,编译为Date1__c的1069个字符和Date2__c的7,271个字符!为什么?因为公式引用日期七次。比较这个公式的修改版本:
DATE(
 YEAR( SomeDate__c ),
 MONTH( SomeDate__c ),
 CASE(
   MONTH( SomeDate__c ),
   2, 28,
   4, 30,
   6, 30,
   9, 30,
   11, 30,
   31
 )
)

这不仅更容易阅读,公式编译为Date1__c只有645个字符,Date2__c只有3,309个字符,现在它引用日期三次而不是七次。

此示例来自Salesforce Answers社区。领料单存储负责机会的代理人的名字。该公式根据基本佣金价值和乘数计算佣金。但是因为在CASE()语句的每个条件中引用了Base_Commission__c,所以公式超出了编译大小。

CASE( Agent__c,
  "John", Base_Commission__c * 2,
  "Jane", Base_Commission__c * 6,
  /* 重复许多其他代理 */
  Base_Commission__c
)
要解决此问题,请将CASE()函数外部的Base_Commission__c移动。该公式可以被重写为:
Base_Commission__c * CASE( Agent__c,
  "John", 2,
  "Jane", 6,
  /* 许多其他代理重复 */
  1
)
即使基本佣金只是一个货币字段,而不是一个公式本身,引用一次而不是多次,大大减少了公式编译的大小。

公式(6)高级

学习目标

完成本单元后,您将能够:

  • 实现高级公式以匹配复杂的用例。
  • 写干净,易于理解的公式。

先进的公式

我们已经在这个模块中看到了很多复杂的公式。然而,将业务问题转化为基于公式的解决方案并不总是容易的。这个单位有几个提示从概念到现实的公式。

把它写出来

当你有一个公式的想法,在你拉起高级公式编辑器之前,用日常语言思考。首先问自己你的目标是什么,然后对话描述。

此示例来自Salesforce Trailblazer社区:假设您的目标是确保如果系统管理员以外的任何人将机会标记为“已关闭丢失”,则必须提供解释。

对于这个例子,我们假设你已经有了自定义的选项列表字段Loss Reason,并填充了失去机会的有效理由。由于没有人能够在不提供理由的情况下保存记录,因此我们使用验证规则公式来实现我们的目标。

用简单的语言,你的公式是:

当机会阶段由非系统管理员的人员更改为“已关闭丢失”时显示错误,并且丢失原因为空。

在写出公式之后,查找与本模块中使用的函数相对应的关键字“and”,“or”,“if”。这些功能是更大,更复杂的公式的基石。在用例中识别它们可以帮助你实现这样的公式。

要检查用户不是系统管理员,请插入$ Profile.Name,这是一个合并字段,表示对记录进行编辑的配置文件。要检查StageName是否已更新,请使用ISCHANGED()。如果字段的当前值不同于以前的值,则ISCHANGED()返回true。

您可以使用ISPICKVAL()检查其余的需求。有关ISPICKVAL()的更多信息,请参阅在公式中使用选取列表。

  1. 在安装程序中,使用快速查找框来查找 Object Manager.
  2. 点击 Opportunity | Validation Rules.
  3. 点击 New.
  4. Rule Name,输入 Loss Reason Required.
  5. Error Condition Formula, 输入以下公式:
    AND(
      $Profile.Name <> "System Administrator",
      ISCHANGED(StageName),
      ISPICKVAL(StageName, "Closed Lost"),
      ISPICKVAL(Loss_Reason__c, "")
    )
  6. Error Message, 输入 Opportunities can’t be marked Closed Lost without providing a Loss Reason.
  7. 对于错误位置,请选择 Field 和 Loss Reason.
  8. 点击 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"
)

虽然格式化公式没有硬性和快速的规则,但是我们建议您在每次嵌套逻辑语句时使用两个空格缩进。当你正确和一致的缩进,很容易看到你正在使用哪个函数,并避免不匹配的括号。

另一种使逻辑语句易于阅读的方法是使用逻辑运算符而不是函数。当您使用&&而不是AND()或||时而不是OR(),读取公式的人更容易遵循逻辑流程。这里再一次用&&和||表示相同的公式而不是AND()和OR()。

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"
)

把事情简单化

在编写复杂的公式时,很容易陷入嵌套的逻辑语句和对其他字段的引用。通常,最简单的公式是最好的公式。

如果机会的关闭日期不在当前月份,此验证规则公式返回true

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() ) 
  ) 
)
这个新版本更具可读性,只能编译为200个字符,而原始公式则超过3,000个。如果你的公式看起来比它应该更复杂,那很可能是 – 从不同的角度来解决问题来简化事情。

公式(5)文本

学习目标

完成本单元后,您将能够:

  • 描述什么是文本类型。
  • 将文本值转换为其他数据类型或从其他数据类
  • 描述使用文本类型的公式的用例。
  • 使用文本类型创建一个公式。

公式中的文本介绍

有时,让您的组织中的信息一目了然,最简单的方法就是将其显示为文本。使用文本返回类型的公式可以连接文本值,将数字和日期转换为文本,或者有条件地显示文本。

你可以做的最简单的事情是将两个文本字符串与运算符&连接起来。例如,您可以通过组合名字和姓氏来显示联系人的全名。

FirstName & " " & LastName
将文本值放在一起时,请考虑必要的空格,以便字符串不会显示为废话 – “Jane Doe”比“JaneDoe”更具可读性。
 

常见的文本函数和操作符

Salesforce带有许多功能和操作员,可以使用公式中的文本进行工作。使用公式,可以将其他数据类型转换为文本并将文本值连接在一起,或在文本字段中搜索特定的字符串。

转换为文本值和从文本值转换

TEXT()将百分比,数字,日期,日期/时间,选取列表或货币字段转换为文本。 TEXT()返回没有任何格式,逗号或货币符号的输出。例如,TEXT(percent_value),如果percent_value设置为30%,则返回0.3。

当TEXT()收到日期或日期/时间值时,它返回一个带有标准日期或日期/时间格式的字符串。例如,如果date_value对应于2015年3月17日,则TEXT(date_value)返回2015-03-17。对于datetime_value 2015年3月17日下午5点,TEXT(datetime_value)返回2015-03-17 17:00:00Z。 Z表示GMT-TEXT()返回的时间总是返回格林尼治标准时间的日期/时间值,而不是当前用户或组织的时区。

您也可以使用VALUE()以另一种方式转换值,该值使用Text值并返回一个Number。如果VALUE()接收到的值不是一个数字,包括小数点或减号(负号)以外的任何特殊字符,则会显示#Error!例如,如果text_value是$ 500,则VALUE(text_value)将返回一个错误。如果text_value为空,则VALUE()也会返回错误。

其他文字功能

如果文本以compare_text开头,则BEGINS(text,compare_text)返回true。如果compare_text是文本中的任何位置,则CONTAINS(text,compare_text)将返回true。这些功能对于根据文本字段有条件地显示信息很有用。

函数SUBSTITUTE(text,old_text,new_text)用new_text替换old_text的任何实例,就像文本编辑器中的find和replace函数一样。

Salesforce包含其他用于处理公式中文本和格式化的函数。有关更多信息,请参阅Salesforce联机帮助中的公式运算符和函数。

在公式中使用文本类型

分配客户评级

通常,使用文本返回类型的公式显示很难量化的信息。例如,您可以使用文本公式来确定铅是热,暖还是冷。我们将编写一个既使用条件逻辑又使用ISPICKVAL()函数来返回主角评分的公式。

在这个例子中,我们根据其收入,国家和来源对潜在客户进行评估。

  • Hot—AnnualRevenue大于100万美元,Country是美国,LeadSource是合作伙伴推荐。
  • Warm—AnnualRevenue 大于100万美元,Country是美国,LeadSource是购买清单或Web。
  • Cold—客户不符合任何这些条件。

此公式使用一系列IF(),AND()和OR()语句来检查这些条件,并使用ISPICKVAL()评估Lead Source字段。该公式还使用CASE()语句来检查国家/地区。如果该国是美国,美国,美国或美国,则CASE()声明将返回美国。否则,它返回NA(不适用)。

选择树帮助我们更容易地遵循公式的逻辑流程。

This choice tree helps us visualize the lead rating formula.
  1. 在安装程序中,使用快速查找框来查找 Object Manager.
  2. 点击 Lead | Fields & Relationships 然后单 New.
  3. 选择Formula 并单击 Next.
  4. Field Label, 输入 Rating. 字段名称自动填充。
  5. 选择 Text 并单击 Next.
  6. 输入以下公式:
    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"
    )

根据潜在客户的特征,新配方字段评分显示“热”,“热”或“冷”。

用CASE()显示图像

带有文本返回类型的公式对于不仅仅是文本而言是有用的 – 您也可以使用它们来显示图像。图像使信息一目了然,抓住用户的眼睛不仅仅是文本。让我们编写一个公式,使用您刚刚创建的评级字段以图形方式显示潜在客户评分为零星,一星,三星或五颗恒星。

IMAGE()函数最多需要四个参数。 IMAGE(image_url,alternate_text,height,width)以可选的height和width参数指定的尺寸显示由image_url指定的图像。如果图像无法显示,则该功能显示alternate_text。

如果主角评级是

  • Hot, 公式显示五颗星
  • Warm,公式显示三颗星
  • Cold, 公式显示一颗星

如果主角等级为空白,则公式不会显示星号。

使用文本返回类型和名称星级创建公式字段。在高级公式编辑器中,输入:

IMAGE(
  CASE(Rating__C,
    "Hot", "/img/samples/stars_500.gif",
    "Warm", "/img/samples/stars_300.gif",
    "Cold", "/img/samples/stars_100.gif",
    "/img/samples/stars_000.gif"),
"Unknown")
此公式使用内置于Salesforce中的图像,但是您可以使用自己的图像,方法是首先从“文档”选项卡上载图像。

文本示例

  1. 此公式使用美国客户的帐单州/省字段将其分类为北,南,东,西或中央。
    IF(ISBLANK(BillingState), "None",
    IF(CONTAINS("AK:AZ:CA:HA:NV:NM:OR:UT:WA", BillingState), "West",
    IF(CONTAINS("CO:ID:MT:KS:OK:TX:WY", BillingState), "Central",
    IF(CONTAINS("CT:ME:MA:NH:NY:PA:RI:VT", BillingState), "East",
    IF(CONTAINS("AL:AR:DC:DE:FL:GA:KY:LA:MD:MS:NC:NJ:SC:TN:VA:WV", BillingState), "South",
    IF(CONTAINS("IL:IN:IA:MI:MN:MO:NE:ND:OH:SD:WI", BillingState), "North", "Other"))))))
  2. 该公式嵌入HYPERLINK()函数的链接。一般来说,HYPERLINK(url,display_text,target)显示一个到display_text的链接。可选的目标参数决定了单击链接时网页的显示方式。如果您将目标保留为空白,则默认情况下链接会在新的浏览器窗口中打开。
    HYPERLINK("https://www.salesforce.com", "Salesforce")
  3. 此公式接受Email字段并使用它来创建一个URL。该公式使用FIND()和SUBSTITUTE()在电子邮件地址中查找@符号,并用www替换它的左侧所有内容。
    SUBSTITUTE(Email, LEFT(Email, FIND("@", Email)), "www.")
    文本公式的常见错误

将值转换为文本。请确保在公式中使用它之前检查一个字段的类型。例如,以前的Salesforce管理员可能已经创建了一个将日期保存为文本值的自定义字段。如果是这种情况,可以使用TEXT()或DATEVALUE()来同时处理文本和日期值。

公式字段帮手

使用助手公式字段是使公式简洁易懂的好方法。辅助字段只做更大计算的一部分,并由结束公式字段引用。您可以使用任何公式类型的帮手公式字段,但现在我们来看一个示例。

假设您要编写名为Case_Category__c的文本公式,该公式根据案件已打开的时间长短显示案件的类别(绿色,黄色或红色)。通常情况下,你可能会写这样的东西。

IF(((NOT(IsClosed)) && (TODAY() - DATEVALUE(CreatedDate) > 20)), "RED",
 IF((NOT(IsClosed)) && (TODAY() - DATEVALUE(CreatedDate) > 10), "YELLOW",
 "GREEN"))
您可以通过将计算个案年龄的逻辑放入另一个公式字段来简化此公式。我们称这个字段为Case_Age_In_Days__c。
TODAY() - DATEVALUE(CreatedDate)
然后,我们可以像这样重写Case_Category__c。
IF(((NOT(IsClosed)) && (Case_Age_In_Days__c > 20)), "RED",
 IF((NOT(IsClosed)) && (Case_Age_In_Days__c > 10), "YELLOW",
 "GREEN"))
个公式不仅更短,更易于理解,而且还可以在需要计算案例年龄的任何地方重复使用助手公式。真棒!

公式(4)选项

学习目标

完成本单元后,您将能够:

  • 描述引用选取列表字段的公式的用例。
  • 在公式字段中使用选择列表功能。
  • 创建一个引用选项列表字段的公式。

在公式中使用选取列表的简介

选项列表字段允许您从预先填充的列表中选择一个值。虽然您无法撰写返回结果列表的公式,但您可能必须在公式字段中引用选取列表。

假设您需要验证规则,要求用户填写说明,如果他们选择“其他”作为客户的类型。此验证规则公式要求用户填写文本字段“其他类型”(如果他们将客户的“类型”设置为“其他”)。

ISPICKVAL(Type, "Other") &&
ISBLANK(Other_Type__c)
如果当“类型”设置为“其他”时,用户将Other_Type__c留为空白,则会触发验证规则,并且用户无法保存表单。

常见的选项列表函数和操作符

三个函数将picklist值作为所有公式字段中的参数:ISPICKVAL(),CASE()和TEXT()。

如果picklist_field的值与text_value匹配,则ISPICKVAL(picklist_field,text_value)返回true,否则返回false。您可以将ISPICKVAL()与PRIORVALUE()结合使用。您可以在分配规则,验证规则,字段更新和工作流程规则中使用此函数来查找字段的先前值。

例如,此验证规则可防止用户将案例的类型从先前选定的值更改为空白。

NOT(ISPICKVAL(PRIORVALUE(Type), "")) &&
ISPICKVAL(Type, "")

如果Type的先前值不为空且当前值为,则触发验证规则。

CASE()对于根据选取列表的值编写具有不同结果的公式很有用。带有Number返回类型的此公式根据其类型为案例分配优先级。

CASE(Type,
  "Electrical", 1,
  "Electronic", 2,
  "Mechanical", 3,
  "Structural", 4,
  "Other", 5,
5)

该公式将Type与每种情况进行比较,并在发现匹配时指定优先级。电子案例优先级为1,电子案例2,等等。

TEXT()将选取列表值转换为组织主语言的文本值,而不是当前用户的语言。在将选取列表值转换为文本值之后,可以在其上使用文本函数,例如BEGINS()和CONTAINS()。

例如,这个公式将一个案件的状态显示为一个句子。

"This case is " & TEXT(Status)
注意

您不能在多选选项列表上使用TEXT()。公式字段中不推荐多选择选项列表。

在公式中使用选项列表字段

基于选择列表创建验证规则

选项列表值通常决定了记录中的哪些其他字段是必需的。 ISPICKVAL()和CASE()可用于创建验证规则,以检查是否选择了某个选项列表值。例如,假设您希望用户在将案例的“状态”选项列表值更改为“已升级”时输入原因。

首先,在Case对象上创建自定义文本字段升级原因。

  1. 在安装程序中,使用快速查找框来查找 Object Manager.
  2. 点击 Case | Fields & Relationships 然后单击 New.
  3. 选择 Text Area 并单击 Next.
  4. Field Label, 输入 Reason for Escalating.字段名称自动填充。
  5. 点击 Next.
  6. 再次单击 Next 然后单击 Save.

现在使用状态选项列表字段来设置升级原因的验证规则。

  1. 单击新创建的升级原因字段。
  2. 在验证规则下,单击 New.
  3. Rule Name, 输入 Reason_Required.
  4. Error Condition Formula, 输入以下验证规则:
    AND(
      ISPICKVAL(Status, "Escalated"),
      ISBLANK(Reason_for_Escalating__c)
    )
  5. Error Message, 输入Please enter a reason for changing the case status to Escalated.
  6. 点击 Save.

验证规则确保如果状态设置为“升级”,升级原因不为空白。通过将案例状态更新为升级并保存记录来测试公式,而不输入升级原因。该窗体显示在升级原因字段下的错误消息。

Users who do not set a Reason for Escalating will see this error message.

指定联系人的优先级

如果您希望根据关联的客户评分为联系人分配优先级,那么选项列表字段会怎样?对于此公式,我们使用联系人的客户评级的交叉对象参考以及我们在复选框公式中使用基本逻辑中创建的行政复选框公式字段。 Executive是否检查联系人的标题是否包含“Executive”,“President”或“Chief”等字样。

因为有三种可能的账户评级 – 热,温或冷 – 以及执行检查或未检查的两种选择 – 总共有六种情况。我们将使用CASE()根据以下条件为每种可能性分配优先级。

Account.Rating Is_Executive_c 优先级
Hot Yes 1
Hot No 1
Warm Yes 1
Warm No 2
Cold Yes 2
Cold No 3

在名称为Priority并且类型为Number的联系人对象上创建一个公式字段。

  1. 在安装程序中,使用快速查找框来查找 Object Manager.
  2. 点击 Contact | Fields & Relationships 然后单击 New.
  3. 选择 Formula 并单击 Next.
  4. Field Label, 输入 Priority. 字段名称自动填充。
  5. 选择 Number, 并将小数位数更改为0
  6. 点击 Next.
  7. 输入以下公式:
    CASE(Account.Rating,
      "Hot", 1,
      "Warm", IF(Is_Executive__c, 1, 2),
      "Cold", IF(Is_Executive__c, 2, 3),
    3)
    在这个公式中,我们在更大的CASE()语句中使用IF()语句来更有效地检查所有六种情况。

选项列表示例

  1. 此公式根据自定义选项列表字段合同状态和自定义日期字段合同激活日期返回客户被激活后的天数。如果合同状态未激活,则该字段为空。
    IF(ISPICKVAL(Contract_Status__c, "Activated"),
      TODAY() - Contract_Activated_Date__c, null)
  2. 此公式在合同对象上使用自定义日期字段Payment Due Date和自定义选项列表字段Payment Status以及Paid和Unpaid选项。如果“付款状态”为“未付”且已超过付款到期日,公式字段将显示逾期付款!否则,该字段为空。
    IF(AND(Payment_Due_Date__c < TODAY(), 
      ISPICKVAL(Payment_Status__c,
      "UNPAID")),
      "Payment overdue!", null)
  3. 如果有人试图将潜在客户的状态从“已关闭 – 已转换”或“关闭 – 未转换”更改为“打开 – 未联系”,此验证规则使用ISPICKVAL()和PRIORVALUE()显示错误。
    ISPICKVAL(Status, "Open - Not Contacted") &&
    BEGINS(TEXT(PRIORVALUE(Status)), "Closed")
    如果用户将关闭状态从关闭状态更改为打开状态,则在尝试保存记录时会看到错误。
    The error message a user sees when they violate the validation rule.

挑选清单的常见错误

  • 唯一可以将选取列表字段作为所有公式字段中的参数的函数是ISPICKVAL(),CASE()和TEXT()。在其他函数中使用选项列表值会导致错误。例如,此复选框公式字段旨在显示一个复选框,用于指示潜在顾客源是否是“合作伙伴推荐”。等号运算符(=),但是,不支持选项列表字段,并且此公式导致一个错误。

    LeadSource = "Partner Referral"
    相反,使用ISPICKVAL()检查选择列表字段的值,或者在使用equals运算符之前使用TEXT()将选取列表值转换为文本。
    ISPICKVAL(LeadSource, "Partner Referral")
    TEXT(LeadSource) = "Partner Referral"

公式(3)日期

学习目标

完成本单元后,您将能够:

  • 描述日期和日期/时间类型。
  • 解释日期和日期/时间类型之间的区别。
  • 描述具有Date和Date / Time返回类型的公式的用例。
  • 使用Date和Date / Time类型创建一个公式。

日期和日期/时间公式简介

在管理您的组织时,日期和日期/时间字段非常适合显示联系人的出生日期,个案年龄或创建客户的日期和时间。您可以使用公式来显示当前日期或查找两个日期之间的差异。

例如,此交叉对象公式将在其相关大小写的页面上将日期和时间创建为日期/时间值。

Account.CreatedDate

交叉对象公式显示来自不同对象上的一个对象的数据。在这种情况下,我们显示了case对象上的账户对象的CreatedDate。即使您的组织的成员无权访问字段所在的对象,也可以看到显示或引用跨对象字段的公式。有关交叉对象公式的更多信息,请参阅构建交叉对象公式的技巧

日期表示为日期或日期/时间值。日期值存储年,月和日。日期/时间值存储年,月,日和时间。时间存储为GMT,但显示在查看它的用户的时区中。在公式中处理日期/时间值时,将时区冲突保留在头脑中非常重要。时区混淆很容易导致公式字段中的逻辑错误和组织中的错误信息。

如果您减去两个日期值,则结果是整数。如果您减去两个日期/时间值,则结果为代表天数,小时数和分钟数的十进制值。例如,如果两个日期/时间值之间的差值是3.52,则两个日期之间有3天,12小时(一天的0.5天)和29分钟(一天的0.02天)。

通用日期和日期/时间函数和操作符

Salesforce提供了多种功能,可让您更轻松地处理日期和日期/时间值。您可以使用DATEVALUE()函数将日期/时间转换为日期,该函数采用日期/时间或文本值并返回日期。同样,DATETIMEVALUE()接受日期或文本值,并返回日期/时间值,并将时间设置为午夜格林尼治标准时间。

假设您想自定义公式字段显示日期2015年3月17日。您可以使用DATE()函数将日,月和年转换为所需的日期值。

DATE(2015, 03, 17)
DATETIMEVALUE()是将文本转换为与2015年3月17日格林尼治标准时间下午5点对应的日期/时间值的另一种方法。
DATETIMEVALUE("2015-03-17 17:00:00")
你也可以使用DATEVALUE(),它接受一个字符串并返回一个日期值。
DATEVALUE("2015-03-17")
注意

DATETIMEVALUE()采用日期或文本值,格式为YYYY-MM-DD,格林尼治时间为GMT。如果输入的值超出有效范围(例如2月29日的非闰年或大于12的月份),则公式字段会显示#Error!

要查找当前日期作为日期值,请使用TODAY()。要查找当前时刻为日期/时间值,请使用NOW()。这些功能对于查找将来或过去的日期或距今天另一日期有多少天有用。

要将日期值中的日,月或年作为数字,分别使用DAY(),MONTH()或YEAR()。

在公式中使用日期和日期/时间类型

日期值的最简单用法之一是查找两个日期之间的天数。当您从另一个日期值中减去一个日期值时,您将以天数为单位的差异作为数字。

例如,如果您想查找今天的日期和客户的CreatedDate之间有多少天,请使用:

TODAY() - DATEVALUE(CreatedDate)
注意

请小心减去将来日期的过去日期。如果您逆转公式-DATEVALUE(CreatedDate) – TODAY() – 它将返回负值。

请注意,我们使用DATEVALUE()将CreatedDate(日期/时间值)转换为日期值,从而允许我们从TODAY()中减去CreatedDate。日期和日期/时间值不兼容。您不能从一个日期/时间减去一个日期,或者从一个日期减去一个日期/时间,而无需先转换其中一个值。

您还可以将日期添加到日期。要创建一个公式,它返回今天后三天的日期:

  1. 在安装程序中,使用快速查找框来查找 Object Manager.
  2. 点击 Account | Fields & Relationships 然后单击 New.
  3. 选择公式并单击 Next.
  4. Field Label, 输入 Future Date. 字段名称自动填充。
  5. 选择 Date 并点击 Next.
  6. 输入以下公式:
    TODAY() + 3

    注意

    将日期添加到日期时,Salesforce会在小数点后忽略数字。所以TODAY()+ 3相当于TODAY + 3.4,而TODAY()+ 2相当于TODAY()+ 2.9。

很简单,对吧?当您想要将工作日添加到日期时,情况会变得更加复杂。对于此公式,我们使用CASE()函数向TODAY()添加3个工作日。 CASE()在某些方面与IF()类似。关键的区别在于IF()只检查一个逻辑语句,而CASE()检查一系列称为个案的语句。

CASE(expression,case1,result1,case2,result2,…,else_result)将表达式与case1进行比较。如果它们相等,则返回result1。如果它们不是,则将表达式与case2进行比较,依此类推。如果expression与任何情况都不匹配,则该语句返回else_result。

CASE()对于有很多可能结果的条件语句是有用的。尽管嵌套的IF()语句通常可以做同样的事情,但CASE()使复杂的公式更易于阅读和理解。

我们将使用CASE()来写一个公式,为TODAY()增加3个工作日。与CASE()一起工作的第一步是考虑案例。我们的配方可能会遇到几种不同的情况:

  • 如果 TODAY()是星期日,星期一或星期二,则增加3个工作日与 TODAY() + 3 相同。
  • 如果TODAY()是星期三,星期四或星期五,则增加3个工作日与TODAY()+ 5(3个工作日和2个周末)相同。
  • 如果TODAY()是星期六,则增加3个工作日与TODAY()+ 4(3个工作日和1个周末日)相同。

对于我们的公式工作,我们必须知道TODAY()是星期几。有没有快速的方法来找到星期几与一个内置函数,所以我们使用更先进的技巧。首先我们找到TODAY()和过去已知的星期天之间的天数。接下来我们使用MOD()来查找该数字的余数除以7,给我们一个对应于当前星期几的数字。对于我们的参考星期天,我们使用1900年1月7日,代表DATE(1900,1,7)。

我们的CASE()语句然后根据TODAY()的星期几决定结果。我们的最终公式如下所示:

CASE(
  MOD(TODAY() - DATE(1900, 1, 7), 7),
  3, TODAY() + 2 + 3,
  4, TODAY() + 2 + 3,
  5, TODAY() + 2 + 3,
  6, TODAY() + 1 + 3,
  TODAY() + 3
)
您可以使用此公式的变体将任意数量的工作日添加到日期。无论您添加多少个工作日,最多有七个案例,一个星期中的每一天。

日期和日期/时间示例

  1. 这个公式通过从下一个月的第一天减去一天来找出一个月的最后一天。
    IF(
      MONTH(Date__c) = 12,
      DATE(YEAR(Date__c), 12, 31),
      DATE(YEAR(Date__c), MONTH(Date__c) + 1, 1) - 1
    )
  2. 这个公式找出TODAY()和date_1之间的工作天数,使用类似于我们之前用来查找TODAY()星期几的技巧。首先,公式找出TODAY()与过去已知的星期一(本例中为1900年1月8日)之间的工作日数。我们将该数除以7,然后使用FLOOR()将其从几天转换为几周。然后,我们将它乘以5,将其从几周转换为工作日。该公式找出该金额与date_1与同一参考星期一之间的营业日数之间的差异。结果是TODAY()和Date_c之间的营业日数。
    (5 * (FLOOR((TODAY() - DATE(1900, 1, 8)) / 7)) + MIN(5, MOD(TODAY() - DATE (1900, 1, 8), 7)))
    -
    (5 * (FLOOR((Date__c - DATE(1900, 1, 8)) / 7)) + MIN(5, MOD(Date__c - DATE(1900, 1, 8), 7 )))
  3. 此公式使用IF(),AND(),OR()和NOT()将Num_Years__c添加到Date__c中,以确保它不会在闰年中返回2月29日。如果日期是闰年的2月29日,并且未来年不是闰年,则公式将返回到未来一年的3月1日。该公式使用MOD()来检查当前年份是否为闰年。如果一个年份可以被400整除,或者被4整除而不是100,那么它就是一个闰年。否则,这个公式会返回相同的日期。
    IF(
      AND(
        MONTH(Date__c) = 2,
        DAY(Date__c) = 29,
        NOT(
          OR(
            MOD(YEAR(Date__c), 400) = 0,
            AND(
              MOD(YEAR(Date__c), 4) = 0,
              MOD(YEAR(Date__c), 100) != 0
            )
          )
        )
      ),
      DATE(YEAR(Date__c) + Num_Years__c, 3, 1),
      DATE(YEAR(Date__c) + Num_Years__c,
      MONTH(Date__c), DAY(Date__c)
      )
    )

包含日期和日期/时间公式的常见错误

  • 在日期和日期/时间之间转换。日期和日期/时间数据类型不可互换。如果它被写入以返回日期/时间值,则具有日期返回类型的公式不起作用。要在日期和日期/时间之间转换,请使用内置函数DATEVALUE()和DATETIMEVALUE()。请记住,TODAY()将当前日期作为Date值返回,而NOW()将当前日期和时间作为Date / Time值返回。
  • 使用时区。日期和日期/时间值始终显示在正在查看它们的用户的时区中。日期/时间值被转换为格林尼治标准时保存的记录,然后在格林尼治时间以外的用户查看时再次转换。将日期转换为日期/时间时,时间始终是午夜格林尼治标准时间。使用TEXT()转换日期/时间值时,请务必考虑时区。将日期/时间转换为文本时,它将以格林尼治标准时间(以GMT结尾处的Z表示)返回时间。 TEXT()总是以GMT时间生成文本值,而不是组织的时区。
  • 闰年和无效的日期。当将文本转换为日期或日期/时间值或增加年,月,日的日期或日期/时间,确保您的结果仍然是一个有效的日期。例如,如果公式的结果是2015年6月31日,则公式字段将显示#Error!同样,如果您的公式返回2013年2月29日(非闰年),该字段将显示错误。确保您的配方包含闰年和不同的月份长度。