公式(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"))
个公式不仅更短,更易于理解,而且还可以在需要计算案例年龄的任何地方重复使用助手公式。真棒!