使用 Essbase 计算脚本

Essbase 计算脚本是一种可用于在 Financial Consolidation and Close 中编写自定义业务逻辑的语言。本节介绍了一些基本 Essbase 构造以及适用于 Financial Consolidation and Close 的限制。有关 Essbase 计算脚本的详细信息,请参阅《Getting Started with Essbase Cloud for Administrators》

常用语法

  • 分号
    • 必须在每个语句末尾使用
    • 示例:Sales = Sales * 1.50;
    • 在 FIX 和 ENDFIX 后面不需要使用
  • 双引号
    • 包含空格 / 特殊字符 / 以数字开头的成员名
    • 最佳做法是始终用双引号把成员名称引起来
    • 示例:"Cash Ratio" = "Cash"/"Current Liabilities";
  • 跨维运算符
    • 使用 -> 指定多个维的交叉点
    • 示例:"Sales"->"Changes In Net Income"->"Product1";

注释

注释以 /* 开头,以 */ 结尾。

支持单行或多行注释。

您可以使用此工具栏图标设置或删除注释块。

FIX/ENDFIX

FIX/ENDFIX 是任何计算脚本的基本构建块之一。要执行任何计算,您必须定义一个 FIX/ENDFIX 节,然后将实际业务计算放在该节中。

示例:假设“产品”是自定义维,您想要计算销售的电视机数量。可以使用以下语法:

FIX("Televisions")

"Units_Sold" = "LED_TVs" + "UHD_TVs";

ENDFIX

实际业务计算为:

"Units_Sold = "LED_TVs" + "UHD_TVs";,它计算销售的电视机数量。

注:

必须在每个计算语句的末尾放置一个分号,但 FIX 或 ENDFIX 末尾不必放置分号。

FIX/ENDFIX 节会限制各个维中参与计算的成员。在此示例中,只有 "Televisions" 参与计算。

还可以定义嵌套的 FIX,如下所示:

Essbase Nested 示例 1

上述计算还可以按如下方式编写:

Essbase Nested 示例 2

例如,@List 是一个 Essbase 函数。Essbase 提供了许多函数。但是,Financial Consolidation and Close 并不支持所有 Essbase 函数。有关支持的函数的列表,请参阅“Essbase 函数列表”部分。

Financial Consolidation and Close 维应用 FIX

Financial Consolidation and Close 应用程序可以包含 13 个维,具体取决于已启用的应用程序功能。在这 13 个可能的维中,不允许您对以下维应用 FIX,因为系统会在用户调用合并过程时自动对它们应用 FIX。

  • 方案

  • 年份

  • 期间

  • 视图

  • 实体

例如,假设您有以下语句:

Essbase Fix 示例 3

部署将失败,且系统会在作业控制台中记录包含相应信息的错误消息。

但是,这并不意味着您无法在脚本中使用这些维。通常,计算具有如下所示的语法:

Essbase Fix 示例 4

请注意,在 FIX 和“左侧”,不能使用“方案”、“年份”、“期间”、“实体”和“视图”维中的任何成员。而对于等式的“右侧”则没有该限制。

允许使用以下语法:

Essbase Fix 示例 5

对于其余八个维,如果您不对特定维应用 FIX,则系统会假定使用该维的所有成员。例如,假设您有以下语句:

Essbase Fix 示例 6

在此示例中,除了“帐户”之外,其余所有维都应用了 FIX。在这种情况下,Essbase 将在 FIX/ENDFIX 的计算中考虑“帐户”维的所有成员。

受限制的 Financial Consolidation and Close 成员

每个 Financial Consolidation and Close 服务中都有一些不能在计算脚本中使用或计算的系统成员。如果在计算中使用这些受限制的成员,验证或部署将失败,且系统会在作业控制台中记录错误消息。

请注意,如果没有为某个维指定任何成员,则系统会假定使用该维中的所有成员。但是,由于不允许将受限制的成员包含到流程中,因此您必须在 FIX 维语句或表达式的左侧明确排除这些受限制的成员。

下表完整列出了这些维中不允许使用的 Financial Consolidation and Close 成员。请注意,对于“货币”维与“合并”维,这些成员是否受限制取决于所使用的插入规则。请注意,每个植入的插入规则都在注释节提供了说明信息,指明可以将“货币”维与“合并”维的哪些成员包含到该规则中。

