公式(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
)
即使基本佣金只是一个货币字段,而不是一个公式本身,引用一次而不是多次,大大减少了公式编译的大小。