表 20-5 受限制的维成员

成员 表达式 左侧 表达式 右侧
方案 所有成员
年份 所有成员
期间 所有成员
视图 所有成员
实体 所有成员
帐户 FCCS_CSTATUS
  FCCS_CSTATUS FILTER
  外汇汇率 - 期末
  外汇汇率 - 平均值
  平均汇率
  期末汇率
  SrcAverageRate
  TgtAverageRate
  SrcEndingRate
  TgtEndingRate
  FCCS_Balance
  FCCS_CTA
  FCCS_CICTA
  FCCS_Percent Control
  FCCS_Current Ratio
  FCCS_Quick Ratio
  FCCS_Cash Ratio
  FCCS_Inventory Turnover
  FCCS_Asset Turnover
  FCCS_Days Sales In Receivables
  FCCS_Days Sales In Inventory
  FCCS_Gross Profit Margin
  FCCS_Return on Sales
  FCCS_Return on Equity
  FCCS_Debt to Equity Ratio
  FCCS_Debt Ratio
数据源 FCCS_System Types
  FCCS_Rate Override
  FCCS_Account Override
  FCCS_PCON
  FCCS_Driver Source
移动 FCCS_Opening Balance
  FCCS_OpeningBalance_Cash
  FCCS_FX_Total_NonCash
  FCCS_ClosingBalanceCash

对维的受限制成员以外的所有成员应用 FIX

一个很常见的用例是您需要对维的所有 0 级成员应用 FIX,而该维可能包含受限制的成员。以下示例显示了如何以最佳方式对该维的受限制成员以外的所有 0 级成员应用 FIX。

例如,“帐户”维包含的受限制成员最多。

下面是可用于对“帐户”维的受限制成员以外的所有 0 级成员应用 FIX 的计算脚本代码片段:

@REMOVE( @LEVMBRS( "Account", 0 ), @LIST( @RELATIVE( "FCCS_System Account", 0 ),@RELATIVE( "FCCS_Drivers", 0 ),@RELATIVE( "FCCS_Ratios", 0 ),@RELATIVE( "Exchange Rates", 0 ) ) )

对稀疏维与密集维应用 FIX

对稀疏维执行 FIX 更高效。在这种情况下,FIX 将使 Essbase 仅拉取 FIX 中定义的稀疏维成员组合使用的块并跳过其余块。

这些稀疏组合用作索引,供 Essbase 用于搜索并拉取与索引匹配的数据块以进行计算。因此,未拉取所有块供系统执行。

对密集维使用 FIX 时,密集成员在 Essbase 中的每个数据块中都存在。因此,如果使用不当,这将对性能产生影响。请注意,对密集维使用 FIX 时,Essbase 将拉取所有数据块,而不会限制块数,只会限制每个块中的某个部分。因此,可能需要多次遍历数据库才能返回信息。

例如,可以使用以下语句引用“帐户”维的 "Sales" 和 "PostSales":

Essbase Fix 示例 7

当系统处理针对 "Sales" 的第一个 fix 时,Essbase 将拉取“帐户”维的所有数据块,但只会处理一个 "Sales" 帐户。

稍后在针对 "PostSales" 的 FIX 语句中,Essbase 将再次拉取“帐户”维的所有数据块,但只会处理一个 "PostSales" 帐户。在这种情况下,获取这两个帐户遍历了两次数据库。

为防止出现性能问题,您可以不对“帐户”维使用 FIX,而对密集维使用 IF...THEN。

Essbase Fix 示例 8

在此示例中,如果不使用 FIX 语句,只需要遍历一次 Essbase 数据库。

为提高计算性能,建议您对稀疏维使用 FIX 并对密集维使用 IF..THEN。

成员块

成员块也称为计算块。有时,您会看到用于成员块的术语“锚点”。成员块的语法如下所示:

Essbase Member Block 示例 1

以下是成员块语句的示例:

Essbase Member Block 示例 2

在此示例中,"My Total Opening Balance" 称为计算块或锚点。只要可能,该成员应来自密集维。

在上述计算中,限定为成员 "My FX Opening",并对 FIX 语句中指定的成员执行计算。

请注意,当使用 IF 语句时,您需要一个成员块。不能在成员块外部编写 IF 语句。